宝石は毎回どこに出現するか予測不可能なので、whileループで目標としては利用しづらいです。なので、今回は多少無駄に行きすぎることもありますが、「行き止まりまで進み」かつ「途中に宝石を見つけたら回収しておく」というスタンスにしました。
スイッチにはtoggleSwitch()という関数があり、オンならオフに、オフならオンにと現在の状態と逆の状態に自動でできて便利でした。なのでワープについても同じようなことができる関数を自作してみました。それがtoggleBluePortal()とtogglePinkPortal()です。
このステージの課題文の後半に、「単に規定数の宝石を集めるだけでなく、関数にまとめるなどしてコードを上手に書こう」的なことが書かれています。本編の繰り返し部分がたったの三行、それも自分で用意した関数三つを呼び出すだけ、で済んでしまったのはなかなかに模範解答じゃないかと思いますが、プログラミングの正解はひとつではないので、単にマネして打ち込むだけでなく、自分なりにパターンを見つけることに挑戦してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
let totalGems = randomNumberOfGems //ゲットした宝石のカウンター変数を用意 var getGems = 0 //三種類の関数を用意 //繰り返し使用するナビゲーションパターンを一発実行する関数 func 宝石取りながら端まで行って折り返す() { while !isBlocked { moveForward() //途中宝石があったら回収 if isOnGem { collectGem() getGems += 1 } } turnRight() turnRight() } //青ポータルがオンならオフに、オフならオンに切り替える関数 func toggleBluePortal() { if bluePortal.isActive == true { bluePortal.isActive = false } else { bluePortal.isActive = true } } //ピンクがオンならオフにオフならオンに切り替える関数 func togglePinkPortal() { if pinkPortal.isActive == true { pinkPortal.isActive = false } else { pinkPortal.isActive = true } } //ここから本編 while getGems < totalGems { 宝石取りながら端まで行って折り返す() togglePinkPortal() toggleBluePortal() } |
プログラミング初学者です。
参考になるサイトを制作いただきありがとうございます。
ところでこのステージのコードすごいです。
最初はなんとか自力でクリアしたのですが、コードがかなり長くなってしまいました。
・ワープをトグルにしてしまう
・「端までいってワープのオンオフを切り替える」をループするだけでステージを全て回れるというシンプルな構造
この2つがとても自力では思いつきそうにない発想なのですが、この発想力は経験を積んで身につくものでしょうか?
//参考になります。私も最近はまって作ってみました。楽しいです。
let totalGems = randomNumberOfGems
var nOGem = 0
var nTurn = 0
func check() {
while !isBlocked {
moveForward()
if isOnGem {
collectGem()
nOGem += 1
}
}
turnLeft()
turnLeft()
nTurn += 1
}
while nOGem < totalGems {
if nTurn == 1 || nTurn == 3 {
pinkPortal.isActive = true
} else {
pinkPortal.isActive = false
}
if nTurn == 4 {
bluePortal.isActive = true
} else {
bluePortal.isActive = false
}
check()
}
短めに書けたと思うので、これからご覧になる方の参考になれば!
let totalGems = randomNumberOfGems
func Gem() {
while !isBlocked{
if isOnGem{
collectGem()
}
moveForward()
}
turnRight()
turnRight()
}
pinkPortal.isActive = false
bluePortal.isActive = false
Gem()
Gem()
bluePortal.isActive = true
Gem()
bluePortal.isActive = false
Gem()
bluePortal.isActive = true
pinkPortal.isActive = true
Gem()
pinkPortal.isActive = false
Gem()
折り返す度に両ワープのオンオフ切り替えた方がシンプルでわかりやすい
let totalGems = randomNumberOfGems
var gemCounter = 0
while gemCounter < totalGems {
moveForward()
if isOnGem {
collectGem()
gemCounter += 1
}
if isBlocked && bluePortal.isActive == true {
turnLeft()
turnLeft()
bluePortal.isActive = false
pinkPortal.isActive = false
} else if isBlocked && bluePortal.isActive == false {
turnLeft()
turnLeft()
bluePortal.isActive = true
pinkPortal.isActive = true
}
}