今回はRubyの条件分岐を学んでいきましょう
条件分岐……。 まーた、知らない言葉が出てきたぞ
キャニット先生! 条件分岐ってなんですか?
まずはそこからですよね。わかりました。最初に条件分岐を解説しましょう
条件分岐って何?
ゲームをやっているとバトルシーンに出くわすことがあると思います。『モンスターが現れた!』なんてやつですね
RPGとかによくありますね
そんなときに『戦いますか?』と、問われるとその後の行動をこちらで選択できると思いますが……それが条件分岐です
なるほど。わたしは、すでに条件分岐マスターだったのか
条件分岐はあちこちで使われている
ユーザー側の選択によってその後のストーリーが変わるのは、コンピューターが条件分岐の処理を行っているからです。
また、ネット通販などでも『ポイントを使いますか?』と問われることがあるでしょう。ポイントを使った分だけ安くお買い物ができる。そんなケースです。
あれも、ポイントを使う・使わないで値段が変わる条件分岐によって管理をされています。
ちなみに、条件分岐は(if文)と呼ばれています。
『もし、戦うなら〜』とか『もし、ポイントを使うなら〜』の『もし』のifですね
条件分岐に使うif文
ゲーム内で『戦う・戦わない』を選択する場面を例にして、Rubyで書いてみましょう
fight = “はい”
if fight == “はい” then
puts “戦います。”
end
puts “次に行きます。”
このプログラムは、どんな意味ですか?
このプログラムの中心的な部分は、if, then, endです。ifからthenまでの間、この場合は
fight == “はい”
の部分が正しければ、endまでの間を実行します。
== を覚えておこう
==というのが初めて出てきましたね。これは、文字列が一致するという意味です
以前の講義で「=」は、代入を意味すると学んでいますね。「=」で代入された「はい」が「==」の文字列とも一致したので、thenとendの間の、
puts “戦います。”
が実行されます。
putsの前に一行の空白がありますが、実はここにtabが入っています。
thenとendの間は先頭にtabを入れて、プログラムを見やすくしています。
tabを入れなくても動きますが、慣習的に入れることになっています。
ちなみに、”戦います。”の実行が終わると、endの次の、
puts “次に行きます。”
が実行されます。
文字列が一致しないときは?
戦わないときは、どうなるんですか?
では、fightの値を変えてみましょう。
fight = “いいえ”
if fight == “はい” then
puts “戦います。”
end
puts “次に行きます。”
fightの値を”いいえ”に変えてみました。今度は、ifとthenの間の、
fight == “はい”
が正しくないので、thenとendの間は実行されずに、
puts “次に行きます。”
だけが実行されます。
「はい」という文字列が一致しないと戦わないのか。なるほどねー ほとんどのゲームに使われていそうだね
真理値(true, false, nil)
ifとthenの間を、正式には条件式と言います。この条件式をもう少し詳しく説明しましょうか
先ほどは「正しい」「正しくない」と表現しましたが、正式にはtrue(真)とfalse(偽)といいます。ここは重要なので、正確性を考えてRubyの公式ドキュメントから引用します。
Ruby では false または nil だけが偽で、それ以外は 0 や空文字列も含め全て真です。
前述の例だと、
fight == “はい”
の「結果」が真か偽かが問題になります。
fight == “はい”
の条件下で、
fight == “はい”
はtrueです。逆に
fight == “いいえ”
はfalseです。
逆に、
fight == “いいえ”
の条件下で、
fight == “はい”
はfalseです。
fight == “いいえ”
はtrueです。混乱しがちなので、気を付けてください。
関係演算子
真か偽かを判定する方法に、関係演算子というものがあります。
以前の講義で加減乗除のような演算子が出てきましたが、演算子は計算をするものです。
関係演算子は、真か偽かを判定するのに使われる演算子です。
「==」以外の関係演算子
「==」以外にも、関係演算子には、!= 等しくない、>, >=, <, <=があります。
!=は左辺と右辺が等しくないと全体が真になる関係演算子です。
不等号が入っているものは大きさを比較して、結果が真か偽かを判定する関係演算子です。
具体例として、レベルが5以上だと戦うプログラムを例として挙げておきます。>=を例として挙げておきましたが、==,!=,>,<,<=に変えて試してみてください。
論理演算子
二つ以上の条件をクリアしていないと、全体として真にできない時があります。たとえば自分のレベルが5以上で、「戦う」を選択しないと戦闘が始まらない。そんなプログラムを組むことも可能です。
こういうときは条件式に、
if level >= 5 && fight == “はい”
と書きます。
&&(論理積,and)は、前の条件式と後の条件式が同時に真の場合だけ、thenとendの間が実行されます。
なんか……だんだん複雑になってきた
ちょっとずつ複雑になっていますよ。たしかに、言葉だけだとわかりづらいかもしれませんね。わかりやすいように、実際にプログラムを書いてみましょうか
ふむふむ。このプレイヤーはレベル7だから「レベル5以上」をクリアしていますね。その上で、「はい」を選択したから戦いが始まると……。なんとなくわかりましたよー
論理演算子 &&の仲間達
&&の仲間には、||(論理和, or)と!(否定, not)があります。
「||」は、前の条件式と後の条件式のどちらか一方以上が真であるときにthenとendの間を実行します。
「!」は条件式が真の時に偽の結果を返し、偽の時に真の結果を返します。つまり、真偽値をひっくり返す論理演算子です。
演算子の優先順位
演算子、関係演算子、論理演算子には、優先順位があるんですよ
算数で、
3 + 4 * 5
は4 * 5が最初に計算され、3 + 4を先に計算したいときには、
(3 + 4) * 5
と書くと習ったと思います。
けっこう、たくさんの種類があるんですね
絶対に覚えられない自信があります
全部を覚える必要はありませんよ。 ただ、プログラムを組んで意図とは違う結果が出たら、優先順位をチェックすると良いでしょう。今は「演算子には優先順位がある」とだけ覚えておけば良いです
else文
続いては、else文を学んでいきましょう
前述のゲーム内でのシチュエーションでは、「戦いますか?」の問いに「いいえ」と答えたら、何もしませんでした。
でも、戦い以外の何かをするように設定することももちろんできます。
このように、戦うときと戦わないときで動作を変える時に使うのがelse文です。
if文の中の条件式が真なので、thenとelseの間だけが実行されます。elseとendの間は実行されません。
fightが”いいえ”の場合は、逆にthenとelseの間は実行されずに、elseとendの間だけが実行されます。
elsif文
「戦う」「話しかける」「逃げる」などの複数の選択肢のうちの一つを選ぶときに使うのがelsif文です。
「else」と「if」を合体させたんだから、「elseif」ではないのですか?
それが違うんですよ。「elsif」としっかり覚えておいてくださいね
例として挙げるプログラムの”戦う”の部分を”話しかける”や”逃げる”に書き換えて、elsifの動作を確かめてみましょう。
case文
elsifはcase文を用いて同じように書けます。
caseの直後に分岐のために使う変数を書くだけです。これも”戦う”のところを”話しかける”や”逃げる”に書き換えて、case文の動作を確かめてください。
elsifを重ねるよりもcase文を使った方がスッキリかけます。
他にも条件分岐はいろいろと……
条件分岐には上記の他にも、いろいろあります。
- 条件式の中の真偽値をひっくり返す、unless文
- case文でwhenとthenの間に複数の項目を書ける機能
- if, elseの対と同じ機能を果たす、?,:
- if文の後置型
ただ、専門的になりすぎるのでここでは項目だけ挙げておきますね
そうそう。ほどほどにしておきましょう
まとめ
では、今回の講義はこのへんにしておきましょうか
今回も内容が濃かったですね
Rubyマスターにどんどん近づいている気がします。よーし、この調子で次に行ってみよー