はじめてのRmakeスクリプト
第08回 ユーザ定義関数をマスターしよう

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

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

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

分からないところがあったら、過去の記事を読んでみてね
08-01 ユーザ定義関数
前回では時間の動作についてお話しました

今回は、『ユーザ定義関数』についてお話します

「関数」って、ある決まった動作をするまとまりのことだったよね

そうですね Rmakeでは「ユーザ定義」という名前の通り

オリジナルの関数をつくることができます

そんなことも可能なのね

これを使えば、ゲームの仕組みを変えることもできちゃったりするのかな

ゲームのシステムに関連した操作を行いたい場合は、

これまで通り用意されている関数を使う必要がありますが
繰り返し似たような処理を行う場合は、『ユーザ定義関数』にしておくことで

スクリプトを何度も書くという手間を省くことができます

できることは限られているのね

なお、
『ユーザ定義関数』の作成は「def文」を使います
「def文」はdef (関数名)()~endでセットとなっています
#宿屋のユーザ関数
def shopInn()
#変数「s」に表示するメッセージ文字列を入れる
s = "お泊りですか?\n一晩10Gになります"
#speakWithSelect関数の戻り値を元に複数分岐する
case speakWithSelect(2, "はい", "いいえ", s)
when 0
#「0」番目の選択肢が選ばれた場合
speak("ようこそ こちらの部屋へどうぞ")
when 1
#「1」番目の選択肢が選ばれた場合
speak("無茶はされないよう")
end
end
#宿屋のユーザ関数を使う(1回目)
shopInn()
#宿屋のユーザ関数を使う(2回目)
shopInn()

speakWithSelect関数は1度しか書いてないのに、2回表示されたわ

この場合「shopInn」という名前の『ユーザ定義関数』を作成し

その中にspeakWithSelect関数を用意しておいたため

「shopInn関数」を使うことで、繰り返し

speakWithSelect関数の処理が実行されたわけです

「shopInn」が3回書いてあるけど、関数の実行は2回なのね
『ユーザ定義関数』をつくったとき、そこでは内容は実行されません
『ユーザ定義関数』を使ったタイミングで始めて実行されます

だから2回のみ実行されたのね

なお、『ユーザ定義関数』は先に用意されていないと使うことができません

必ず
使用するより前の場所に「def文」でつくっておく必要があります

ということは、複数のイベントやシーンで使用する場合

それぞれのイベントやシーンの始めに、全部書かないといけないの?

複数のイベントやシーンで使用する場合は、

必ず先に実行される仕組みになっている「開始スクリプト」を使うと良いでしょう
複数のイベントやシーンで使用する『ユーザ定義関数』は
「開始スクリプト」につくるようにすればいいのね
08-02 ユーザ定義関数と引数

ユーザ定義関数も他の関数と同様に、値を渡すことができます

この
関数に渡す値のことを『引数』といいます

関数名の後ろについていた、「( )」で囲まれていた値のことね
複数の『引数』を渡したい場合は「,」で区切り、

左から順に「第1引数」「第2引数」・・・といったように

番号をつけて呼ぶこともあります

さっきのspeakWithSelect関数の場合「第4引数」まであったわけね

そうですね それでは実際にスクリプトをみてみましょう
#宿屋のユーザ関数
def shopInn(g)
#変数「s」に表示するメッセージ文字列を入れる
s = "お泊りですか?\n一晩" + toString(g) + "Gになります"
#speakWithSelect関数の戻り値を元に複数分岐する
case speakWithSelect(2, "はい", "いいえ", s)
when 0
#「0」番目の選択肢が選ばれた場合
speak("ようこそ こちらの部屋へどうぞ")
when 1
#「1」番目の選択肢が選ばれた場合
speak("無茶はされないよう")
end
end
#宿屋のユーザ関数を使う
shopInn(50)

全体的な形はさっきとほとんど同じね

先ほどと異なる点は、def文の関数名の後ろの()内に

引数を受け取る変数名が追加されています

「shopInn関数」を使う時に渡している「50」という数値が

変数「g」に入るようになるのね

そのとおりです 後は、変数「g」の値を元に

選択肢で表示されるメッセージが変わるようになっています

ユーザ定義関数の引数を使うようにすることで

状況に応じてユーザ定義関数で動かしたい処理を変えることができるのね
08-03 ユーザ定義関数と戻り値

ユーザ定義関数も他の関数と同様に、戻り値を返すこともできます

なお、
戻り値のことを『返り値』ということもあります
戻り値の設定は「return文」を使用します

「return文」はreturn (値)の形で書き、def文の中に入れる必要があります

どういったときに使うの?

関数を使うことで複雑な計算を行い、計算結果を得る場合や

関数でどういった内容が実行されたか知りたい場合に、

関数の戻り値として結果の値を設定します

いまいち、ピンとこない・・・

実際にスクリプトをみてみましょう
#宿屋のユーザ関数
def shopInn(g)
#変数「s」に表示するメッセージ文字列を入れる
s = "お泊りですか?\n一晩" + toString(g) + "Gになります"
#変数「f」にブーリアン「false」を初期値として入れる
f = false
#speakWithSelect関数の戻り値を元に複数分岐する
case speakWithSelect(2, "はい", "いいえ", s)
when 0
#「0」番目の選択肢が選ばれた場合
speak("ようこそ こちらの部屋へどうぞ")
#変数「f」の値を「true」に変更する
f = true
when 1
#「1」番目の選択肢が選ばれた場合
speak("無茶はされないよう")
end
#関数の戻り値に、変数「f」の値を設定する
return f
end
#宿屋のユーザ関数の結果によって、分岐処理を行う
if shopInn(50)
speak("宿屋に泊まったよ")
else
speak("宿屋に泊まらなかったよ")
end

えっと・・・ shopInn関数が実行されたら、

変数「f」に「false」が入って・・・

選択肢で「はい」が選択された場合だけ、変数「f」が「true」に変わります

つまり、選択した内容を「return文」で戻り値として設定してるのね

最後に「if文」の条件に「shopInn関数」の戻り値を入れることで

表示する内容を切り替えています

関数の中で実行された選択肢の結果が、

戻り値を使うことで、関数の外でも分かるようになるのね
08-04 第08回 まとめ問題集

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

よーっし がんばるよ

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

スクリプトをコピーして、実際に動作させることでチェックしてください
問題01
次のスクリプトにユーザ定義関数を使用して
実行結果が「おはよう」と表示されるよう、行を追加してください
問題02
次のスクリプトにユーザ定義関数と引数を使用して
実行結果が「こんにちは」と表示されるよう、行を追加してください
#ここに追加する
case x
when 0
speak("おはよう")
when 1
speak("こんにちは")
when 2
speak("こんばんは")
end
end
speakAisatu(1)
問題03
次のスクリプトにユーザ定義関数と引数を使用して
実行結果が「こんにちは 勇者様」と表示されるよう、行を追加してください
#ここに追加する
speak(speakAisatu(1) + " 勇者様")

できた! これで、イベントやシーンの作成が簡単になるわね

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