7.2 While 循環(huán)

While 循環(huán)

有時我們不知道自己想循環(huán)多少次,而是希望當(dāng)某個條件達(dá)成時或某個檢驗失敗時,退出循環(huán)。這個時候就要用while循環(huán)了。Swift 提供了兩種while循環(huán):

  • do-while循環(huán)。用日常的語言解釋就是:反復(fù)做這件事,直到那件事失敗了。do-while總是首先執(zhí)行一遍代碼區(qū)域中的代碼,然后執(zhí)行條件語句,如果條件語句為false就退出,否則循環(huán)。
  • while 循環(huán)。whiledo-while有所不同,他會在執(zhí)行代碼區(qū)域前首先判斷條件語句,如果條件語句true那么才執(zhí)行代碼區(qū)域中的代碼,反復(fù)進行這個過程。

While

while循環(huán)的標(biāo)準(zhǔn)格式如下:

while 條件語句 {
  代碼區(qū)域
}

while循環(huán)首先執(zhí)行條件語句,如果該語句執(zhí)行的結(jié)果是true才會執(zhí)行代碼區(qū)域中的代碼,當(dāng)代碼執(zhí)行結(jié)束,回再次判斷條件語句,反復(fù)執(zhí)行該流程。與for循環(huán)一樣,條件語句必須返回一個布爾類型,非truefalse。
我們用小時候玩的一個蛇形棋的游戲來介紹while循環(huán)。蛇形棋有很多版本,我們現(xiàn)在玩一個最簡單的版本。棋盤是5x5見方的,我們從棋盤的左下角開始,按照蛇形的順序,在格子里填上數(shù)字,從1填到25。格子上除了有數(shù)字,還可能有梯子。梯子連接了兩個格子,并且梯子只能沿固定的方向爬。例如我們可以在第3號格子與第11號格子建搭建一個梯子,要求只能從3爬到11,而不能從11爬回來?,F(xiàn)在我們就可以玩了。玩法如下:

  1. 游戲開始時,你把一個代表你的塑料小人放在1號格子左側(cè)的桌面上,這是0號格子的位置;
  2. 如果你站在25號格子,或者除了0號格子以外的棋盤外,你就勝利了,否則執(zhí)行后面的步驟;
  3. 現(xiàn)在你擲骰子來獲取一個[1,6]之間的數(shù)字;
  4. 你沿著棋盤上數(shù)字增大的方向前進該數(shù)字個格子,例如你現(xiàn)在在0號格子,擲骰子的數(shù)字是6,那么就前進6步,停在6號格子上;如果現(xiàn)在在24號格子,前進6步,就停在30號格子上,即使這個格子在棋盤之外。
  5. 如果還在棋盤上,看看腳下有沒有梯子,如果有,就沿著他爬到連接的格子;
  6. 重復(fù)執(zhí)行第2步。

我們用 Swift 模擬一下這個游戲。在此之前,我們先改變一下擲骰子的方式。每次擲骰子不是隨機的數(shù)字,而是當(dāng)前的進行的回合數(shù)對6的余數(shù)加1,這樣可以保證每次的骰子數(shù)都是[1,6]中的一個,但不是隨機的。
我們用數(shù)組表示這個棋盤,數(shù)組一共有26個元素,其中0號格子在棋盤外面,而[1,25]都在棋盤上。數(shù)組元素都初始化為0。

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)

放置了梯子的格子對應(yīng)的元素值設(shè)置為沿該梯子攀爬時你需要前進或后退的格數(shù)(后退用負(fù)數(shù)表示)。
現(xiàn)在我們在這條蛇身上放置一些梯子。首先從3放一個到11的梯子,這意味著當(dāng)你的塑料小人站在第3號格子時,會爬到11號格子,也就是前進8步,所以給board[3]賦值為8:

board[3] = 8

然后再放置這些梯子:6->17,9->18,10->12,14->4,19->7,22->20,24->16

board[6] = 11
board[9] = 9
board[10] = 2
board[14] = -10
board[19] = -11
board[22] = -2
board[24] = -9

這樣我們用數(shù)組的下標(biāo)表示格子的編號,用數(shù)組元素的值表示梯子指向的格子?,F(xiàn)在可以開始玩了:

var square = 0
var turns = 0
while square < finalSquare {
  // 擲骰子
  var diceRoll = turns % 6 + 1
  // 前進骰子數(shù)個格子
  square += diceRoll
  if square < board.count {
    // 如果我們還在棋盤上,沿著梯子爬吧!
    square += board[square]
  }
  // 回合數(shù)增加1
  ++turns
}
println("You win after \(turns + 1) turns")

這段代碼會輸出

You win after 11 turns

Do-While

do-whilewhile不同,他總是先執(zhí)行一段代碼然后才判斷條件的合法性。
我們用do-while來玩蛇形棋的游戲

let finalSquare = 25
var board = Int[](count: finalSquare + 1, repeatedValue: 0)
board[3] = 8
board[6] = 11
board[9] = 9
board[10] = 2
board[14] = -10
board[19] = -11
board[22] = -2
board[24] = -9

var square = 0
var turns = 0
do {
  // 爬梯子
  square += board[square]
  // 擲骰子
  var diceRoll = turns % 6 + 1
  // 前進骰子數(shù)個格子,在這種寫法中
  square += diceRoll
  // 回合數(shù)增加1
  ++turns
} while square < finalSquare
println("You win after \(turns + 1) turns")

這次我們簡單修改了一下游戲的流程:

  1. 游戲開始時,你把一個代表你的塑料小人放在1號格子左側(cè)的桌面上,這是0號格子的位置;
  2. 現(xiàn)在檢查你腳下有沒有梯子,如果有梯子,就沿著他爬到連接的格子;
  3. 然后擲骰子,獲取[1,6]之間的一個數(shù)字;
  4. 沿著棋盤上數(shù)字增大的方向前進該數(shù)字個格子,例如你現(xiàn)在在0號格子,擲骰子的數(shù)字是6,那么就前進6步,停在6號格子上;如果現(xiàn)在在24號格子,前進6步,就停在30號格子上,即使這個格子在棋盤之外。
  5. 如果你站在第25號格子或棋盤外,你就勝利了,否則重復(fù)執(zhí)行第2步。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift 提供了類似 C 語言的流程控制結(jié)構(gòu),包括可以多次執(zhí)行任務(wù)的for和while循環(huán),基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 778評論 1 1
  • [The Swift Programming Language 中文版]本頁包含內(nèi)容: Swift提供了多種流程控...
    風(fēng)林山火閱讀 682評論 0 0
  • Swift提供了多種控制流聲明。包括while循環(huán)來多次執(zhí)行一個任務(wù);if,guard和switch聲明來根據(jù)確定...
    BoomLee閱讀 2,072評論 0 3
  • 快遞太多,快遞盒子無處安放?今天小編就教你如何變廢為寶,簡單實用,趕緊動手,跟著小編動起來吧! 1、拿出一個快遞盒...
    爸比親子課閱讀 733評論 0 0
  • 給家人: 親愛的,今天是端午節(jié)最后一天了,雖然離家的距離不近,路上我們要窩在汽車上長達(dá)5個小時,但是和青山綠水比較...
    日出東方天剛曉閱讀 255評論 0 2

友情鏈接更多精彩內(nèi)容