アルゴリズム 1. 右手法

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

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

今回のコードで、

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

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

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

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

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

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

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

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

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

アルゴリズム 4.どっちの手を使う?

このステージは独自のアルゴリズム(パターン)を見つけることが最初の課題です。私が見つけたものは、

  1. 閉スイッチのある場所で曲がる
  2. 行き止まりでは左に曲がる
  3. そうでない時は右に曲がる

というものです。マップは固定なので前に進むループはコマ数を数えてfor文で書いても良いですが、最後にだけ宝石があることを利用し、while文でそこまで進むようにするのが簡単でしょう。
コードにすると下記のようになります。

アルゴリズム 5.右に行くか、左に行くか

コードの最後に1つだけ開スイッチがあるので、そこに辿り着くことをゴールとしてそれまで(!isOnOpenSwitch)whileで繰り返すのを一番外側のループとします。

次に、行き止まりになったら適切な向きに方向を変えるブロックと、宝石やスイッチがあったら処理するブロックを分離するとスッキリするでしょう。

方向転換はステージをよく観察すると、行き止まりには4パターンあることがわかります。それぞれの条件で左右どちらに曲がればいいかは一定のルールが決まるので、それをif〜else if〜else if〜else ifで書いていきます。OR(||)を使って右に曲がる時と左に曲がる時の2パターンにまとめても良いでしょう。

各条件はelseでつなげるべきかは考えてみましょう。