iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0

今天是第12天了,在這個鐵人賽裡已經完成3分之1了,每天要PO文的狀態,讓我最近回家都很準時睡覺,可能順便改善了作息呢,一舉數得。
今天要來介紹 while 這個控制流的語法。

同時循環(While Loops)

while 是一個路一值運行到條件變成 false,才會停下的語法。有兩種可使用的 while 方法。

  • while 在每次通過循環的 開始 時評估其條件。
  • repeat-while 在每次循環 結束 時評估其條件。

while

while循環通過評估單個條件開始。如果條件為true,則重複執行一組語句,直到條件變為false。

以下是while循環的一般形式:

while condition {
    statements
}

此示例播放了蛇和梯子(也稱為滑道和梯子)的簡單遊戲:

要做的功能 遊戲規則:

  • 木板有25個正方形,目標是在25個正方形上或超出正方形。
  • 玩家的起始方塊為"零零",剛好在棋盤的左下角。
  • 每轉一圈,您會滾動一個六邊形的骰子,並按照上面虛線箭頭指示的水平路徑移動該正方形數。
  • 如果您的轉彎在梯子的底部結束,請向上移動該梯子。
  • 如果您的回合結束於蛇的頭,則將其向下移動。

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

board[03]= +08; board[06]= +11; board[09]= +09; board[10]= +02
board[14]= -10; board[19]= -11; board[22]= -02; board[24]= -08

var square=0
var diceRoll=0
while square < finalSquare {
    // roll the dice
    diceRoll += 1
    if diceRoll == 7 { diceRoll=1 }
    // move by the rolled amount
    square += diceRoll
    if square < board.count {
        // if we&#39;re still on the board, move up or down for a snake or a ladder
        square += board[square]
    }
}
print("Game over!")

前兩行在做第一個的設定,而為什麼 borad 裡面 count 要 +1 呢?因為從 0 開始所以才要加 1 進去。

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

然後,第5 6行在做圖面上採到的數值增減。而這邊有用上一元加跟減的運算符,來顯示數值增減,並且把小於10的數值補上 0 來讓程式碼看起來更整潔。

board[03]= +08; board[06]= +11; board[09]= +09; board[10]= +02
board[14]= -10; board[19]= -11; board[22]= -02; board[24]= -08

然後接下來就是他的機制了,square 就是位置的值,diceRoll 去操控他移動的數值,diceRoll的移動數值是固定順序 1, 2, 3, 4, 5, 6, 1, 2 依此類推。
而 square 小於 board.count 就是還在圖板上,所以還在圖板上的話我們就去看有沒有對應到剛剛 5 6行在做的特定數值,再進行增加。
最後如果大於 finalSquare 就遊戲結束。

var square=0
var diceRoll=0
while square < finalSquare {
    // 擲骰子
    diceRoll += 1
    if diceRoll == 7 { diceRoll=1 }
    // 根據點數移動
    square += diceRoll
    if square < board.count {
        // 如果還在棋盤上就看有沒有要順著爬上去或下來。
        square += board[square]
    }
}
print("Game over!")

Repeat-While

repeat-while 跟前面的區別是先執行一次循環之後再判別狀態是不是 false

repeat-while的格式

repeat {
    statements
} while condition

接續上面的遊戲,如果使用 repeat-while的話方式會變成下面這樣

let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
//原本的設定


repeat {
    // 顺着梯子爬上去或者顺着蛇滑下去
    square += board[square]
    // 掷骰子
    diceRoll += 1
    if diceRoll == 7 { diceRoll = 1 }
    // 根据点数移动
    square += diceRoll
} while square < finalSquare
print("Game over!")

檢測完玩家是否踩在梯子或者蛇上之後,開始擲骰子,然後玩家向前移動 diceRoll 個方格,本輪循環結束。
然後就會繼續循環直到 square 大於 finalSquare

這兩個的方法版本 repeat-while 的版本比較好,因為它可以先檢查 square 有沒有超過 board 這樣就可以省略越界的檢查(下面這個)。

if square < board.count {
    square += board[square]
}

好的,今天就先介紹到這邊,讓我們休息明天繼續。


上一篇
30天的 iOS 修仙道路 (11)
下一篇
30天的 iOS 修仙道路 (13)
系列文
30天的 iOS 修仙道路 站穩腳步基礎篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言