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)。while與do-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)一樣,條件語句必須返回一個布爾類型,非true即false。
我們用小時候玩的一個蛇形棋的游戲來介紹while循環(huán)。蛇形棋有很多版本,我們現(xiàn)在玩一個最簡單的版本。棋盤是5x5見方的,我們從棋盤的左下角開始,按照蛇形的順序,在格子里填上數(shù)字,從1填到25。格子上除了有數(shù)字,還可能有梯子。梯子連接了兩個格子,并且梯子只能沿固定的方向爬。例如我們可以在第3號格子與第11號格子建搭建一個梯子,要求只能從3爬到11,而不能從11爬回來?,F(xiàn)在我們就可以玩了。玩法如下:
- 游戲開始時,你把一個代表你的塑料小人放在1號格子左側(cè)的桌面上,這是0號格子的位置;
- 如果你站在25號格子,或者除了0號格子以外的棋盤外,你就勝利了,否則執(zhí)行后面的步驟;
- 現(xiàn)在你擲骰子來獲取一個[1,6]之間的數(shù)字;
- 你沿著棋盤上數(shù)字增大的方向前進該數(shù)字個格子,例如你現(xiàn)在在0號格子,擲骰子的數(shù)字是6,那么就前進6步,停在6號格子上;如果現(xiàn)在在24號格子,前進6步,就停在30號格子上,即使這個格子在棋盤之外。
- 如果還在棋盤上,看看腳下有沒有梯子,如果有,就沿著他爬到連接的格子;
- 重復(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-while與while不同,他總是先執(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號格子左側(cè)的桌面上,這是0號格子的位置;
- 現(xiàn)在檢查你腳下有沒有梯子,如果有梯子,就沿著他爬到連接的格子;
- 然后擲骰子,獲取[1,6]之間的一個數(shù)字;
- 沿著棋盤上數(shù)字增大的方向前進該數(shù)字個格子,例如你現(xiàn)在在0號格子,擲骰子的數(shù)字是6,那么就前進6步,停在6號格子上;如果現(xiàn)在在24號格子,前進6步,就停在30號格子上,即使這個格子在棋盤之外。
- 如果你站在第25號格子或棋盤外,你就勝利了,否則重復(fù)執(zhí)行第2步。