宝石は毎回どこに出現するか予測不可能なので、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() } |