はじめてのRmakeスクリプト
第03回 変数とフラグをマスターしよう

こんにちは 簸川 葵(ひかわ あおい)と申します

こんにちは 剣 芽優(つるぎ めゆ)です

この連載ではスクリプトの基礎を、じっくりとお話していきます

分からないところがあったら、過去の記事を参考にするといいわね
03-01 変数とフラグ
前回では変数と文字列についてお話しました

今回はフラグについてお話しましょう

フラグっていうと、恋愛ゲームでお話が分岐する条件とか・・・?

他にも、RPGで宝箱をあけたかどうか、とか

シューティングで敵を倒したかどうか、といったことにも利用できますね

なんだか難しそう・・・

そうでもないですよ フラグとはオンかオフかどうかの2種類だけであり
「true」がオン、「false」がオフを意味しています

これを『ブーリアン』といいます

数値、文字列、ブーリアン・・・

いずれも、内容の種類の名前ですね
#「a」という名前の変数に、ブーリアン「false」を入れる
a = false
#「b」という名前の変数に、変数「a」の中身を入れる
b = a
#変数「b」の中身を表示する
speak(b)

ブーリアンも数値みたいに、「"」はいらないのね

「true」か「false」の2種類のみですので

そのまま書くことで使用できるようになっています
03-02 フラグと条件式

2種類しかない変数の値って、必要がないような・・・

これだけでは確かにそうかもしれません

ですが、
『条件式』を書くことでブーリアンを取得することもできます

『条件式』・・・?

変数や値を比較する式のことです
#「x」という名前の変数に、数値「5」を入れる
x = 5
#「a」という名前の変数に、変数「x」と数値「3」を比較する条件式の結果を入れる
a = x > 3
#変数「a」の中身を表示する
speak(a)

「true」が表示されたわ
条件式が成り立てば「true」、成り立たなければ「false」が返ります

変数「x」には「5」が入っており、数値「3」と比較したとき

「5」は「3」より大きいので、「true」となったわけです

より大きいかどうかだけ比較できるの?

条件式には他の種類もあります
#「x」という名前の変数に、数値「10」を入れる
x = 10
#「y」という名前の変数に、数値「8」を入れる
y = 8
#変数「x」が変数「y」より大きいかどうか
a = x > y
#変数「x」が変数「y」より小さいかどうか
a = x < y
#変数「x」が変数「y」以上かどうか
a = x >= y
#変数「x」が変数「y」以下かどうか
a = x <= y
#変数「x」が変数「y」と等しいかどうか
a = x == y
#変数「x」が変数「y」と等しくないかどうか
a = x != y

条件式にもいろいろな種類があるのね

さらに、ブーリアン同士を比較することができる
『論理式』を書くことでブーリアンを取得することもできます
#「a」という名前の変数に、ブーリアン「true」を入れる
a = true
#「b」という名前の変数に、ブーリアン「false」を入れる
b = false
#変数「a」と変数「b」がどちらも「true」かどうか
c = a && b
#変数「a」と変数「b」のいずれかが「true」かどうか
c = a || b
#変数「a」が「true」なら「false」、「false」なら「true」を返す
c = !a

ブーリアンを取得する方法って、こんなにあるのね
03-03 フラグによる分岐

フラグでブーリアンを使用するのは、

そのまま『分岐処理』に使えるためという理由もあります

『分岐処理』をすることで実際に分岐していくのかしら

そうですね 分岐処理にも様々なものがありますが

今回は一番メジャーな「if文」のお話をします
#「a」という名前の変数に、ブーリアン「true」を入れる
a = false
#変数「a」の内容を元に分岐する
if a
#変数「a」が「true」の場合
speak("条件達成")
end
speak("実行終了")

speak関数が2つあるのに、「条件達成」が表示されなかったわ
「if文」はif (条件)~endでセットとなっています

この条件が
「true」の場合ifを書いた次の行からendまでが実行されます

この場合、変数「a」は「false」でしたので実行されないままendまで飛んだわけです

実行されるところと、実行されないところを分けるから分岐処理なのね
if文の条件には、直接条件式を書くこともできます

また、
「elsif」で次に判定する条件の追加、
「else」で条件以外のときに実行する分岐処理を書くこともできます
#「x」という名前の変数に、数値「10」を入れる
x = 10
#変数「x」の内容を元に分岐する
if x > 99
#変数「x」が「99」より大きい場合
speak("100以上")
elsif x > 9
#変数「x」が「9」より大きい場合
speak("10以上")
else
#変数「x」が上記までの条件以外の場合
speak("条件未達成")
end

どこからどこまでが実行されるようになったの?

まずは最初の「if」、ここで「x > 99」の条件式が判定されます

変数「x」は「10」だから「false」ね

そのとおり 条件が「true」ではないので、次に「elsif」まで飛びます

変数「x」は「10」だから「true」になったわ

ここで条件が「true」になったので「10以上」が表示されますね

次は、「else」?

「else」はここまでの全てが「true」でなかった場合に実行されます

ということは、ここも実行されないで「end」まで飛ぶのね

結果、「10以上」のみが表示されるわけです

次の「elsif」とか「else」に飛ぶのは分かったわ、

でも、行が増えてきたら探すのが大変そう・・・

そのために、行の始めに半角空白をあけておくことで

「ネスト」を分かりやすくしています

「ネスト」・・・?

ある一定のまとまりのことです

ここでは分岐によって実行されたり、実行されなかったりしている行ですね

そっか
行の始めに半角空白が空いていないところを探せば
実行されない行を飛ばして見やすくなるのね
03-04 フラグによるループ

フラグのブーリアンは、『ループ処理』にも使えます

ループ、ということはぐるぐるまわるの?

条件が達成されるまで同じところを繰り返し実行します

Rmakeでは「while文」でループ処理を行います
#「i」という名前の変数に、数値「0」を入れる
i = 0
#変数「i」の内容を元に分岐する
while i < 10
#変数「i」が「10」より小さい場合
#変数「s」に、変数「i」を文字列にして入れる
s = toString(i)
#変数「s」に、変数「s」と文字列「回目」を連結して上書きする
s = s + "回目"
#変数「s」中身を表示する
speak(s)
#変数「i」に、変数「i」と数値「1」を足した結果を上書きする
i = i + 1
end
speak("ループ終了")

speak関数が2つしかないのに、11回も表示されたわ
「while文」はwhile (条件)~endでセットとなっています

この条件が
「true」の場合whileを書いた次の行からendまでが実行されます

ここまでは、if文と同じ流れね

if文と異なるのは、
endまで実行された後、whileの行まで戻り、
条件が「true」の場合、再びwhileを書いた次の行からendまでが実行されます

繰り返し実行されるから『ループ処理』なのね
03-05 第03回 まとめ問題集

それでは、今回のまとめ問題です

よーっし がんばるよ

なお、回答は記載しておりません

スクリプトをコピーして、実際に動作させることでチェックしてください
問題01
次のスクリプトに実行結果が「false」と表示されるよう、1行を追加してください
a = true
#ここに追加する
speak(a)
問題02
次のスクリプトに変数「x」を使用して実行結果が「こんにちは」と表示されるよう、1行を追加してください
x = 1
#ここに追加する
speak("おはよう")
else
speak("こんにちは")
end
問題03
次のスクリプトに変数「i」を使用して実行結果が5回表示されるよう、1行を追加してください
i = 0
#ここに追加する
speak(i)
i = i + 2
end

できた! なんだかゲームらしくなった気がする

なお、理解したかどうかの確認なので、
コメントに回答を書かないでください
<連載一覧>
第01回 変数と数値をマスターしよう
第02回 変数と文字列をマスターしよう
第03回 変数とフラグをマスターしよう
第04回 配列変数をマスターしよう
第05回 通常変数をマスターしよう
第06回 数値の応用をマスターしよう
第07回 時間の動作をマスターしよう
第08回 ユーザ定義関数をマスターしよう
第09回 スクリプト用語のまとめ