ステージの長さが毎回変化するので、まずは毎回端まで進むようなループを考えます。
次に真正面に進む間、各コマにスイッチ(開または閉)があり、右側に必ず宝石、その向こうにスイッチが必ず存在します。左端と右端のスイッチは反対になっているようです。
ここもタイトル通りたくさんのやり方が考えられます。
以下の例では、
スイッチの開閉をあまり意識しないで済むよう、「閉ならオンにする」という関数switchOn()を作成し、開閉どちらでもスイッチがあればswitchOnを呼び出す、というコードにしました。ループの中では、メインストリートのスイッチを処理、右の宝石とゲット、さらに向こうのスイッチを処理、戻る、という処理を連続して行っていますが、スイッチの部分に関してはswitchOn()を呼び出すだけにできるので、ループ内の見通しが良くなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//スイッチがオフならオンにする(オンならスルー)関数 func switchOn() { if isOnClosedSwitch { toggleSwitch() } } while !isBlocked { moveForward() if isOnClosedSwitch || isOnOpenSwitch { switchOn() //スイッチがあるところでとりあえず呼んでおけば、あとはおまかせ turnRight() moveForward() collectGem() moveForward() switchOn() //スイッチがあるところでとりあえず呼んでおけば、あとはおまかせ turnLeft() turnLeft() moveForward() moveForward() turnRight() } } |
もう少し無駄のないコードにするとしたら、「そもそもメインストリート上のスイッチが閉だった場合、そこをオンにすれば、反対側のスイッチまでは行く必要がなく、宝石だけとって戻ればいい」という考え方があります。是非チャレンジしてみてください。メインストリート上のスイッチが閉か開から別々の処理に分岐するか別々の関数を呼び出すのです。