里々で重み付き確率を取り入れたランダムトークの実装方法を考える
この記事は里々で重み付き確率を取り入れたランダムトークの実装方法について、複数のパターンを考えるものである。
まず確率について。
通常の確率と言えば六面体のサイコロを転がした場合を考えれば良い。6分の1の確率でそれぞれの数字が出る。
では重み付き確率というのは何かと言うと、結果が偏る場合である。これは赤の玉が二つ、青の玉が一つ、合計三つの玉が入った箱の中から、中を見ずに一個引いた場合のようなものである。この場合、三分の二の確率で赤が、三分の一の確率で青が出る事となる。
では、まず里々で通常の確率を取り入れたランダムトークを検討する。
これは単純であり、簡単にできる。
例えば以下のようにするとしよう。
――
*
:ごはん、たべたい!
>ごはんいろいろ
*ごはんいろいろ
:白米がいいな
*ごはんいろいろ
:混ぜご飯がいいな
――
この書き方ならば、二分の一で白米と混ぜご飯が抽選される。
別にこれを
――
*
:ごはん、たべたい!
(ごはんリスト)がいいな
@ごはんリスト
白米
混ぜご飯
――
としても良い。どちらにしろ抽選は平等である。
こういった、いわゆる「同様に確からしい」確率を取り入れたランダムトークは多くのゴーストで見られる。
ここまでが前置きである。
では重み付きランダムトークの実装を考える。
デザートに関するランダムトークを考える事にする。まず基盤を作る。
――
*
:デザート、たべたい!
(デザートリスト)がいいな
@デザートリスト
いちご
りんご
バナナ
ナシ
チョコレート
――
「@デザートリスト」の単語群から、「いちご」と「りんご」をパターンA、「バナナ」をパターンB、「ナシ」と「チョコレート」をパターンCのランダムトークに分岐させる事を考える。
案一。力業。列挙。これも間違いなく、重み付きで分岐できる。
数が多くなってくると辛い。
――
*
:デザート、たべたい!
>デザートたべたいね
*デザートたべたいね
:いちごがいいな
あかいのがいい!
*デザートたべたいね
:りんごがいいな
あかいのがいい!
*デザートたべたいね
:バナナがいいな
きいろいのがいい!
*デザートたべたいね
:ナシがいいな
きょうはそんなきぶん
*デザートたべたいね
:チョコレートがいいな
きょうはそんなきぶん
――
案二。(H○)で単語群の単語を引き、条件で分岐。
>ほにゃ【タブ】条件式
にするのか
*ほげほげ【タブ】条件式
にするのかという好みはあるが、今回は前者で紹介。
――
*
:デザート、たべたい!
(デザートリスト)がいいな
>あかいデザートたべたいね【タブ】(H1)==いちご||(H1)==りんご
>きいろいデザートたべたいね【タブ】(H1)==バナナ
>そのほかのデザートたべたいね【タブ】(H1)==ナシ||(H1)チョコレート
*あかいデザートたべたいね
:あかいのがいい!
*きいろいデザートたべたいね
:きいろいのがいい!
*そのほかのデザートたべたいね
:きょうはそんなきぶん
@デザートリスト
いちご
りんご
バナナ
ナシ
チョコレート
――
案三。単語群の各行に(set,関数名,内容)で分岐を記述する。
無限に増やせる。どんな地獄も練成できる。素晴らしい。ちょっと手間。
――
*
:デザート、たべたい!
(デザートリスト)がいいな
>(これ食べる)たべたいね
*あかいデザートたべたいね
:あかいのがいい!
*きいろいデザートたべたいね
:きいろいのがいい!
*そのほかのデザートたべたいね
:きょうはそんなきぶん
@デザートリスト
いちご(set,これ食べる,あかいデザート)
りんご(set,これ食べる,あかいデザート)
バナナ(set,これ食べる,きいろいデザート)
ナシ(set,これ食べる,そのほかのデザート)
チョコレート(set,これ食べる,そのほかのデザート)
――
尚、この重み付き確率を導入したランダムトークについては、私がランダムトーク原案を出した『Arcade game lovers!!』に実装されている。
作者の神夜氏に許可を得て、実際のトーク(と、現在原案として出しているトーク)の辞書を出させて頂く――画像で。
実物が見たい方は当該ゴーストの「dic02_Talk3.txt」に(この記事を更新した現在は)案2で実装したものがあるので、参考にして頂きたい。
この一枚目は案二による実装である。
三種の分岐に該当しないものは汎用として四種目のトークに繋がるようになっている。
但し、この方法だと単語群内部の単語が長くなればなるほど、個数が増えれば増えるほどに管理は煩雑になる。
それを解消したのが案三であり、この二枚目は案三による実装である。
もはや何が何だか分からないが、とにかく最初に「$変数英傑伏兵セリフ分岐」という変数に「汎用」をセット、その後15個の要素がある単語群を引用し、必要ならば変数をセットし直し、9種のランダムトークに分岐させている。
この方式の場合、後から単語群を追加する際に加筆する必要があるのは単語群の項目、そしてset関数で飛ばす先のみである。正直、ちゃんとset関数で飛ばす先が存在するかを確認するのが面倒ではある。こんなトチ狂った実装をするのが根本的に間違いなのは確か。
尚、(set,変数,内容)はランダムトーク内には出力されない。その為、これでも問題無く分岐は作動する。
以上が重み付き確率を用いたランダムトークの実装方法についてである。
もしよろしければ参考にして頂きたい。
PR