❏ ⅵ while ループ


⒈ 条件を決めてコードをループする

whileループでは、ブール条件が当てはまってtrue(真)になる間は、条件が外れてfalse(偽)になるまでコードが繰り返し実行されます。
ブール条件を考え、whileブロックに、すべてのスイッチを入れるためのコマンドを追加します。

解答例

解説

while !isOnOpenSwitch {
    toggleSwitch()
    moveForward()
}
スイッチがついていない時のループ {
    スイッチを入れる
    前に進む
}

⒉ whileループをじょうずに使う

whileループの中で、if文を使って、スイッチが切れている場合にだけスイッチを切り替えるようにするためのコードを書きます。

解答例

解説

while !isBlocked {
       if isOnClosedSwitch {
           toggleSwitch()
       }
       moveForward()
}
行き止まりでない場合のループ {
     もし、切れてるスイッチの上に居たら {
         スイッチを入れる
     }
     前に進む
}

⒊ 正しいループを使う

宝石まで移動するためのパターンを見つけてコマンドの定義をし、ループでコマンドの実行をします。

解答例

解説

func turnAndCollectGem() {
       moveForward()
       turnLeft()
       moveForward()
       collectGem()
       turnRight()
}
while !isBlocked {
       turnAndCollectGem()
}
曲がる取る turnAndCollectGem()の定義 {
         前に進む
         左を向く
         前に進む
         宝石を取る
         右を向く
}
行き止まりでないなら {
         turnAndCollectGem()の実行
}

⒋ 2つのループ

解答例

分解し、パターンを見つけて定義し、2つのループをどのように使えばよいか考えます。

解答例

解説

func moveF3() {
       moveForward()
       moveForward()
       moveForward()
}
while !isBlocked {
       moveF3()
       if isOnClosedSwitch {
           toggleSwitch()
       }
       turnRight()
}
3歩進む moveF3() を定義 {
       前に進む
       前に進む
       前に進む
}
行き止まりで無い場合ループ {
       moveF3()の実行
       もし、切れたスイッチの上に居たら {
            スイッチを入れる
       }
       右を向く
}

⒌ 回る

宝石2個取るのを1パターンとして考え gem2() と定義し、forループで4回繰り返します。

解答例

解説

func gem2() {
       moveForward()
       collectGem()
       turnLeft()
       moveForward()
       collectGem()
       turnLeft()
       moveForward()
       turnRight()
}
for i in 1 ... 4 {
       gem2()
}
宝石2個取る gem2() の定義 {
        前に進む
        宝石を取る
        左を向く
        前に進む
        宝石を取る
        左を向く
        前に進む
        右を向く
}
4回の forループ {
        gem2 の実行
}

⒍ 方法はたくさん

1列ずつクリアして行く
NOT演算子 ( ! ) で行き止まら無い限りのループ ( while ) を作る。

解答例

解説

func solveColumn() {
        while !isBlocked {
            if isOnClosedSwitch {
                   toggleSwitch()
            } else if isOnGem {
                   collectGem ()
            }
            moveForward()
        }
 }
solveColumn()
turnRight()
moveForward()
turnRight()
solveColumn()
turnLeft()
moveForward()
turnRight()
solveColumn()
solveColumn() という名前の関数 {
   ブロックでない時のループ {
      もし、スイッチが閉じて居たら {
            スイッチを入れる
      } そうで無く もし、宝石の上に居たら {
                宝石を取る
      }
      前に進む
   }
}
solveColumn()の実行
右を向く
前に進む
右を向く
solveColumn()の実行
左を向く
前に進む
右を向く
solveColumn()の実行

⒎ ループをネストする

1 行き止まりになるまで内側のループを繰り返すように、外側のループに条件を追加します。
2 宝石を取れる地点まで進むように内側のループを調整します。
3 宝石のある地点に着いたら、宝石を取って左を向きます。
*ネストしたループを使うコードを書くときは、逆順で考えていく必要があります。

解答例

解説

while !isBlocked {
        while !isOnGem {
              moveForward()
       }
 collectGem()
 turnLeft()
}
行き止まりになるまで外側のループ {
    宝石を取れる地点まで進む内側のループ {
         前に進む
    }
宝石を取る
左を向く
}

⒏ ランダムな四角形

ネストしたループと条件を使って、ステージの大きさが変わっても使えるクリア方法を作り出します。

解答例

解説

while !isBlocked {
       while !isBlocked {
              moveForward()
       }
      turnRight()
}
toggleSwitch()
行き止まりでない場合 {
      行き止まりでない場合 {
            前に進む
      }
      右を向く
}
スイッチを入れる

⒐ どんな方法でも

whileループの最後の課題では、切れているスイッチをすべて入れて、宝石を取ります。
これまでに学んだことを活かして、クリアを目指してください。

解答例

解説

while !isonGem {
       while !isBlocked {
             moveForward()
             if isOnClosedSwitch {
                   toggleSwitch()              
             }
       }
       turnRight()
}
collectGem()
宝石の上でない時のループ {
       行き止まりでない時のループ {
            前に進む
            もし、スイッチが閉じていたら {
                 スイッチを入れる
            }
       }
       右を向く
}
宝石を取る

コメント