KRXCUBJK

引数・戻り値と握手

2023-12-06

クエストノーツにおける引数・戻り値・その他の何かしらについての記事です。

全然別のプログラミング言語をふわっと独学したアカウントが、類似知識ついでにマスターさんに伝わればいいよねくらいの温度感で書いています。
書き手が両方に対してか~なり中途半端な知識のみのため、プログラミングで扱うガチ定義とはだいぶ異なる部分がありますし、クエノにとっても意訳みたいな感じかもしれません。適当に伝わってください。興味のある人はちゃんとした内容を調べてみてね。

これは2022年クエノアドカレの記事です。

引数と戻り値

引数って何?

引数(ひきすう)と読みます。

googleで引数を調べると(ここは読まなくていいです)「プログラム中で関数やメソッド、サブルーチンなどを呼び出すときに渡す値のこと。」「 「入力」「処理」「出力」のうち「入力」に相当する値」みたいな話が出てきます。
クエノにおいてもだいたい同じ概念ですが、まあこう説明されても難しいのでここでは無視します。でも「渡す値のこと」は真実です(こうしか説明できない気がする)。

ざっくり言うと「イベント間の受け渡しに指定できる値」。
「これを引数として使いなさい」とマスターが指定したり、指定しなくてもなんか勝手に扱われる値があったりします。別に使わなくてもいいけど、あると便利になる~みたいな位置付けです。便利ですね。

具体的な解説を足そうと思って説明の仕方が分からず諦めました。よく分からないのであとでイベント作ってみましょう。とりあえずそういう存在がいると思っておいてください。

引数には\e.Argument@argumentなどの表記があるっぽいです。
これは「こう書くと勝手に引数の内容が表示される合言葉」みたいなやつで、普通の変数における\v[]と一緒です。

戻り値って何?

戻り値(もどりち)。表記は@return

調べると(ここは読まなくていいです)「プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了する際に、呼び出し元に対して渡す値」と出ます。分かんね~

引数が「イベントを呼び出すときに~」なのに対して、戻り値は「イベントが終わったときに~」になるため、位置付け的には引数と対になるやつです。ざっくりね。とりあえずそういう人がいると思っていてください。

使用例

基本の例

イベント呼び出し

引数・戻り値をイベント呼び出しで使うとき、基本形は多分こうなります。

スクショしたときに解説のこと考えてなくてごちゃごちゃしちゃった。ごちゃごちゃしすぎたので飛ばしていいです。右側が解説付きです。全て変数宣言はなし(ローカル変数)。

文字にするとだいたいこう↓なっています。文章だと余計散らかったのでなおのことスルーしてもいい。
下線は青が変数、ピンクが引数(引数扱いの変数)、黄色が戻り値(戻り値扱いの変数)です。

  1. 変数「渡す文字列」に1000を代入。
  2. イベントを呼び出す。コマンドは二枚目の真ん中参照。
    引数に渡す文字列を設定(=引数として渡されるのは1000)。
    戻り値に文字列「これを受け取った」を設定(=戻り値を使いたいときは同名の変数を使う)。
  3. 右側のイベントが呼び出される。
    変数「受け取ったやつ」に引数を代入。これで先程設定した引数(1000)を取得しています。
  4. 受け取ったやつに500足す。つまり1000+500=1500。
    まあここは変数の変化が分かれば何でもいいです。
  5. 戻り値(@return)に受け取ったやつを代入。これが最終的な受け渡しに使われる。
  6. 呼び出したイベントが終了し、元のイベントに戻ってくる。
    呼び出し時に設定した通り、変数「これを受け取った」に戻り値が代入されている。
    \v[]の表記で変数に入った戻り値を表示。
    結果は1500!!

だいたい………こう!!!!!!!!!!

「引数」に記入した内容が呼び出し先で受け取られ、「戻り値」に記入した内容が呼び出しイベント終了後にこのイベントのローカル変数として扱われるやつになります。文字で見ると全然意味が分からないですね。

ともあれだいたいこんな感じになります。ちなみに、引数と戻り値の二つは「必ずセットで使わなければいけない物」ではないです。

イベント呼び出し以外

上記のような「イベント呼び出しで引数を渡す」以外の扱い方もできます。マスターが引数を指定しないときは、なんか勝手に引数の中身を作っておいてくれます。作られる内容はこんな感じらしい。

  • オブジェクトに設定したイベントで引数を使用 → クリックしたオブジェクトのIDみたいなやつ(分からない)が使われる
  • 繰り返し処理イベント内 → 処理に対応する位置の配列変数の中身が取得される([後述]{#array})

みたいな………イベントが起きた場所、処理中の場所が分かる……みたいな感じに思ってもらえればだいたい合っている気がします。

具体例

文字で読んでも全然分からないため、何か作ってみましょう。作りました。

イベント間での受け渡し

一番最初に画像をやったようなイベントです。イベントをまたいで使うやつですね。
共通処理を含むイベントの統合とかができるんじゃないでしょうか。具体例が思い付いたら加筆します。

コントロールを何とかする

コントロールのイベントで引数を使うと、コントロールIDが取得されます。何かそれっぽくやってみます。

テキストコントロールを10個並べました。
コントロールIDはそれぞれ半角の0~9で、全て同じイベントを設定してあります。

どれかのテキストを押すと……

こんな感じ!「何の数字を押したか」が出ましたね~。
もちろん他を押したら他の数字が出ます。3クリックなら3、8クリックなら8。

イベントの内容はこうです。

メッセージイベントだけです。あっさり~!さっきのもこれくらい短く済めばよかったのに。
先に書いた通り引数にコントロールのIDが取得されるため、別の変数とかイベントを作らなくても、表記一つで判別できるというわけです。

電卓

↑だけもなんなので、ちょっと増やしました。

見ての通りの電卓です。やりながら初心者向けプログラミング講座をやっていたときをすごい思い出した。
イベントの中身はこんな感じ。

変数:記号は宣言しておきます。
数字は引き続き共通のイベントひとつで、途中に「記号が+なら足して、記号が-なら引いて……」を付け加えただけです。
+-÷×は別のイベントで、現在選択中の記号を変数に取得しています。最後のメッセージで計算過程を表示。記号イベントもまとめられそうだし他にスマートなやり方がありそうな気がしますがとりあえずこれで。

これで~数字とか記号のコントロールを押すと、こう……

すげ~電卓っぽい。楽しい。…←これじゃなくて普通に=にすればよかった
こういう感じです。

いったん作れると複数桁計算とかやりたくなってきますね。どうやるかは分からない。

そのほか

計算に使うなら例示のようにIDを半角数値に、他に何かやりたいなら文字列IDに。「\e.ArgumentがAの場合」で分岐を作れば、何か……きっと何かができるはずだ………やりようによってはもっとすごいこともできるんじゃないでしょうか。全然思い付かなかったけど……

こういうイベントにおける引数の利点は「=数の分だけイベントを増やす必要がない」ことかなって思います。
別に0~9の10個分イベントを作ってもいいんですけど……まあ数かさむとちょっと面倒だよね……みたいなときにいいかも。慣れたら早いんでしょうね多分。

NPCを指定

こうしたら、イベントの設定された人?NPC?が血を吐いて倒れることになります。
引数にNPCの個人情報が得られるので、NPCごとに別のイベントを作らなくてもいいということです。

と思ったら弾かれたんですけど!?強すぎ?

なんで!?と思っていろいろ試したら、ダメージを入れられるのは最大100dまでっぽかったです。そうなんだ…そういえば♡飲むだけで強くなるとっても素敵なお薬♡も100dっぽい量だった…。

実際何に使えるの?

電卓と血反吐の二択?分からない。各マスターさんの創意工夫で何とかしてください。

(追記)繰り返し処理

記事公開後に様々な知恵を得たので追記です。有識者様方に感謝の100d回復。

繰り返し処理中に引数を使った場合、「配列(の中身の要素)の数だけ繰り返している場合は、変数の中身が引数として使える」そうです。

言葉だけだと長いですね。とりあえず作って試しました。

人を消す

「そのボードの○○なキャラを配列変数に取得し、処理を行う」イベントを作りました。
要はそれぞれの戸籍謄本コピーを集めたあと、引数で別の仕事に使うわけです。こちら。

緑色は配列変数名。
特殊変数のターゲットで気絶キャラを取得し、それを繰り返し処理の「タイプ:配列(=配列の中身の個数回繰り返す)」の中で、引数で非表示にしています。

これを実行すると……

死んでいる人だけ消えた!

これ………戦闘パブボとかですごい見たことある!!!!!!!!!!!こうやってやってたんですね。すげえ…

答え合わせとかする

例2。

テストです。

イベント内容としては「解答が正解と等しい時に加点する」繰り返し処理になります。
加点処理ってのは「(正解だとさえ分かれば)あとは同じ処理でいい」わけなので、繰り返し処理で共通化します。イベント自体より問題を考えるほうに時間がかかったのは内緒です。

↑の問題とか解答入力のイベントは珍しいことをしていないので省略。要約するとこれ。

  • 配列変数「テストの解答」を宣言し、↑の問題への解答をこの配列の0~3番目(計4問なので)にそれぞれ代入しました。
  • また、配列変数「テストの正解」の0~3番目(テストの解答と同じ位置になるように)に問題の正解を入れておきます。

変数はもうちょい区別のつきやすい名前でもよかった。

で、この二つを照らし合わせたら答え合わせが……できる!

答え合わせ。なるほどね~。
羊のしっぽ、忘れがち。

4問くらいなら普通に個別での答え合わせを作ればいいと思うんですが、これが20問以上あるぶ厚い問題集だったりとか、設問を足し減らしの試行錯誤をする段階だったり……とかだと、いちいちそれぞれを確認・修正・変更するのが…とても大変になる……………ので、どこかでまとめれば手間が減るんじゃないかと思います。

参照表記・参照代入

って何?

特殊変数とかを使うときに出てくるやつ。
一般的な定義を調べたら、なんか死ぬほど意味が分からない話しか出てこなくてページを閉じました。呪文か?

←特殊変数の代入(✅参照代入) →変数ウィンドウで出るやつ(参照表記)

難しい話は読み解きたくないので、とりあえず特殊変数の「種類:時間 タイプ:月」の取得で違いを考えてみます。特殊変数は内容をマスター側で定義できない変数のことって感じ。タイプ:月はリアル地球での現在の月(1~12)を取得する特殊変数になります。

記事公開の今は12月なので、閲覧端末の時刻設定が狂っていなければ12が取得されるはずですね。

  • 普通の取得(参照代入ではない)をすると、12が取得されます。ちゃんと今を見ていますね。
  • 参照代入✅付きで取得をすると、\datetime.Monthが取得されます。
    今は\datetime.Month月ってわけですね。何月?

はたして何月なのか分からないこれを、適当にメッセージイベントとかで表示してみましょう。
するとログには\datetime……ではなく「12」が表示されます。ちゃんと今を見ていますね~。つまりはそういうことです。

どういうこと?

通常の代入や取得は「(現在の日時を)取得した結果」が得られるわけですが、参照表記/代入では「(現在の日時を)取得するための表記」自体が得られます。

メッセージイベントに直接「今は12月ですね」と書いた場合、12月以外にプレイした人は時差や時の流れを感じますが、参照代入された変数A(\datetime.Month)を使って「今は \v[変数A] 月ですね」と書いた場合、いつプレイしても現在月が反映されます。

なお……

  • 特殊変数(参照代入ではない)を変数Aに代入した上で「今は\v[A]月ですね」と書く
  • 「今は \datetime.Month 月ですね」と書く

このどちらも見かけは同じ表示になります(今は12月ですね)。ですよね?つまり、どっちを使ってもいいです。
特殊変数の代入(✅参照表記)ならではの使い道はちょっと思い付きませんでした。選択肢が多いと嬉しい、きっとそういうことです。

条件分岐とかで使いたいけど、いちいち特殊変数を取得して代入して~をするのははたるい~って時は、直接ぶっこむと話が早くていいかもしれません。

ところで

この\datetime……と似た表記、さっきどこかで見ましたよね。

そう!\e.Argument!!!!!!!!!!1!!!!!!!!!!!11!!!!!!!!!!!!!!1!!!!!!!!!!!!!!1!!!!!!!!!!!!1111

ずっと言っていた引数\e.Argument自体も参照表記的アレだったというわけです。

引数・戻り値それ自体は中身を持ちませんので、具体的な説明はどうにもできませんでした。違ったらすみませんがそれっぽくて分かりやすいのでよしとしてください。

終わり

引数・戻り値・参照表記を使ったり使わなかったりしよう!