Swift Playgrounds

コードを学ぼう1【どんな方法でも】解答例と解説

どんな方法でも

解答例

while !isOnGem {
  while !isBlocked {
    moveForward()
    if isOnClosedSwitch {
      toggleSwitch()
    }
  }
  turnRight()
}

collectGem()

解説

前回同様、『宝石の上に到着するまで実行』するループを考えます。
while !isOnGem』とすればいいですね。
そして、宝石の上に来たら、collectGem()でゴールです。
ワープもあってややこしいですが、よく見たら右折しかないのが分かります。
行き止まりになるまで実行』するwhileループを、先ほどのループの中に設置します。
スイッチはonとoffが入り混じっているため、ifで確認しながら進みます。
while !isBlocked {//行き止まりではない場合に実行されるコード}から外れると、
turnRight()し、宝石があるところまでそれを繰り返します。

また、少し応用して、ゴールの条件を『行き止まり、かつ、右側も行き止まり』にしてみました。
AND演算子(&&)を使うと、設置できますね。
!を使っているので、『行き止まりではなくて、右側も行き止まりではない場合』に実行されます。

while !isBlocked && !isBlockedRight {
  while !isBlocked {
    moveForward()
    if isOnClosedSwitch {
      toggleSwitch()
    } else if isOnGem {
      collectGem()
    }
  }
  turnRight()
}

曲がり角は、いつも右側に行けるわけですから、
前も右も行き止まり』を条件にすると、本当の行き止まりまで行ってストップとなります。
大枠のwhileループの中身は、『行き止まりまで実行』されるwhileループで、
スイッチの切り替えと宝石を調べながら進みます。
whileループと条件分岐の合わせ技は、使い道がグッと広がりますね。

要点まとめ

・whileループをネストすると、大きな条件と小さな条件をまとめてコーディングすることができる