if文の扱いがなんとなく掴めてきたところで、少し詳しい説明が出てきます。
ブール値(ぶーるち、と読みます)というキーワードが登場です。英語ならBool値と書きます。追々登場する変数というものの形の一種なのですが、ここではYesかNoで答えられる疑問文のようなものと思って下さい。例えば、「Is this a pen?(これはペンですか?)」という疑問文は基本的に「はい」か「いいえ」の二択(=ブール値)で答えられます。一方「What is your name?(あなたの名前はなんですか?)」という疑問文は「はい」「いいえ」では答えられません。if文が分岐の条件に扱えるのは前者の「はい」「いいえ」で答えられる内容だけなのです。そしてプログラミングの世界では、この「はい」「いいえ」をそれぞれ「true」「false」と表現します。日本語では「真」「偽」ともいいます。与えられた疑問(条件)が肯定される(成り立つ)時をtrue、否定される(成り立たない)時はfalseと呼びます。
ステージを眺めていきましょう。らせん状のルートを進んで宝石を4つ取ります。ステージは固定なので、「3歩進んで左に曲がり、4歩進んでまた左に…」というコードを書いていってもゴールできます。しかしこのステージではif文を使って解く必要があります。ステップ1の指示に従って、if文の条件にisOnGemを書いたのが下のコードです(//でコメント文を追加してあります)
1 2 3 4 5 6 7 8 9 |
for i in 1 ... 16 { if isOnGem { //もし宝石があったら //ここに書くとif文がtrueの時に実行される } else { //ここに書くとif文がfalseの時に実行される moveForward() } } |
「宝石があった時になにかをし、それ以外の時は一歩進む」のを16回繰り返す、ということになります。その「なにか」を追加しなければなりません。さて、なにかとはなんでしょう?
宝石があったらやることは大抵決まっていますね。そしてもうひとつマップの最後まで辿り着くまでにしなければならないことがあります。ステージを眺めて考えてみてください。
正解例はこちら。
1 2 3 4 5 6 7 8 |
for i in 1 ... 16 { if isOnGem { collectGem() turnLeft() } else { moveForward() } } |
前のステージではif文の後にelse ifというものがでてきました。今回は単なるelseです。似ているようで違うこの2つを整理しておきましょう。
まずは単なるelseの時。これがif文の基本形です。
1 2 3 4 5 6 |
if (条件A) { (Aがtrueの時にする処理) } else { (Aがfalseの時にする処理) } (Aがtrueだろうとfalseだろうとする処理) |
if文から連なる一連の}が閉じた後の書かれたものは、もはやif文の関係ないので、条件文のtrue/falseに関係なく常に実行されます。{}で囲んでいる範囲に注目しましょう。
falseの場合に特にすることがない場合はまるっと省略してこう書くこともできます。
1 2 3 |
if (条件A) { (Aがtrueの時にする処理) } |
次にelse ifを使う場合。
1 2 3 4 5 6 7 |
if (条件A) { (Aがtrueの時にする処理) } else if (条件B) { (Aがfalseで、なおかつBがtrueの時にする処理) } else { (AもBもfalseの時にする処理) } |
条件(疑問)が2段階になるわけですね。もちろんこの場合も最後のelse以降が必要ない場合は省略できます。
注意して欲しいのは、前ステージで疑問を投げかけた、「else ifではなくifを2つ並べた時」との違いです。
1 2 3 4 5 6 7 8 |
if (条件A) { (Aがtrueの時にする処理) } if (条件B) { (Bがtrueの時にする処理。Aは全く関係しない) } else { (Bがfalseの時にする処理。Aは全く関係しない) } |
この場合は、3行目の}でAを条件にしたif文は終了していますので、続くB条件のif文には関係しません。else ifでつなぐか新しいif文をはじめるかで動きが違ってくるので注意しましょう。
さらにいうと、if文のtrueやfalseのブロック({}に挟まれた部分)に更に別のif文を書くなんてこともあります。慣れないとちょっとこんがらがってきますね(笑)。
1 2 3 4 5 6 7 8 9 |
if (条件A) { (Aがtrueの時にする処理) } else { (Aがfalseの時にする処理) if (条件B) { (Aがfalseで、なおかつBがtrueの時にする処理) } (Aがfalseの時にする処理) } |
これらの使い分けは追々実際に活用しながら身についていくので、いまは「{}で囲む範囲が重要」と憶えておくくらいで大丈夫です。
進むマスは12マスなのに繰り返しの回数が16回になる理由が分かりません。
教えて下さい。
遅くなってすいません。もう解決済みかもしれませんが、この{~}のループは「ジェムの上ならとる、それ以外なら進む」という処理をセットで繰り返しています。なので、マスを進む以外の行動(宝石をとって左を向く)をした場合も1回のカウントになります。
It’s a pity you don’t have a donate button! I’d most certainly donate to this brilliant blog!
I suppose for now i’ll settle for bookmarking and adding your RSS feed to my Google account.
I look forward to brand new updates and will talk about this website with my Facebook group.
Chat soon!