コウです、よろしくお願いします!
「ゼロからプログラミングを始める」人に役立つ情報を発信しています。
今回はDay60「宝石があちこちにランダムに」です。
なんだか難しそうな気がしますがどうでしょうか。どうぞ!!
解答例
まずは解答例を確認しましょう。
コードは次のようになります。
なんだかよく分からないと思うので、
この後の攻略で確認してください!
解答例を動画で確認する
上記のコードを実行した結果がこちらになります。
ステージ攻略「宝石があちこちにランダムに」
それではステージを攻略していきましょう!
今回のクリア条件は、『ランダムな数の宝石を全て集める』ことです。
コードを実行すると、ワイヤーフレームにより宝石がランダムに出現します。
画像の中に宝石のようなものが白く現れているのがわかるでしょうか。
これが宝石が出現する可能性のある場所です。
最大で10個出現する可能性があるということになります。
ワイヤーフレームについては↓から
通りたいルートはこちら。
ワープが絡むのでわかりづらいですが、
赤→青→オレンジ
の順に進んでいきます。
わかりにくい方は、解答例の動画を参考にしてみてください!
解答例に沿って、分割して説明していきます!
定数と変数を宣言する
let totalGems = randomNumberOfGems
var gemCounter = 0
定数についてはあらかじめ宣言されています。
この定数分だけ宝石を集めるのが今回のミッションです。
宝石の数によってループを制御するために、
宝石の数を数える変数を宣言しておきます。
①宝石を調べる関数を定義する
まずは宝石を取ったり数を数えたりできるような関数を定義します。
func checkGem() {
while !isBlocked {
moveForward()
if isOnGem {
collectGem()
gemCounter += 1
}
}
turnLeft()
turnLeft()
}
関数名は『checkGem』としました。
whileループを使って、
『壁にぶつかるまで1マスずつ進み、宝石があったら取って数を数える』
ようにします。
壁にぶつかったらループがストップするので、
振り向けるように『turnLeft() 』を2つ書いておきます。
②ピンクのワープを制御する関数を定義
これが今回の重要ポイントであり、ややこしいところです。
func onoffPinkPortal() {
if pinkPortal.isActive == true {
pinkPortal.isActive = false
} else {
pinkPortal.isActive = true
}
}
関数名は『onoffPinkPortal』です。
ピンクのワープのオンオフを切り替えます。
コードはif文で構成されています。
条件は、『もし、ピンクのワープがオンなら』です。
この場合は、『ピンクのワープをオフ』にします。
そしてelseも入っています。
この条件は書かれていませんが、
『もし、ピンクのワープがオフなら』になります。
この場合は、『ピンクのワープをオン』にします。
オンならオフにして、オフならオンにする?
わけわかんないよ!!
こう思いますよね。
この疑問は、④を見ていただけると解決すると思います!
③青のワープを制御する関数を定義
②と同様の関数を、青のワープでも作ります。
func onoffBruePortal() {
if bluePortal.isActive == true {
bluePortal.isActive = false
} else {
bluePortal.isActive = true
}
}
④whileを使って関数をループする
while gemCounter < totalGems {
checkGem()
onoffPinkPortal()
onoffBruePortal()
}
ループの条件は、
『集めた宝石の数が、集めるべき宝石の数より少ない時』です。
このループの終わりがクリアに直結します。
さて、②で抱いた疑問を解決しましょう。
ループの順番は、
『宝石の確認→ピンクのオンオフ→青のオンオフ』
ですね。
宝石の確認は①で定義した関数ですが、
最後に『turnLeft()』が2つありました。
つまり、もう少し詳細にループの順番を見ると
『行き止まりで振り向いた後に、ピンク(青)のオンオフを切り替える。』
ということになります。
では、振り向くタイミングとワープの切り替えのタイミングはいつなのか。
はじめに出したルートを再度確認しましょう。
まずは赤線です。
ピンクのワープはオンなので、手前にワープします。
そのまま進み続けてこの画像だと2つ目の宝石を取ったところで振り向きます。
振り向いたので、ピンク(青)のワープはオンだったのがオフになります。
するとどうでしょうか。
これから進んでいくまっすぐの道のワープがオフになったことで、
反対側まで進むことができますね。
そしてまた行き止まりで振り向きます。
この時、ピンクのワープはオフになっていますので、
関数によってオンになります。
すると今度は青線のルートでピンクのワープを使って真ん中に戻ります。
そして行き止まりまで行きワープをオフにして、、
といった具合で繰り返されます!
うまい具合に進んでいくもんですね!!
疑問は解決されたでしょうか。
まとめ:宝石があちこちにランダムに
定義する関数を見つけるのがとても難しいステージでしたね!!
今回のポイントを振り返りましょう。
- funcの中にwhileを入れて関数として定義することもある
- 繰り返しのパターンはできるだけ関数として定義してまとめる
この記事の解答例を見ながらでもいいので、
まずはコードを書いてみましょう!
書きながら理解できることが多いはずです!!
これで型ユニットが終了になります。お疲れ様でした。
次からは初期化ユニットに突入していきますよー!
こまで勉強してきてプログラミングに興味を持った人は、
実際にプログラミング教室に通ってみるのもおすすめです。
今なら春の入会キャンペーン実施中です。
ロボットプログラミングに興味がある方はこちらもおすすめ。
これからの時代を見据えて学んでいくために、
ぜひ選択肢のひとつとして考えてみてください。
Day61「エキスパートを初期化する」でお会いしましょう!それでは!!