1. 程式人生 > 其它 >android byte 比較_《零基礎學習Android開發》第三課 Java語言基礎2-1

android byte 比較_《零基礎學習Android開發》第三課 Java語言基礎2-1

技術標籤:android byte 比較

視訊:《零基礎學習Android開發》第三課 Java語言基礎2-1

一、增加程式邏輯的複雜性

  上一次課我們把一個21點撲克牌遊戲的核心演算法進行了實現,但是現在看來功能太簡單了,我們可以把演算法的邏輯複雜一些。我們增加這樣的需求:

  1. 模擬發牌的過程,就像牌是洗過的一樣。
  2. 玩家可以多次叫牌。
  3. 完善判斷輸贏邏輯,不僅是兩家比大小,還要不能大於21點。
  4. 豐富輸出資訊,把玩家最後點數進行顯示。

  為了實現以上需求,我們把原來程式碼的介面顯示之前的部分進行修改。我們把原來的程式碼刪掉,再敲如下的程式碼:

    int a = 0; // 玩家的牌    int b = 15; // 電腦的牌        do{        a += (int)(Math.random() * 13 + 1);   // 使用隨機函式模擬發牌    }while (a <= b);    // 簡單叫牌邏輯,只要比電腦小就叫牌        String text = "你手裡的牌是:" + a            + ",對家手裡的牌是:" + b;    if(a > b && a <= 21){   // 贏的要求是玩家牌比電腦大並且不大於21點        text += "。你贏了!";    }else{        text += "。你輸了!";    }

  這段程式碼把前面的需求就基本實現了,我們執行一下看看效果。

  我們看一下上面寫的這段程式碼。前面的兩個變數宣告我們都知道了。接下來我們用到了一個do...while迴圈,前面說到3大語句就剩迴圈沒講,這裡接觸了。大括號括起來的程式碼塊裡用的Math.random是Java提供的一個工具,呼叫它可以產生一個隨機數,數值範圍是大於等於0小於1的,因為撲克牌除去大小貓之外最大的點數是13,也就是K,我們用隨機數乘以13再加上1就能得到1到13中的一個數。這裡用到了一個“型別轉換”,因為隨機數本身是浮點數進行運算後得出的依然是浮點數,而牌的點數肯定是整數,我們就需要把浮點數強制轉換成整數。轉換的方式是直接舍掉小數部分而不是四捨五入。叫牌邏輯現在為了實現的簡單,就是隻有小於給定的點數15就一直叫牌。這裡同學們可以想到,如果手裡的牌小於15,叫牌的動作就會反覆進行,用術語的話,就叫做進入迴圈之中。

二、Java語言基礎(二 )

1. 迴圈語句

  同學們,我們在上次課裡知道了程式語言裡有3大語句:賦值、選擇與迴圈。這裡就對迴圈語句進行一個介紹。每當程式碼需要多次重複時,就要用到迴圈語句。迴圈語句有3種形式:do...while迴圈、while迴圈和for迴圈。前兩個形式很相似,我們在前面程式碼裡用的就是do...while迴圈,我們再看一次這個程式碼。

    do{        a += (int)(Math.random() * 13 + 1);   // 使用隨機函式模擬發牌    }while (a <= b);    // 簡單叫牌邏輯,只要比電腦小就叫牌

  這裡 do 之後用大括號括起來的是迴圈體,這個迴圈體會先被執行一遍,執行的過程中對變數 a 的值進行了改變。迴圈體執行完了之後在while後比較運算對 a 的值進行判斷,如果為true,則再次執行迴圈體,如果為false,則退出迴圈。while迴圈與之類似,上面一段程式碼改用while迴圈,則變成以下的樣子:

    a += (int)(Math.random() * 13 + 1);   // 使用隨機函式模擬發牌    while( a <= b){        a += (int)(Math.random() * 13 + 1);   // 使用隨機函式模擬發牌    }

  因為while迴圈是先判斷再決定是否迴圈,所以我們在這裡需要在前面先執行一遍。在這種情況下,自然用do...while迴圈比用while迴圈更簡潔。【同學們在使用迴圈語句的時候一定要記住,在迴圈體裡對要判斷的變數進行值的改變,這樣經過一定次數的重複之後,判斷條件會變成false。否則一直是true的話,就是一直迴圈下去,程式就卡住不動了,俗稱“爽死了”,也就是大家經常說的“死迴圈”。其實大家發現沒有,隨著計算機對社會的影響越來越大,很多行業術語也進入了人們的生活,被髮展出很多的引申含義,像剛才說的“死迴圈”,還有記憶體、宕機、重啟、解除安裝、迭代,還有386、486啊。大家可以留心一下生活中出現的計算機術語,也可以討論一下。】

  for迴圈與while迴圈類似,也是先進行條件的判斷再決定是否進行迴圈,但for迴圈的條件判斷部分要豐富很多,分為三個部分,包括迴圈判斷變數的宣告與初始化、迴圈條件判斷、迴圈判斷變數的改變。可參考如下示例:

    for(int i = 0; i < 10; i++){    // Do something    }

  可以看到for後面的括號裡用分號分開的3個部分,先是聲明瞭一個整數變數 i ,將其初始化為0,執行迴圈的條件是滿足 i < 10 的情況下,最後是在執行完迴圈體程式碼後,i 變數自增 1 再進行下一次比較。將它改寫成while迴圈,則是如下形式:

    int i = 0;    while(i < 10){        // Do something                i++;    }

  可以看到for迴圈要簡潔得多,其實for迴圈可以理解成對while迴圈某種常用模式的簡記法。大家也可以看到for迴圈特別方便實現指定次數的迴圈,像上面的程式碼就是執行10次迴圈。for迴圈的條件判斷部分可以包含不止一個迴圈判斷變數,比如下面這段程式碼:

    for(int i = 0, int j = 10; i < j; i++, j--){        // Do something    }

  這段程式碼的迴圈判斷部分就聲明瞭兩個變數,一個自增一個自減,當自增的變數等於或大於自減的變數時迴圈就會停止。要提醒同學們的是,在判斷條件部分宣告的變數,在迴圈體裡是可以使用的。

  迴圈語句的3種形式有很多靈活的使用方法,這裡就不一一列舉了,有興趣的同學可以自己找找相關資料拓展一下。

  在迴圈語句的迴圈體中可以使用兩條特殊的語句改變迴圈的執行,那就是continue和break。break前面講switch語句的時候我們接觸過,switch的每個分支的最後加上break語句就會跳出switch語句的程式碼塊,不再執行其後的剩餘程式碼。在迴圈語句中使用break語句作用類似,會跳出整個迴圈語句的程式碼塊,即使條件是符合的也不再進行迴圈。而continue語句則不同,它同樣不會繼續執行其後的程式碼,但是它會跳轉到判斷部分,如果符合迴圈條件則會進行下一次迴圈。break和coninue的使用可以大大豐富迴圈執行過程的能力,大家可以自己找找相關案例。這裡只給大家提一下。

【大家一定要記住學程式設計不需要提前儲備太多的理論知識,先把基本的知識點留個印象。最重要的是跟著多敲程式碼,如果課程裡給的示例沒理解就反覆刪掉多來幾次。這就是個熟能生巧的事!】

2. 型別轉換

  我們接著看迴圈體裡的語句,我們把用random產生的隨機數進行了強制型別轉換,把它從浮點數轉換成整數,這是因為random產生的數是浮點數。我們查一下JDK說明(https://docs.oracle.com/javase/8/docs/api/):

95fa063ef4f7ce913e12582cefeb2fd6.png

可以看到這裡產生的是一個double型別的浮點數,而這個浮點數雖然後面與整數相乘相加,卻不會自動變為整數,而是整數自動轉換成浮點數再進行運算。在基本型別中整型、浮點型、字元型資料可以混合運算。運算中,不同型別的資料先轉變為同一型別,然後進行運算,轉換從低階到高階,這就是自動型別轉換。Java語言基本型別自動型別轉換從低到高的排序為:

低----------------------------------------------------------->高

byte, short, char --> int --> long --> float --> double

  大家可以看到浮點數在型別轉換中的等級比整數要高。自動型別轉換在程式碼上不需要體現出來,因為是編譯系統自動進行的。但是如果要把高等級型別轉換成低等級型別,比如我們程式碼中用到的將double類一型的結果賦給int型別的變數,就要在程式碼上體現出來了。寫法就是前面加上括號括起來的要轉換成的型別,這裡是用(int)。在Android Studio中對強制型別轉換現在做了相容的處理,不再給出提示要求進行強制轉換了,但是我們要還知道低階型別與高階型別的區別。

  型別轉換還有一種重要的作用是用於“類”的型別轉換,這種用法實現了所謂的“多型”性,我們現在不講留到後面講類的時候再講解。

3. 字串

  我們繼續往下看程式碼。

 String text = "你手裡的牌是:" + a + ",對家手裡的牌是:" + b;

這裡的text是宣告的一個字串變數。前面在基本資料型別裡,我們學習了字元型別,但是一個字元型別變數只能儲存一個字元,如果要儲存一句完整的話,就要用到字串。同學們可以看到字串是用雙引號括起來的,這與字元型別的單引號是不同的。而且字串可以 + 號把多個字串連線起來成為一個字串。而在我們這條語句裡,細心的同學可能發現了a, b都是整數型變數,它也可以與字串相連。這是因為在編譯的時候,系統會自動將數字轉成對應的字元表達形式。這裡再多說一句,字串型別看起來和基本資料型別的用法是一樣的,像這裡將整數型變數與字串用 + 號連起來,看起來就像是一個混合型別運算的自動型別轉換,其實底層的機制是完全不一樣的,這是為了使用方便而提供的簡寫法。String實際上在Java中是以“類”的方式實現的,整數變數變成字元地串也是底層呼叫了對應的整型類的方法。關於類的知識我們會在後面講解。

  在使用字元型別與字串型別時有一個知識點大家要注意,就是轉義符。因為我們使用單引號或雙引號來括起字元,那麼字元的值正好是單引號或者雙引號該如何分別呢?這就是轉義符的用處了。在Java語言中的轉義符是“”反斜槓,轉義符常用的有以下幾種:

''' 用於char型別中表示單引號

""" 用於String型別中表示雙引號

用於表示斜槓

用於表示換行

還有一些轉義符的用法是表示退格、跳格、換頁等的控制元件符和製表符的,這對於現在的程式設計來說已經沒有什麼實際意義了,有更方便的方法來規定字串的格式。還有通過轉義符加八進位制、十六進位制數來表示特殊字元的,實際中也很少用到。這裡就不做介紹了。

【有的同學會有個疑問,怎麼區分正斜槓和反斜槓啊?這裡告訴大家一個小技巧:就是在鍵盤上,你的右手指容易夠著的那個是正斜槓,它跟?號在一起。費點勁才能夠著的是反斜槓,它在回車鍵的上面,跟豎槓在一起。大家看到這個豎槓想起了什麼吧?對,就是布林邏輯運算子的“或”。或是用的兩條豎槓,那麼一條豎槓是什麼呢?它也是一個運算子,叫“按位或”,屬於位運算子,是對變數的位即bit進行運算的。同樣的一個連線符&,叫“按位與”。位運算大家接觸到的可能性不大,我們就先不講了。還有一種區分方法就是,Java裡註釋用的是正斜槓,轉義符用的是反斜槓。】

4. 運算子優先順序

    if(a > b && a <= 21){   // 贏的要求是玩家牌比電腦大並且不大於21點        text += "。你贏了!";    }else{        text += "。你輸了!";    }

  這段程式碼裡的if語句的條件判斷部分 a > b && a <= 21 顯得比較複雜,其實把它加上括號就好理解了。(a >b) && (a <= 21)。就是判斷a小於b與a小於等於21是否同時成立。為了省事就可以把括號簡略,同學們練得多了也就會習慣了。這裡其實有一個運算子優先順序的原則,這個概念就是從數學裡擴充套件來的,同學們應該還記得在算式裡乘除法的優先順序是高於加減法,而且為了避免混亂就可以加括號,Java裡也是一樣的,只是程式語言裡的運算子更豐富。Java語言所有運算子優先順序按序排列如下所示:

1) . , [] , () 9)&

2) ++ , -- , ! , ~ , instanceof 10)^

3) new (type) 11) |

4) * , / , % 12)&&

5) + , - 13)||

6) >> , >>> , << 14)?:

7) > , < , >= , <= 15)= , += , -= , *= , /= , %= , ^=

8) == , != 16)&= , |= , <<= , >>= , >>>=

  這裡有很多運算子我們還沒有學到,這沒有關係後面陸續都會接觸。同學們也不用刻意去記這個表,我們又不考試,用多了自然就熟了。而且實際程式設計中要考慮優先順序的情況並不多,遇到了不記得我們可以現場查資料,實在不行我們還可以加括號啊!