繰り返しに新しいコマンドが追加されます。あらかじめ決まった回数繰り返すforと違って、ある条件がtrueである間は繰り返す、というifとforを組み合わせたようなものです。
1 2 3 4 |
while (条件) { //条件がtrueのあいだ繰り返す処理 } //while文に戻って条件の評価をやり直す //条件がfalseだったら以降を処理 |
のように書きます。条件式はif文と同じで、trueかfalseのどちらかの結果になるisBlockedやisOnGemなどが入ります。もちろん前節で学んだ論理演算子、!、&&、||などを組み合わせることも可能です。
1 2 3 |
while isBlocked { //前が行き止まりの間は繰り返す処理 } |
と書けば、まず行き止まりかどうか判定し、行き止まりであれば{}の処理を実行します。終わったらまたwhile文の最初に戻り、もう一度行き止まりかどうか判定します。つまり、この条件式は中身の処理を繰り返す間にいつかはfalseにならなければなりません。でなければwhileループが永遠に繰り返されて先に進まなくなるからです。例えば、
1 2 3 4 |
while isBlocked { turnLeft() //前が行き止まりだったら左を向く } moveForward() //左に向きを換えてる間に前が行き止まりでなくなったら実行 |
であれば、向きをかえている間にいつかは正面が行き止まりではなくなり、先へ進めることになります。
また最初から条件がfalseの場合は{}の中は一度も実行されずにスルーされる事も憶えておきましょう。
ステージはシンプルな一本道です。最後に開スイッチがあることは決まっていますが、その途中にある閉スイッチがいくつあるかは実行の度に変化するので、繰り返し回数を書かなければならないfor文は馴染みません。そこで、「ある条件がtrueの間繰り返す」while文の出番なわけです。この場合、「開スイッチに出くわすまではmoveForward()で進む」ということになります。言い換えれば、「開スイッチの上でない」がtrueになることが{}の中を実行する条件です。しかしisOnOpenSwitchは「開スイッチの上である」なので、trueとfalseを逆転させるNOT演算子(!)を活用しましょう。
1 2 3 4 5 6 |
while !isOnOpenSwitch { if isOnClosedSwitch { toggleSwitch() } moveForward() } |