コウです、よろしくお願いします!
「ゼロからプログラミングを始める」人に役立つ情報を発信しています。
今回はDay52「3つの宝石と4つのスイッチ」です。どうぞ!!

解答例
まずは解答例を確認しましょう。
解答例
コードの解答例は次のようになります。

解答例を動画で確認する
上記のコードを実行した結果がこちらになります。
ステージ攻略「3つの宝石と4つのスイッチ」
ステージを攻略していきましょう!

ワープがあるのがわかるでしょうか。
ワープする前には宝石が、ワープした後にはスイッチが並んでいますね。

ただ、ワープがあっても結局一本道が続いているだけなので
その道を通りながら
宝石を3つ集め、スイッチを4つ切り替える
ことになります。
注意が必要なのは、
それぞれの数より多くても少なくてもいけないということです。
それから今回もワイヤーフレームさんご登場です。
宝石やスイッチの位置がランダムなので、
1マスずつ調べながら進む必要がありますね。
ワイヤーフレームについては↓こちらからどうぞ

whileループの条件
今回もwhileループを使っていきます。
whileループの詳細は↓から

ループの条件は、
『宝石の数が3個より少ないもしくはスイッチの数が4個より少ない』
とします。
つまりクリア条件を満たすまでということですね。
条件をコードで書くと以下のようになります。
gemCounter < 3 || switchCounter < 4
もしくはを表すのは論理or演算子『||』でした。
覚えていましたか?
論理or演算子について詳しくは↓から

whileループの中身
クリア条件を満たすまで
どのような動きをすればよいか考えていきましょう。
解答例をもう一度表示します。

whileループの中には
①〜⑤の項目が書かれています。
順番に確認していきましょう。
①1マス進む
moveForward()
まずはmoveForward()ですね。
ワイヤーフレームにより
宝石やスイッチの場所はどこに出現するかわからないので、
1マスずつ調べていく必要があるからです。
②宝石を取って数を数える
if isOnGem && gemCounter < 3 {
collectGem()
gemCounter = gemCounter + 1
}
宝石に関する項目です。
まずはif文で
『宝石の上にいて宝石の数が3個より少ない時』
に動けるようにします。
そしてその条件に合う場合には
『宝石を取って、宝石の数を+1』
します。
③スイッチを入れて数を数える
if isOnClosedSwitch && switchCounter < 4 {
toggleSwitch()
switchCounter = switchCounter + 1
}
スイッチに関する項目です。
やっていることは②と一緒で、宝石がスイッチになっただけです。
スイッチは4つ切り替える必要があるので『<4』ですね。
④右を向く
if isBlocked && isBlockedLeft {
turnRight()
}
ステージはまっすぐ続いていません。
途中で曲がっていますよね。

もう一度ルートを確認してください。
右に曲がらなくてはならない箇所(赤で囲ったところ)が6箇所あります。
その全ての場所に共通していることがあります。
それは、
『前と左が行き止まり』
であることです。
これを利用して、『前と左が行き止まりの時には右を向く』としました。
⑤左を向く
if isBlocked && isBlockedRight {
turnLeft()
}

④とほぼ同じです。
ステージには左に曲がらなければならない箇所が1つだけあります。
ここは
『前と右が行き止まり』
になっていますね。
そこで、『前と右が行き止まりの時には左を向く』としました。
まとめ:3つの宝石と4つのスイッチ
解答例を漠然と見ると難しそうですが、
小分けにすると一つ一つはそんなに難しくなかったですね。
今回のポイントを振り返りましょう。
- 一見難しそうに見えても、小分けにすれば大丈夫
- 『||』は『もしくは』の意味
次回はDay53「値が等しいかどうかを調べる」でお会いしましょう!それでは!!
