Swift Playgrounds

コードを学ぼう2【上げたり下げたり】解答例と解説

上げたり下げたり

解答例

let expert = Expert()
let character = Character()

func turnAround() {
  character.turnLeft()
  character.turnLeft()
}

func move2AndTurnRight() {
  character.move(distance: 2)
  character.turnRight()
}

for i in 1 ... 4 {
  expert.turnLock(up: true, numberOfTimes: 4)
  expert.turnRight()
}

move2AndTurnRight()
character.collectGem()
move2AndTurnRight()
character.collectGem()
character.moveForward()
character.moveForward()
move2AndTurnRight()
character.collectGem()
character.moveForward()

for i in 1 ... 4 {
  expert.turnLock(up: false, numberOfTimes: 3)
  expert.turnRight()
}

character.turnLeft()
character.moveForward()
character.collectGem()
turnAround()

for i in 1 ... 2 {
  move2AndTurnRight()
  move2AndTurnRight()
  character.collectGem()
  character.turnRight()
  move2AndTurnRight()
}

move2AndTurnRight()
character.collectGem()

解説

今回も、turnLock()move()のメソッドを使って、協力してゴールします。
turnLockは、ブール型のupと、Int型のnumberOfTimes
moveは、Int型のdistance(距離)を入力できましたよね。
エキスパートは、今回も何度も鍵を回さないといけないのですが
このメソッドを使うと回数を入力するだけでその通り動いてくれるので助かります。

この課題のクリア方法はたくさんあります。
私は初めてした時、画面を動かして角度を変えることができると知らなかったので
苦労しました。。
みなさんはぜひ、様々な角度から宝石の場所や高さを確認してみてください。

要点まとめ

・関数が呼び出された時の挙動に影響を与える引数を渡す方法に慣れよう

【解答例その2】

let expert = Expert()
let character = Character()

func turnAround() {
  character.turnLeft()
  character.turnLeft()
}

func collectGemTurnAround() {
  character.move(distance: 2)
  character.collectGem()
  turnAround()
  character.move(distance: 2)
  character.turnRight()
}

for i in 1 ... 4 {
  expert.turnLock(up: true, numberOfTimes: 4)
  expert.turnRight()
}

for i in 1 ... 3 {
  while !character.isOnGem {
    character.moveForward()
  }
  character.collectGem()
  character.turnRight()
}

character.moveForward()

for i in 1 ... 4 {
  expert.turnLock(up: false, numberOfTimes: 3)
  expert.turnRight()
}

character.turnLeft()
character.moveForward()
character.collectGem()
turnAround()

for i in 1 ... 3 {
  character.move(distance: 2)
  if !character.isOnGem {
    character.turnRight()
    collectGemTurnAround()
  } else {
    character.collectGem()
  }
}