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

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

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

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

アルゴリズム 1. 右手法

このステージは日本語の疑似コードでほぼ答えが書いてありますので、ここまで学んだ記法を駆使してコードに落とし込んでください。

アルゴリズムという耳慣れない言葉が出てきますが、ここではあまり深く考えなくて大丈夫です。ある共通の処理ルール(こういう時はこうする)を組み合わせたもの位に考えておいてください。たいていはfunc文を使って名前をつけて(今回はnavigateAroundWall)おき、繰り返し、あるいはあちこちから簡単に呼び出して利用できるように準備しておきます。

今回のコードで、

  • 右側が壁だったら(isBlockedRight)前進(moveForward)
  • それ以外の(右が壁じゃない)時は右へ進む

という処理ルールを定義しておくことで、プログラムを実行する度にステージの壁の形が変化しても柔軟に対応でき、都度コードを書き換えることなくクリアできました。こういう使い回しが聞く処理パターン(の集まり)をアルゴリズムと呼びます。プログラミングの世界では、このように1つのコードで様々な状況に対応できるようにすること(汎用化)が腕の見せ所です。

アルゴリズム 2.アルゴリズムを直す

右手法というアルゴリズムの考え方自体は問題文に書かれています。これはプログラミング関係なく古くからある迷路攻略法で、「どちらかの壁(この場合は右)に触れたまま進むとどんな迷路でもいつかは出られる」というものです。本筋とは関係ないので、そういうものだと思って下さい。Playgroundsでは本当に壁に手を付けるわけではないのでピンと来づらいですが、ともあれ右側に壁に沿って進むというイメージです。考え方は説明図にある3パターンに落とし込んでくれていますので、その条件と処理内容をif文を組み合わせてコードにしていきます。

アルゴリズムを組み込んだfunc文が完成したら、それを呼び出すループを作ります。宝石回収は一旦おいておいて、右手法を使って最後まで進むように作ってみてください。コースの最後に閉スイッチがあることに着目し、それをゴール(到達条件)としたwhile文が良いでしょう。

きちんと閉スイッチまで辿り着けるようになったらナビゲーション処理は完成です。途中でもし宝石があったらゲットする処理を追加しましょう。

経路がやや無駄な気もしますが、右手法とはそういうものなので問題ありません。

アルゴリズム 3.迷路を解く

右手法のアルゴリズム自体は前ステージのものを流用できます。ルートの最後に宝石があるので、それをゴールにする形でループを組みましょう。