ステージを作る 6. ループを作る

一見すると4カ所の隙間をふさいで長方形のステージにしてしまえば、あとは規定宝石数集めるまでグルグルまわればいい気がしますが、ワープがあるのでそうもいきません。
私は2箇所だけつないで、4ブロックが真っ直ぐ並ぶ島が4つ、という状態にしました。実はこれでワープを通ると長い一本道と同じことになるのです。あとは、そこをひたすら往復して宝石を集めていけばいつか必要数集めて終わることができます。つまりポイントは、「行き止まりになったら振り返る」「宝石があったら取る」「規定数宝石を集めるまで繰り返す」ということになります。

なお、集めなければならない宝石の数totalGemsはコードを実行する度に変化します。不完全なコードでも、totalGemsがたまたま2とか少ない数だと上手くクリアできてしいまう場合があります。何度か実行してどんな数になってもクリアできることを確認しましょう(その時々の集めないといけない数は実行した時に空の左上のところに出ます)。

ちなみにワープポータルの上にブロック置いて塞いでやれば冒頭に書いたように大きな長方形ステージにできるんじゃないかと思ったんですが、どうもワープポータルは積み上がったブロックの上に出現してしまうようですね。
また最初からあるワープポータルは呼び名がわからないので、.isActive = falseでオフにすることもできなそうです。

方向転換処理のところは、

とも書けるでしょう。ただし3つのif全てに isBlocked & がついているので、これを外側の大きなif文として囲ってネストにしています。こうすると、個々のif文の条件式が1項減って見やすくなる気がしませんか?また、今回は正面だけが行き止まりというパターンはないので、外側のif文で正面が行き止まり(isBlocked)を条件とした後、残る可能性は「両側行き止まり」「右が行き止まり」「左が行き止まり」だけになります。なので、最後はelse ifにする必要もなく、32行目はただのelseで済ますことができます。

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

“ステージを作る 6. ループを作る” への3件の返信

  1. var gemcount = 0
    let red = Expert()
    world.place(red, facing: .north, atColumn: 7, row: 1)

    let redpotal = Portal(color: #colorLiteral(red: 1.000382661819458, green: 0.22776752710342407, blue: 0.18664145469665527, alpha: 1.0))
    world.place(redpotal, atStartColumn: 2, startRow: 3, atEndColumn: 7, endRow: 3)

    world.place(Block(), atColumn: 3, row: 3)
    world.place(Block(), atColumn: 0, row: 2)

    while gemcount < totalGems {
    if red.isOnGem {
    red.collectGem()
    gemcount += 1
    } else if red.isBlocked {
    red.turnRight()
    }
    red.moveForward()
    }

  2. 「また最初からあるワープポータルは呼び名がわからないので、.isActive = falseでオフにすることもできなそうです。」
    と、おっしゃっておられますが、3つとも簡単にオフにしておいて、
    bluePortal.isActive = false
    greenPortal.isActive = false
    yellowPortal.isActive = false
    長方形ステージを作って、そこをぐるぐる回る一番簡単な方法は、可能です。しかし、これでは、全く面白くない。何のための3つのポータルなのか?貴方のCODINGが一番効果的かつシンプルだと思います。

  3. 初めまして。最近このアプリを始めた者です。
    いつもとても参考にさせていただいています。
    今回のはもう一つワープを作ってやれば4つの島を全く同じ形にでき、とてもシンプルになりました。
    参考までに載せさせていただきます。

    var getGems = 0
    let chara = Character()
    //赤色のワープを定義、設置
    let redPortal = Portal(color: #colorLiteral(red: 1.0, green: 0.1491314173, blue: 0.0, alpha: 1.0))
    world.place(redPortal, atStartColumn: 2, startRow: 3, atEndColumn: 7, endRow: 3)
    //ブロックを配置
    world.place(Block(), atColumn: 3, row: 3)
    world.place(Block(), atColumn: 0, row: 2)
    //キャラクターを配置
    world.place(chara, facing: south, atColumn: 7, row: 3)
    //宝石を集めながらワープまで歩きワープ後左向く
    func solveRow() {
    for i in 1 … 3 {
    if chara.isOnGem {
    chara.collectGem()
    getGems += 1
    }
    chara.moveForward()
    }
    chara.turnLeft()
    }
    //ここから行動開始
    while getGems < totalGems {
    solveRow()
    }

コメントを残す

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