[ クリア条件 ]
ステージ上にあるスイッチを4個オープン、ジェム4個を獲得
[ 使用するコマンド・条件式 ]
collectGem() moveForward() turnLeft() turnRight() toggleSwitch()
【攻略のポイント】柔軟な発想力が試される
「Creating a New Function」で実践したように、繰り返し行われる動作を関数で定義すると、コードをより簡潔にしてプログラム全体をシンプルで効率的な環境にすることができます。そこで今度のチャレンジは、もう少し複雑にジェムとスイッチをペアにしたオリジナルの関数を定義していきます。効率的な関数を作るにはどうすればいいのか、試してみるのにはうってつけのチャレンジとなるでしょう。
繰り返しのパターンを見つけよう
このステージ最大の攻略ポイントは「どこまでパターンを共通化できるか」というところです。まず気づくのが、1ブロック進んでジェムを獲得、スイッチをオープンして1ブロック進んで…というパターンが4カ所すべてにあることです。しかし、これにturnLeft()を加えればすべてOKかと思うと、そう甘いものではないのです。実は2番目のパターンでは次に進むためにもう1ブロック分moveForward()を実行しないと先に進めないという「ひっかけ問題」になっているのがこのチャレンジの特徴です。
一見正方形に見えるこのステージですが、実は横に長い4×5マス構成。観察力が試されています。
自分なりの「答え」を決める
この「ひっかけ」に対処する方法はまず「1ブロック進んでジェムを獲得、スイッチをオープンして1ブロック進む」までを関数で定義してturnLeft()と2番目のパターンだけmoveForward()を追加するという微調整的なアプローチが考えられます。もう1つは「1ブロック進んでジェムを獲得、スイッチをオープンして2ブロック進んでから左を向く」という関数を定義する方法です。この場合最初と3番目のパターンで行き止まりにぶつかってしまいますが、バイトは「先に進めない」というジェスチャをするだけで、次のturnLeft()をきちんとこなしてくれるため課題のクリアは可能です。いわばラーン・トゥ・コードで矛盾した行動を取ったときの対処動作を逆手に取った作戦ですが、このゲームのルールは「クリアできればやり方は問わない」を信条としていることを考えると、どちらの手法を「スマート」と評するかは個人の好み次第とも言えます。
行き止まりでむりやり先に進もうとすると、バイトは「先に進めない!」というジェスチャを返してきます。