條件式控制流(續)

除了while迴圈以外,還有另外兩種條件式控制,但不是迴圈的語法,可以依照條件式計算式的結果,決定程式運行的方向,它們分別是if條件語句和switch條件語句,條件語句的特色是它們並不重複的執行指令,而是依照情境的差異,決定執行不同的指令,它們的內容都只會執行一次。

if (條件A) {
    // 符合條件A時執行的程式碼
} else if (條件B) {
    // 符合條件B時執行的程式碼
} else if (條件C) {
    // 符合條件C時執行的程式碼
} 
...
...
else {
    // 不符合條件A、B、C時執行的程式碼
}

if語句和while的結構很像,不過它可以依照一種以上的不同情境,分別決定要執行怎樣的程式碼,每個條件語句後面各有各自的{}包裹的程式碼,由上而下執行到電腦認為某個條件為true時,就會進入執行這段程式碼,無視其他的程式碼。

switch語句和if有類似之處,差別在於switch後面的算式不必須是一個條件式計算式,而是會嘗試把某個物件和若干個狀態進行配對,並且根據第一個配對成功的結果,執行相應的程式碼,請打開本週的範例程式碼,看看我們的me物件右轉的部分:

mutating func 右轉() {
    switch 面向 {
        case 方向.北方:
            面向 = 方向.東方
            print("我從面向北方轉為面向東方")
        case 方向.東方:
            面向 = 方向.南方
            print("我從面向東方轉為面向南方")
        case 方向.南方:
            面向 = 方向.西方
            print("我從面向南方轉為面向西方")
        case 方向.西方:
            面向 = 方向.北方
            print("我從面向西方轉為面向北方")
        default:
            print("我面對的顯然不是一個合理的方向,右轉失敗")
    }
}

這段程式查找me物件的面向屬性,並且根據面對的方向不同,將之轉到對應的右轉方向,並且列印訊息通知使用者。最後,所有的switch條件語句中,若我們沒有把所有可能性都伴隨case列出,則最後都必定得加上default:,處理所有的case條件都不符合的情況,但if條件語句並不是一定得有else ifelse,在使用的時候需要特別留意。

學完了這麼多新的算式,是時候回來和我們的me物件玩耍了,現在我們新增一個變數體力來儲存me物件的剩餘體力,每走一步就讓體力減少1,直到體力變成0就走不動了,這邊先示範一段程式碼:

var 體力:Int = 10

while 體力 > 0 {
    if.座標.y >= 3 {         // 往北走太遠了,轉頭.右轉().右轉()
    } else if.座標.y <= -3 { // 往南走太遠了,轉頭.右轉().右轉()
    }.前進()
    體力 = 體力 - 1
}
// while 迴圈在此結束
print("走不動了...")

這段程式碼可以控制在南北方向上來回走,直到離原點的距離變成3或以上的時候,就轉頭,直到體力耗盡為止。大家可以試著把這段程式碼複製貼上到範例程式碼末端執行看看結果,也可以自行改動數值試試。

現在我們已經學會不少控制程式的方式了!試著完成看看這些任務(體力有多少可以自己設定):

  • 以螺旋狀遠離原點行走,直到體力耗盡為止。
  • 不斷地前進,如果離x軸或y軸的垂直距離超過3,就左轉,直到體力耗盡為止。
  • 鋸齒狀的往東北方前進(先往北一步、再往東一步的循環),直到體力耗盡為止。

results matching ""

    No results matching ""