型 5.宝石があちこちにランダムに

宝石は毎回どこに出現するか予測不可能なので、whileループで目標としては利用しづらいです。なので、今回は多少無駄に行きすぎることもありますが、「行き止まりまで進み」かつ「途中に宝石を見つけたら回収しておく」というスタンスにしました。

スイッチにはtoggleSwitch()という関数があり、オンならオフに、オフならオンにと現在の状態と逆の状態に自動でできて便利でした。なのでワープについても同じようなことができる関数を自作してみました。それがtoggleBluePortal()とtogglePinkPortal()です。

このステージの課題文の後半に、「単に規定数の宝石を集めるだけでなく、関数にまとめるなどしてコードを上手に書こう」的なことが書かれています。本編の繰り返し部分がたったの三行、それも自分で用意した関数三つを呼び出すだけ、で済んでしまったのはなかなかに模範解答じゃないかと思いますが、プログラミングの正解はひとつではないので、単にマネして打ち込むだけでなく、自分なりにパターンを見つけることに挑戦してみてください。

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

“型 5.宝石があちこちにランダムに” への4件の返信

  1. プログラミング初学者です。
    参考になるサイトを制作いただきありがとうございます。

    ところでこのステージのコードすごいです。
    最初はなんとか自力でクリアしたのですが、コードがかなり長くなってしまいました。

    ・ワープをトグルにしてしまう
    ・「端までいってワープのオンオフを切り替える」をループするだけでステージを全て回れるというシンプルな構造

    この2つがとても自力では思いつきそうにない発想なのですが、この発想力は経験を積んで身につくものでしょうか?

  2. //参考になります。私も最近はまって作ってみました。楽しいです。

    let totalGems = randomNumberOfGems
    var nOGem = 0
    var nTurn = 0

    func check() {
    while !isBlocked {
    moveForward()
    if isOnGem {
    collectGem()
    nOGem += 1
    }
    }
    turnLeft()
    turnLeft()
    nTurn += 1
    }

    while nOGem < totalGems {
    if nTurn == 1 || nTurn == 3 {
    pinkPortal.isActive = true
    } else {
    pinkPortal.isActive = false
    }
    if nTurn == 4 {
    bluePortal.isActive = true
    } else {
    bluePortal.isActive = false
    }
    check()
    }

  3. 短めに書けたと思うので、これからご覧になる方の参考になれば!

    let totalGems = randomNumberOfGems

    func Gem() {
    while !isBlocked{
    if isOnGem{
    collectGem()
    }
    moveForward()
    }
    turnRight()
    turnRight()
    }

    pinkPortal.isActive = false
    bluePortal.isActive = false
    Gem()
    Gem()
    bluePortal.isActive = true
    Gem()
    bluePortal.isActive = false
    Gem()
    bluePortal.isActive = true
    pinkPortal.isActive = true
    Gem()
    pinkPortal.isActive = false
    Gem()

  4. 折り返す度に両ワープのオンオフ切り替えた方がシンプルでわかりやすい

    let totalGems = randomNumberOfGems
    var gemCounter = 0

    while gemCounter < totalGems {
    moveForward()
    if isOnGem {
    collectGem()
    gemCounter += 1
    }
    if isBlocked && bluePortal.isActive == true {
    turnLeft()
    turnLeft()
    bluePortal.isActive = false
    pinkPortal.isActive = false
    } else if isBlocked && bluePortal.isActive == false {
    turnLeft()
    turnLeft()
    bluePortal.isActive = true
    pinkPortal.isActive = true
    }
    }

コメントを残す

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