型 4.隅々まで歩き回る

ワープのインスタンスはgreenPortalとorangePortalの2種類があります。
ステージからパッと見て取れるパターンとしては、宝石のゾーンとスイッチのゾーンが線対称になってる点で、片側をひとまとまりの関数にできるかも知れません。ただ左右が逆になると、turnLeftとturnRightの部分を入れ替えなければならないので大変そうです。
そこでもっと小さい単位の共通パターンに目を付けました。「右前にある宝石またはスイッチを処理する」というくくりです。「一歩前へ出て、右を向き、また一歩出て、そこにある宝石またはスイッチを処理」します。宝石/スイッチが4つ固まっているところではこれを4回、2つだけのところでは2回繰り返せば良さそうです。
宝石かスイッチかはif文で判別してそれぞれに適した処理をするよう関数の中に書いておけば、同じ関数で宝石とスイッチどちらにも対応できます。そうしておけば本編部分では宝石ゾーンなのかスイッチゾーンなのかは考えなくてもよくなり、ナビゲーション処理に集中できます。

このステージのナビゲーションはやや複雑で、色々な解き方が考えられます。以下はあくまで参考ですので、自分で良いと思う方法を考えてみてください。またこのステージの主旨はピンクとグリーンのワープを適切にオンオフすることなので、ナビゲーション周りであまり凝ったことをしなくても大丈夫でしょう。

改善希望!役に立った! (+9 rating, 11 votes)
読み込み中...

“型 4.隅々まで歩き回る” への2件の返信

  1. 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
    }
    }

    初学者です。私の回答はこちらになりましたが、プログラマー目線では読みにくかったりしますか?

    1. 私はプログラマーではないですがコメントを失礼します。
      内容を見た感じ右手法を使っているようですね。
      今回の繰り返しが多い場合にマッチしていますし、コードも簡潔で38行(スペース抜き)と短めになっており、プログラマー目線だとどうなのかはわかりませんが、主観的な意見としては感心しました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です