forループ編の最終問題だけあってパット見ややこしそうなステージです。
ただし落ち着いてじっくり眺めるとやはりパターンがあることがわかります。宝石はタイトルの通り4カ所に固まっています。その並びに共通性があることに注目してください。そうです。スタート地点から見て「┴」の形に並んでますね。そして右の方にいくとワープがあります。ワープを抜けた位置を新たなスタート位置と考えると、まったく対称の配置で宝石と次のワープが並んでいるんじゃないでしょうか?
また直近の┴に並んだ4つを取る中でもパターンがあります。そこは連続した繰り返しなのでfor文を作って解決してみました。こうするとまたちょっとコードを短くシンプルになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//4つの宝石を取り、次のワープゾーンへと進む関数 func get4gems() { //最初の3つまではL字の移動をパターンとして考えられる for i in 1 ... 3 { moveForward() turnRight() moveForward() collectGem() turnLeft() turnLeft() } //最後の一つ(真ん中)だけはパターンに収まらないのでforの外側で処理 moveForward() collectGem() //そのまま次のワープゾーン行き、次のスタート地点へ moveForward() moveForward() } //本編。get4gems()が上手に作れたので、それを呼ぶだけで済みました。 for i in 1 ... 4 { get4gems() } |
最初からなにもかもfor文やfunc文に押し込む必要はありません。最初はベタに1動作1行で書き下していってもいいでしょう。プログラムはまずは目的が達成できることが第一です。
そうして出来上がった後で、もし余裕があればパターンを探してfuncやforに置き換えていきましょう。段々慣れてくればコードを書く前からパターンが読み取れるようになるかも知れません。