Swift Playgrounds

コードを学ぼう2【宝石があちこちにランダムに】解答例と解説

宝石があちこちにランダムに

解答例

let totalGems = randomNumberOfGems
var gemCounter = 0

bluePortal.isActive = false
pinkPortal.isActive = false

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

解説

『型』の最後の問題です。難しいですね。
この解答例では、『==』をifの条件として使っているところがポイントです。
『==』は、『比較演算子』というのでしたね。
以前出てきた時は、宝石の数を比較するときなどに使ったと思います。

while gemCounter < 7{}

のような感じでした。
この『7』というのは整数、つまり『Int型』で表されています。
そして今回は『true』や『false』なので、『Bool型』ですね。
比較演算子を使ったブール型の場合でも、if文が使えるんでしたね。
ドット表記の構文が使われていても、同様に条件としてOKです。

ちょっとここで、比較演算子を復習しておきましょう。

より小さい (a < b)と書くと、aがbよりも小さい場合にtrue(真)
より大きい (a > b)と書くと、aがbよりも大きい場合にtrue(真)
等しい (a == b)と書くと、aとbが等しい場合にtrue(真)
等しくない (a != b)と書くと、aとbが等しくない場合にtrue(真)

行き止まりに到達するたびに
ブルーのワープがonの時、ブルーとピンクのワープをoff
ブルーのワープがoffの時、ブルーとピンクのワープをonにすると
全体をくまなく周ることができますね。

【その2】

let totalGems = randomNumberOfGems
var gemCounter = 0

while totalGems > gemCounter {
  moveForward()
  if isOnGem {
    collectGem()
    gemCounter += 1
  }
  if isBlocked {
    turnRight()
    turnRight()
    if pinkPortal.isActive == true {
        pinkPortal.isActive = false
    } else if pinkPortal.isActive == false {
        pinkPortal.isActive = true
    }      
    if bluePortal.isActive == true {
        bluePortal.isActive = false
    } else if bluePortal.isActive == false {
        bluePortal.isActive = true
    }
  }
}
要点まとめ

・ドット表記、比較演算子などを組み合わせて効果的なアルゴリズムを考えよう