コードの最後に1つだけ開スイッチがあるので、そこに辿り着くことをゴールとしてそれまで(!isOnOpenSwitch)whileで繰り返すのを一番外側のループとします。
次に、行き止まりになったら適切な向きに方向を変えるブロックと、宝石やスイッチがあったら処理するブロックを分離するとスッキリするでしょう。
方向転換はステージをよく観察すると、行き止まりには4パターンあることがわかります。それぞれの条件で左右どちらに曲がればいいかは一定のルールが決まるので、それをif〜else if〜else if〜else ifで書いていきます。OR(||)を使って右に曲がる時と左に曲がる時の2パターンにまとめても良いでしょう。
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 |
//コメント //ステージに1つだけある開スイッチをゴールとする while !isOnOpenSwitch { //方向転換に関する処理 //そもそも向きを変える必要があるのは行き止まりの時だけ if isBlocked { //(行き止まりかつ)宝石があれば右を向く if isOnGem { turnRight() //(行き止まりかつ)閉スイッチ上なら左を向く } else if isOnClosedSwitch { turnLeft() //(行き止まりかつ)右が行き止まりなら左を向く } else if isBlockedRight { turnLeft() //(行き止まりかつ)左が行き止まりなら右を向く } else if isBlockedLeft { turnRight() } } //行き止まりでなければ、以下へ //宝石とスイッチに関する処理(そのマスにあれば処理する) if isOnGem { collectGem() } else if isOnClosedSwitch { toggleSwitch() } //前に進む moveForward() } |
各条件はelseでつなげるべきかは考えてみましょう。
このステージの方向判断は2つのパターンだけです、こうするとより書きやすいと思います
func naviGate(){
if isBlocked && isBlockedLeft{
turnRight()
} else if isBlocked {
turnLeft()
}
}
while !isOnOpenSwitch{
naviGate()
if isOnGem{
collectGem()
} else if isOnClosedSwitch{
toggleSwitch()
}
moveForward()
}
簡潔で分かりやすくコード構成の参考になりました