Swift Playgrounds

コードを学ぼう2【2つの山】解答例と解説

2つの山

解答例

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

world.place(expert, facing: north, atColumn: 0, row: 4)
world.place(character, facing: north, atColumn: 2, row: 0)

var gemCounter = 0

func solveSide() {
  for i in 1 ... 6 {
    if character.isOnGem {
      character.collectGem()
      gemCounter += 1
    }
    character.jump()
  }
}

func solveRow() {
  while !character.isBlocked {
    if character.isOnGem {
      character.collectGem()
      gemCounter += 1
    }
    character.moveForward()
  }
}

expert.turnLockUp()

while gemCounter < totalGems {
  solveSide()
  character.turnRight()
  character.moveForward()
  character.turnRight()
  solveRow()
  character.turnLeft()
  character.moveForward()
  character.turnLeft()
  solveSide()
  character.turnRight()
  character.turnRight()
}

解説

まずは、前回と同じように各キャラクターの座標を調べて、配置します。
ランダムに宝石が出てくるので、最終的な条件は
while gemCounter < totalGems {}
を置かないといけません。
そのために、var gemCounter = 0として、初期値をゼロにしておきます。

さて、キャラクターはジャンプできますが、『行き止まりまでジャンプ』という指定はできないようです。
ぶつかってしまうからでしょうか。
なので、両サイドは6マスあるのでforループを使い、宝石を取りながらジャンプで進む、としました。
真ん中の列もそうですが、宝石を取った後に
gemCounter += 1として、
宝石カウンターの数を毎回数えていくことを忘れないでください。

要点まとめ

・今まで習ったことを全て使って取り組んでみよう

真ん中の列は、両端しか宝石が出ないので、このようなやり方もあります。

解答例その2

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

world.place(expert, facing: north, atColumn: 0, row: 4)
world.place(character, facing: north, atColumn: 2, row: 0)

var gemCounter = 0
var platformPosition = 0

func jumpAcrossSide() {
  for i in 1 ... 6 {
    if character.isOnGem && gemCounter < totalGems {
      character.collectGem()
      gemCounter += 1
    }
    character.jump()
  }
}

while gemCounter < totalGems {
  jumpAcrossSide()
  character.turnRight()
  if platformPosition == 0 {
    expert.turnLockUp()
    platformPosition = 1
  } else if platformPosition == 3 {
    expert.turnLock(up: false, numberOfTimes: 2)
    platformPosition = 1
  }
  character.moveForward()
  if character.isOnGem && gemCounter < totalGems {
    character.collectGem()
    gemCounter += 1
  }
  if platformPosition == 1 {
    expert.turnLock(up: true, numberOfTimes: 2)
    platformPosition = 3
  }
  character.moveForward()
  character.turnRight()
}