条件分岐コードの最終課題ステージです。
まず一件複雑そうなステージからパターンを探しましょう。中央の道は途中宝石と開/閉両方のスイッチが並んでいます。まずは枝道を無視して、この中央の道をif文でチェックしながら反対側の端まで進むコードを書いてみるといいでしょう。
それができたらあらためて残りの脇道について考えます。どうも右は右、左は左でパターンがあります。そして中央の道から左右どちらに脇道が生えているかもそのコマにあるものと関連付いているようですよ?
連続で進んだり、振り返ったりが多いステージなので、そこも関数にして簡単に一括処理できるようにしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
//3歩進む関数 func move3() { for i in 1 ... 3 { moveForward() } } //振り返る関数 func turnBack() { turnRight() turnRight() } //右の脇道を処理して戻る関数 func solveRightSide() { turnRight() move3() turnLeft() moveForward() collectGem() turnBack() moveForward() turnRight() move3() turnRight() } //左の脇道を処理して戻る関数 func solvedLeftSide() { turnLeft() moveForward() collectGem() turnBack() moveForward() turnLeft() } //ここから本編 for i in 1 ... 5 { moveForward() if isOnGem { collectGem() solveRightSide() //右の脇道へ行く } else if isOnClosedSwitch { toggleSwitch() solvedLeftSide() //左の脇道へ行く } } |
ありがとうございます。なんとかのサイトのおかげで解くことができました。
質問なのですが、関数solveRightside の中でGemを取っているときはif文の条件は関係ないのでしょうか?
脇道のGemに反応しない仕組みがよく分かっていません
こんにちは。質問に気付かずお返事が遅くなってすみません。
問題文にある「条件分岐コードを使って、キャラクターが宝石の上にいるのか、切れているスイッチの上にいるのかを確かめて」というのは、スタート地点から真っ直ぐのメインストリートに関するものですね。上に書いた「パターン」というのが、
・宝石がある時は右にL字の脇道
・切れたスイッチがある時はすぐ左に宝石
というものです。それを「//ここから本番」というブロックの中にあるif文で分岐しています。
その中でsolveRightSide()やsolveLeft()といった関数を呼び出し、その中で、L字の脇道にある宝石を取って戻る(solveRightSide())、すぐ左の宝石をとって戻る(solveLeftSide())という決まった処理を行っています。脇道の処理はsolveRightSide()の中でやっているので、そこで関数の外のif文が反応することはありません。
コードのどの行がキャラクターのどの動きに対応しているかは、実行ボタンの脇にあるメーターボタンからステップ実行を選んで見比べながら確認するといいですよ。