はじめてのRmakeスクリプト
第06回 数値の応用をマスターしよう

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

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

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

分からないところがあったら、過去の記事が参考になるわね
前回では変数の種類についてお話しました

今回は、『数値の応用』についてお話します
06-01 数値と乱数

ゲームをつくる時、よく使われるものとして『乱数』があります

『乱数』・・・?
『乱数』とは、その名の通りランダムに得られた数値のことで、

敵を倒したときのアイテム発生率というような「確率」や

敵の動作を決める「AI(人工知能)」など、

ほとんどのゲームにとって欠かせない重要なものです

なんだか、とっても難しそう・・・

Rmakeでは
rand関数を使うことで簡単に取得できますよ
#変数「r」に「0」~「9」の中からランダムに1つの数(乱数)を取得して入れる
r = rand(10)
#変数「r」の内容を元に分岐する
if r < 1
#変数「r」が「1」より小さい場合
speak("10%の確率で成功した")
end

始めに出てきたrand関数が『乱数』を取得しているところなのね
rand関数は「0」から「関数に渡した値 - 1」までの範囲から
1つの整数を選び、戻り値に返します

「関数に渡した値 - 1」という点に注意が必要ね

その後のif文は何をしているの?

まずは乱数によって、「0」~「9」までの10通りができていますね

その中から「1」より小さいもの、つまり「0」が選ばれた場合だけ

if文の中を実行する仕組みになっています

10通りの中から1通りだけ・・・

そっか「1/10」=「10/100」で、「10%」の確率ということね

「25%」など、もっと細かい値で設定したい場合は、

乱数の幅を「100」、if文の条件を「25」にすれば良いわけです
06-02 数値を使った分岐

ブーリアン以外の変数を使用することで、

複数の分岐処理を一度に行うには「case文」を使用します

「if文」はブーリアンだけ使用できたよね・・・

そうですね
「case文」は変数に入った値を使用して分岐処理を行います
#変数「x」に、数値「1」を入れる
x = 1
#変数「x」の内容を元に複数分岐する
case x
when 0
#変数「x」が「0」の場合
speak("おはよう")
when 1
#変数「x」が「1」の場合
speak("こんにちは")
when 2
#変数「x」が「2」の場合
speak("こんばんは")
else
#変数「x」が上記以外の場合
speak("いま何時?")
end

case文もif文のように、
「case」~「end」でひとまとまりなのね

そのとおり caseの後ろに条件として使用する変数名、

「when」の後ろに実行したいときの変数の値を書きます

これでif文の時のように、条件が成り立ったネストだけ実行されるわけね

実行が終わると「end」まで飛びます

このスクリプトでは変数「x」は「1」なので

「こんにちは」と表示されて終了します
06-03 選択肢の表示と条件分岐

case文を使わなくても、if文でelsif~elsif~ってずっと書いていけば

同じ内容が実行できるんじゃないの?

実行可能です

ただしcase文の方が便利な面もあります

選択肢を表示する
speakWithSelect関数などといった

何らかの値を返す関数と条件分岐を組み合わせるとき

関数を使用する場所を分かりやすくまとめることができます

speakWithSelect関数?

選択肢の数、各選択肢の文字列、選択肢を表示するときのメッセージを渡すことで

選択肢を表示し、選択された内容を「番号」として返す関数です
#speakWithSelect関数の戻り値を元に複数分岐する
case speakWithSelect(3, "ごはん", "パン", "やめる", "何を食べる?")
when 0
#「0」番目の選択肢が選ばれた場合
speak("ごはんを食べよう")
when 1
#「1」番目の選択肢が選ばれた場合
speak("パンを食べよう")
when 2
#「2」番目の選択肢が選ばれた場合
speak("食べるのをやめた")
end

case文の条件に関数が入っているのね

このように書くことで、関数の戻り値をそのまま分岐処理に使うことができます

この場合は、speakWithSelect関数によって

「ごはん」「パン」「やめる」の3つの選択肢が表示されて・・・

「ごはん」が選ばれたら「0」、「パン」が選ばれたら「1」といった数値が返ります

「0」からスタートした値なのね

あとは変数を条件にしたときと同じように

関数の戻り値によって複数分岐されるわけです

if文だと関数の戻り値を一度変数に入れるか、

条件式に何度も関数を入れないといけないけど

これなら分かりやすいわね
06-04 第06回 まとめ問題集

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

よーっし がんばるよ

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

スクリプトをコピーして、実際に動作させることでチェックしてください
問題01
次のスクリプトに実行結果が45%の確率で「銀の剣入手」と表示されるよう、2行を追加してください
#ここに追加する
speak("銀の剣入手")
end
問題02
次のスクリプトに実行結果が「ハート」と表示されるよう、4行を追加してください
x = 4
case x
#ここに追加する
speak("スペード")
#ここに追加する
speak("クラブ")
#ここに追加する
speak("ダイヤ")
#ここに追加する
speak("ハート")
end
問題03
次のスクリプトに選択肢と乱数を使用してじゃんけんが表示されるよう、2行を追加してください
#ここに追加する
when 0
speak("あなたは グーを出したよ")
when 1
speak("あなたは チョキを出したよ")
else
speak("あなたは パーを出したよ")
end
#ここに追加する
when 0
speak("コンピュータは グーを出したよ")
when 1
speak("コンピュータは チョキを出したよ")
else
speak("コンピュータは パーを出したよ")
end

できた! ちょっとしたゲームなら、これでつくれそうね

なお、理解したかどうかの確認なので、
コメントに回答を書かないでください
<連載一覧>
第01回 変数と数値をマスターしよう
第02回 変数と文字列をマスターしよう
第03回 変数とフラグをマスターしよう
第04回 配列変数をマスターしよう
第05回 通常変数をマスターしよう
第06回 数値の応用をマスターしよう
第07回 時間の動作をマスターしよう
第08回 ユーザ定義関数をマスターしよう
第09回 スクリプト用語のまとめ
あと、問題02、最後のは仕様ですか?
記載内容ミスです。
該当箇所を修正いたしました。