はじめてのRmakeスクリプト
第03回 変数とフラグをマスターしよう
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
こんにちは 簸川 葵(ひかわ あおい)と申します
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8697/C02_02_01.png)
こんにちは 剣 芽優(つるぎ めゆ)です
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
この連載ではスクリプトの基礎を、じっくりとお話していきます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8706/C02_02_04.png)
分からないところがあったら、過去の記事を参考にするといいわね
03-01 変数とフラグ
前回では変数と文字列についてお話しました
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
今回はフラグについてお話しましょう
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
フラグっていうと、恋愛ゲームでお話が分岐する条件とか・・・?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
他にも、RPGで宝箱をあけたかどうか、とか
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
シューティングで敵を倒したかどうか、といったことにも利用できますね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8703/C02_02_03.png)
なんだか難しそう・・・
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
そうでもないですよ フラグとはオンかオフかどうかの2種類だけであり
「true」がオン、「false」がオフを意味しています
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
これを『ブーリアン』といいます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
数値、文字列、ブーリアン・・・
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
いずれも、内容の種類の名前ですね
#「a」という名前の変数に、ブーリアン「false」を入れる
a = false
#「b」という名前の変数に、変数「a」の中身を入れる
b = a
#変数「b」の中身を表示する
speak(b)
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8697/C02_02_01.png)
ブーリアンも数値みたいに、「"」はいらないのね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
「true」か「false」の2種類のみですので
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
そのまま書くことで使用できるようになっています
03-02 フラグと条件式
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8703/C02_02_03.png)
2種類しかない変数の値って、必要がないような・・・
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
これだけでは確かにそうかもしれません
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
ですが、
『条件式』を書くことでブーリアンを取得することもできます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
『条件式』・・・?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
変数や値を比較する式のことです
#「x」という名前の変数に、数値「5」を入れる
x = 5
#「a」という名前の変数に、変数「x」と数値「3」を比較する条件式の結果を入れる
a = x > 3
#変数「a」の中身を表示する
speak(a)
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
「true」が表示されたわ
条件式が成り立てば「true」、成り立たなければ「false」が返ります
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
変数「x」には「5」が入っており、数値「3」と比較したとき
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
「5」は「3」より大きいので、「true」となったわけです
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
より大きいかどうかだけ比較できるの?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
条件式には他の種類もあります
#「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
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
条件式にもいろいろな種類があるのね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
さらに、ブーリアン同士を比較することができる
『論理式』を書くことでブーリアンを取得することもできます
#「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
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
ブーリアンを取得する方法って、こんなにあるのね
03-03 フラグによる分岐
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
フラグでブーリアンを使用するのは、
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
そのまま『分岐処理』に使えるためという理由もあります
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
『分岐処理』をすることで実際に分岐していくのかしら
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
そうですね 分岐処理にも様々なものがありますが
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
今回は一番メジャーな「if文」のお話をします
#「a」という名前の変数に、ブーリアン「true」を入れる
a = false
#変数「a」の内容を元に分岐する
if a
#変数「a」が「true」の場合
speak("条件達成")
end
speak("実行終了")
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
speak関数が2つあるのに、「条件達成」が表示されなかったわ
「if文」はif (条件)~endでセットとなっています
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
この条件が
「true」の場合ifを書いた次の行からendまでが実行されます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
この場合、変数「a」は「false」でしたので実行されないままendまで飛んだわけです
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
実行されるところと、実行されないところを分けるから分岐処理なのね
if文の条件には、直接条件式を書くこともできます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
また、
「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
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8712/C02_02_06.png)
どこからどこまでが実行されるようになったの?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
まずは最初の「if」、ここで「x > 99」の条件式が判定されます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
変数「x」は「10」だから「false」ね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
そのとおり 条件が「true」ではないので、次に「elsif」まで飛びます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8697/C02_02_01.png)
変数「x」は「10」だから「true」になったわ
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
ここで条件が「true」になったので「10以上」が表示されますね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
次は、「else」?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
「else」はここまでの全てが「true」でなかった場合に実行されます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
ということは、ここも実行されないで「end」まで飛ぶのね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
結果、「10以上」のみが表示されるわけです
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8697/C02_02_01.png)
次の「elsif」とか「else」に飛ぶのは分かったわ、
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8703/C02_02_03.png)
でも、行が増えてきたら探すのが大変そう・・・
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
そのために、行の始めに半角空白をあけておくことで
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
「ネスト」を分かりやすくしています
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
「ネスト」・・・?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
ある一定のまとまりのことです
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
ここでは分岐によって実行されたり、実行されなかったりしている行ですね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8706/C02_02_04.png)
そっか
行の始めに半角空白が空いていないところを探せば
実行されない行を飛ばして見やすくなるのね
03-04 フラグによるループ
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
フラグのブーリアンは、『ループ処理』にも使えます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
ループ、ということはぐるぐるまわるの?
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
条件が達成されるまで同じところを繰り返し実行します
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
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("ループ終了")
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
speak関数が2つしかないのに、11回も表示されたわ
「while文」はwhile (条件)~endでセットとなっています
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8694/C01_02_05.png)
この条件が
「true」の場合whileを書いた次の行からendまでが実行されます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8715/C02_02_07.png)
ここまでは、if文と同じ流れね
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
if文と異なるのは、
endまで実行された後、whileの行まで戻り、
条件が「true」の場合、再びwhileを書いた次の行からendまでが実行されます
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8697/C02_02_01.png)
繰り返し実行されるから『ループ処理』なのね
03-05 第03回 まとめ問題集
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
それでは、今回のまとめ問題です
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8700/C02_02_02.png)
よーっし がんばるよ
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
なお、回答は記載しておりません
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8682/C01_02_01.png)
スクリプトをコピーして、実際に動作させることでチェックしてください
問題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
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8706/C02_02_04.png)
できた! なんだかゲームらしくなった気がする
![](https://d2nlrppnj7be8d.cloudfront.net/materials/0012/8688/C01_02_03.png)
なお、理解したかどうかの確認なので、
コメントに回答を書かないでください
<連載一覧>
第01回 変数と数値をマスターしよう
第02回 変数と文字列をマスターしよう
第03回 変数とフラグをマスターしよう
第04回 配列変数をマスターしよう
第05回 通常変数をマスターしよう
第06回 数値の応用をマスターしよう
第07回 時間の動作をマスターしよう
第08回 ユーザ定義関数をマスターしよう
第09回 スクリプト用語のまとめ