ワープのインスタンスはgreenPortalとorangePortalの2種類があります。
ステージからパッと見て取れるパターンとしては、宝石のゾーンとスイッチのゾーンが線対称になってる点で、片側をひとまとまりの関数にできるかも知れません。ただ左右が逆になると、turnLeftとturnRightの部分を入れ替えなければならないので大変そうです。
そこでもっと小さい単位の共通パターンに目を付けました。「右前にある宝石またはスイッチを処理する」というくくりです。「一歩前へ出て、右を向き、また一歩出て、そこにある宝石またはスイッチを処理」します。宝石/スイッチが4つ固まっているところではこれを4回、2つだけのところでは2回繰り返せば良さそうです。
宝石かスイッチかは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 46 47 48 49 |
//関数の事前準備 func 右の前の宝石とスイッチを処理() { //右前に移動 moveForward() turnRight() moveForward() //そこにあるのが宝石でもスイッチでも適切に処理できるようにしておく if isOnGem { collectGem() } else if isOnClosedSwitch { toggleSwitch() } //振り返る turnRight() turnRight() } //ここからが本編 //まずスイッチが2個あるエリアを処理 orangePortal.isActive = false turnRight() moveForward() for i in 1 ... 2 { 右の前の宝石とスイッチを処理() } //オレンジワープをオンに戻して、宝石が4つあるゾーンに移動 orangePortal.isActive = true 右の前の宝石とスイッチを処理() orangePortal.isActive = false for i in 1 ... 3 { 右の前の宝石とスイッチを処理() } //宝石が2つあるゾーンに移動 moveForward() turnLeft() moveForward() moveForward() greenPortal.isActive = false for i in 1 ... 2 { 右の前の宝石とスイッチを処理() } //スイッチが4つあるゾーンに移動 greenPortal.isActive = true 右の前の宝石とスイッチを処理() greenPortal.isActive = false for i in 1 ... 3 { 右の前の宝石とスイッチを処理() } |
func mv() {
if isBlocked && isBlockedRight {
turnLeft()
}else if isBlockedRight {
moveForward()
}else {
turnRight()
moveForward()
}
}
greenPortal.isActive = false
orangePortal.isActive = false
while gemCounter != 6 {
mv()
if isOnGem {
collectGem()
gemCounter += 1
}else if isOnClosedSwitch {
toggleSwitch()
switechCounter += 1
}
}
greenPortal.isActive = true
while switechCounter != 3 {
mv()
if isOnClosedSwitch {
toggleSwitch()
switechCounter += 1
}
}
greenPortal.isActive = false
while switechCounter != 6 {
mv()
if isOnClosedSwitch {
toggleSwitch()
switechCounter += 1
}
}
初学者です。私の回答はこちらになりましたが、プログラマー目線では読みにくかったりしますか?
私はプログラマーではないですがコメントを失礼します。
内容を見た感じ右手法を使っているようですね。
今回の繰り返しが多い場合にマッチしていますし、コードも簡潔で38行(スペース抜き)と短めになっており、プログラマー目線だとどうなのかはわかりませんが、主観的な意見としては感心しました。