Swift Playgrounds

コードを学ぼう2【値を増やす2】解答例と解説

値を増やす2

解答例

var gemCounter = 0

while !isBlocked {
  moveForward()
  if isOnGem {
    collectGem()
    gemCounter = gemCounter + 1
  } 
  if !isBlockedRight {
    turnRight()
  }
}

解説

なぜか前回と同じ課題名です。一応、【値を増やす2】としておきました。

前回と同じように、最初にgemCounterの初期値を0(ゼロ)と代入します。
今回はランダムに宝石が出てくるので、手動で数を足していく事ができません。
そこで、『変数名 = 変数名 + 1』として条件が終わるまでwhileループします。
行き止まりまで、もし宝石があれば取って、カウンターに1をプラスしていくわけです。
こうすると、全体数がわからなくてもゴール時点での数がわかります。

また、今回はwhileループの中に、ifを二つ置いてみました。
2つ目のifは、1つ目のifに影響されないことに注意してください。

例えば、もし2つ目の『if』を『else if』とした場合、
1つ目のifに当てはまらないことも条件の1つになってしまいます。
どういうことかというと、もし曲がり角に宝石があった場合、
ifでまず宝石を取る条件を実行し、それがtrueなので
次(else if)もたとえtrueだとしても、実行できずエラーになってしまうのです。
角に宝石がない場合はうまくいくこともありますが、
時々エラーになってしまうのはよくありません。
それを、『if』で新しく条件を作るとうまくいきます。
右側が行き止まりでない場合、(宝石があってもなくても)必ず右折する事ができるようになる、というわけです。

ヒントに書かれてある解答例は、以下になります。
何度も言ってゴメンなさい、ですが、答えは1つではありません
参考にして、わかりやすく簡潔なやり方を自分なりに工夫して編み出してください。

var gemCounter = 0

while !isBlocked {
  while !isBlocked {
    if isOnGem {
      collectGem()
      gemCounter = gemCounter + 1
    }
    moveForward()
  }
  turnRight()
}