whileループ 2. whileループをじょうずに使う

見かけ上は3本道ですが、ワープでつながっているので実際は1本道のシンプルなステージです。
その先端までwhileループで進むための条件を考えてみましょう。
ポイントは、閉スイッチをオンにしていくことと、ゴールまで進むことを切り離して考えることです。まずはゴールまでいって止まることを考え、その途中でもし閉スイッチがあったらオンにしていく、という手順で考えてみましょう。

whileループ 1. 条件を決めてコードをループする

繰り返しに新しいコマンドが追加されます。あらかじめ決まった回数繰り返すforと違って、ある条件がtrueである間は繰り返す、というifとforを組み合わせたようなものです。

のように書きます。条件式はif文と同じで、trueかfalseのどちらかの結果になるisBlockedやisOnGemなどが入ります。もちろん前節で学んだ論理演算子、!、&&、||などを組み合わせることも可能です。

と書けば、まず行き止まりかどうか判定し、行き止まりであれば{}の処理を実行します。終わったらまたwhile文の最初に戻り、もう一度行き止まりかどうか判定します。つまり、この条件式は中身の処理を繰り返す間にいつかはfalseにならなければなりません。でなければwhileループが永遠に繰り返されて先に進まなくなるからです。例えば、

であれば、向きをかえている間にいつかは正面が行き止まりではなくなり、先へ進めることになります。
また最初から条件がfalseの場合は{}の中は一度も実行されずにスルーされる事も憶えておきましょう。

ステージはシンプルな一本道です。最後に開スイッチがあることは決まっていますが、その途中にある閉スイッチがいくつあるかは実行の度に変化するので、繰り返し回数を書かなければならないfor文は馴染みません。そこで、「ある条件がtrueの間繰り返す」while文の出番なわけです。この場合、「開スイッチに出くわすまではmoveForward()で進む」ということになります。言い換えれば、「開スイッチの上でない」がtrueになることが{}の中を実行する条件です。しかしisOnOpenSwitchは「開スイッチの上である」なので、trueとfalseを逆転させるNOT演算子(!)を活用しましょう。

whileループ 9. どんな方法でも

ワープゾーンや階段に惑わされがちですが、実際のコースは「真っ直ぐ進んで突き当たったら右に曲がる」というシンプルなものです。宝石がある場所を実質のゴールとして考えてよいでしょう。途中に閉スイッチと開スイッチが混在しているので、逐一調べて閉スイッチの場合のみtoggleSwitchで操作しましょう。
まずはスイッチはおいといて、目標の宝石まで到達するナビゲーション部分を作ります。前ステージのwhileループのネスト(入れ子)を思い出してください。
宝石まで到達できるようになったら、あとは各マスごとに「閉スイッチがあったら開ける」という条件処理を追加します。どこに入れたら良いでしょう?

whileループ 8.ランダムな四角形

ループを入れ子(ネスト)にする練習の続きです。ゴールまで進むという外側のループと、曲がり角まで前進するという内側のループで構成します。for文のように回数をあらかじめ指定するわけではないので、実行毎にステージの広さが変化しても対応できます。
課題文には「ネストしたループと条件を使って」とあるので、whileの代わりにif文を使っても良いでしょう。