今まで学んだ関数(func)、ループ(for)、条件分岐(if)を駆使してステージを攻略します。
最初にbyte君がいる方を手前、向いている方を奥とします。最初に突き当たりまで進むのをA区間、左の階段を降りて振り返ってから、また手前に戻るまでをB区間、さらに振り返って再び奥へ行くのをC区間と呼びましょう。
まずステップ1に指示されるcollectOrToggle()関数を作成します。名前の通り「宝石があれば取り、閉スイッチなら切り替える」関数です。2コマおきにどちらかが出現するのでその前進部分も含めてしまって「1区間を処理する」関数としてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//手前->奥または奥->手前の1列を処理する関数 func collectOrToggle { for i in 1 ... 2 { moveForward() moveForward() if isOnGem { collectGem() } else if isOnClosedSwitch { toggleSwitch() } } } //ここから本編 collectOrToggle() //A区間を処理 turnLeft() moveForward() moveForward() turnLeft() collectOrToggle() //B区間を処理 turnRight() moveForward() turnRight() collectOrToggle() //C区間を処理 |
6行目からのif文では「宝石があったら取る」と「閉スイッチなら切り替える」の2つの条件分岐をelse ifをつかって1つにまとめています。
6 7 8 9 10 |
if isOnGem { collectGem() } else if isOnClosedSwitch { toggleSwitch() } |
もちろん、↓のように2つの独立したif文にしても構いません。
6 7 8 9 10 11 |
if isOnGem { collectGem() } if isOnClosedSwitch { toggleSwitch() } |
ただこのステージでは1つのコマに宝石とスイッチが同時に出ることは多分なさそうなので、else ifにしておくと、宝石がでた時点でスイッチがあるかどうかの判断処理はしなくなり、ほんのちょっとだけ実行を速くできる可能性があります。