「ぱらめーた計算組み立て講座」     

 ぱらめーた計算組み立て講座



こちらでは、るきあによる「ぱらめーた計算組み立て講座」を開催してございます。
こちらでも、「できないよー」を「できるます。(←どせいさん…。)」にかえることを目指しております。



◆好意度最高のキャラは誰かを見つける方法(同率1位抽出可能な方法もあり。)
◆パラメータ最大のときの確率、最低のときの確率だけほぼ決まってるときの調整法
◆パラメータ変動値に変数を使うことのススメ


 →→→トップページへお戻りの際はブラウザバックでお願いしますm(__)m



※ 他サイト様や書籍様からの単なる抜書きは決してしません(ご紹介はしても…ただの抜書き、かつこの規模では存在意義がヤバいです)。
疑惑も避けるため、他サイト様や書籍様と内容がダブらないように、逐次調査をしていきます。
もしダブってしまった(ている)ことが判明しました場合には、その旨明記、ご紹介致します。
ただし、調査のスピードは正直、遅いです(素人の個人ですもので…)。
そのためもし、まだるきあの気づいていないダブリを発見された場合、宜しければお知らせ下さい。新着情報としてご紹介(匿名希望可能です)→確認しだい、正式にご紹介と致します。

※ もっとスマートな方法も、ありましたらぜひ教えて下さいませ!

メール下さるさいはここをぽちっとお願いします!

◆好意度最高のキャラは誰かを見つける方法(同率1位抽出可能な方法もあり。)

●方法1:比較して分岐する(多分大御所)。
たとえば…
お相手はABCさんの3人としまして、ゲームブック風に書きますと、

1.まずAさんの好意度とBさんのを比較。Aさんの−Bさんのが1以上なら2へ。そうでなきゃ3へ。
2.Aさんのほうのが大きいので、つぎにAさんのとCさんのを比較。Aさんの−Cさんのが1以上なら4へ。そうでなきゃ5へ。
3.Bさんのほうのが大きいので、つぎにBさんのとCさんのを比較。Bさんの−Cさんのが1以上なら6へ。そうでなきゃ7へ。
4.結果発表。Aさんが一番!
5.Cさんが一番!
6.Bさんが一番!
7.Cさんが一番!

っというカンジになるわけです。
正直、このカタチが作ってて一番わかりやすいです。
難点は、3人以上になるとちょっとイヤ(爆)なとこです。
人数が増えると、急にこの部分が多くなるか、難しくなります。

そこで、以下です。

●方法2:計算でなんとかする
(いっぱいいてもそんなにめんどくさくない方法)

…すみません、一旦書いたのですがいろいろ検算してみたら合わないので消しました。数日悩みましたがいまのとこわかりません。どうやってもうまくいかない…
モンダイは結局、総和と総人数だけわかっている状況で、最大の要素の値もしくは近似値を求められるか?? ということになると思うんですけど、どう組み立てても0になってしまう。ちょっと無理みたいです…。


●方法特殊・DSN用:「:」を使う(“ベル鳴らし方式”)。
※DSNのみならず、「計算だけのノードを記述できるソフト」なら、なんででも応用できると思われます
DSNでは、カウンタ内容どうしを直接、計算することはできません。
カウンタ内容どうしの場合、使用可能なのは、それらの内容が等しいか、の判定式「:」だけです。
しかしこれだけあればOKです。
以下に概念を説明します。

用意するカウンタとフラグ。
・各人の好意度用のカウンタ(ABCとする)
・比較対象の数を入れるカウンタ(Dとする)
・「ベルカウンタ」(Eとする)
・「Aとひとしくなったよフラグ(001とする)」
・「Bとひとしくなったよフラグ(002とする)」
・「Cとひとしくなったよフラグ(003とする)」

具体的な方法
(DSNのカウンタにはクセがあるので、その説明を省くため、ここはあえて記述を日本語訳しました。)

#0
(最初の準備)
カウンタD、Eを0にせっと。フラグ001、002、003をオフに。
1へ
#1
(比較して、あてはまるなら内部で“ベルをならし”、フラグをつけます)
カウンタDとAの内容を比較。等しい場合はEを1加算、001をオン。
カウンタDとBの内容を比較。等しい場合はEを1加算、002をオン。
カウンタDとCの内容を比較。等しい場合はEを1加算、003をオン。
2へ
#2
(比較計算ようのカウンタのなかみと、“ベルの鳴った”数を見て、比較計算をやめるか判断。つづけるなら、それはそれ。)
カウンタDがマックス値か、カウンタEが人数-2よりおおきい数値となった場合に、4へ
そうでなきゃ3へ
#3
カウンタDを1加算して1にもどる
#4
(お待ちかねの判定です)
もしカウンタEが人数とひとしいなら、同率一位が複数。5へゆく。001オン002オン(つまりは003いっこだけ、オフ)の場合、Cがマックスの場合の対応へ
001オン003オンの場合、Bがマックスの場合の対応へ
002オン003オンの場合、Aがマックスの場合の対応へ
…ここに残るは「かうんたDがマックスなのに、どれとも等しくならなかった」場合。絶対ありえないはずなのだが、セーフティってことで5へ。
#5
延長戦。
だれとだれが一位なのかは、001、002、003のオンオフをチェックすれば分かる。
対象者を一人ずつ出現させ、サドンデスにするのがおすすめ。


つまりこれは…
カウンタDのなかみを一個ずつふやしながら、各人の好意度カウンタのなかみと等しいか見ていく。
そして「あるカウンタがカウンタDと同じになったぜ」という状態が2回(つまり総人数-1回)発生したら、「まだDと同じになってない」のこりのカウンタが最大値の入ってるカウンタで確定(=そのカウンタの持ち主が最大にらぶらぶの人)ということです。
さらにセーフティとして「あるカウンタがカウンタDと同じになったぜ」という状態がいっきに3回発生しちゃったら(つまり総人数回)、これは複数名同じだったということで延長戦へ分岐させる、というのを付け加えてます。

ちなみにこの方法は、『G+P-RPG』で実際に使用されています。
計算速度も全く問題なしです。DSNでらぶげをつくるなら是非!

※『小さい方からつぶしていく』この方式の利点は、同率一位がいる場合にプレイヤーにえらばせる、て処理ができることです。
『同率一位がいた場合、あらかじめ決めといた優先順位で決定!』の場合は、#0でDをマックス値に設定して、#3では一ずつへらしながら比較をし、“ベルがなった”らその時点で即座に判定の場所に飛んで、オンのフラグみてヒト確定、て方法でOKです。
これの方が、処理早いっちゃ早い、はずです。かなり。人の感覚では、あまり大差ないかもですが…。

●方法特殊・LM用:データベースを使う。
※ ライブメーカーお助け掲示板に過去、投稿しました。
※ ライブメーカーに限らないのですが、ほかにDB扱える作成ソフトまだ知らないのでこう書きました

ライブメーカーの場合、データベースを使うと超わかりやすいです。

概念を説明しますと、

データベースに専用のテーブルを作る。
そこに各キャラの名前と好意度らん作る。
比べたいときがきたら、そのとき各キャラの好意度書き込む。
データベースの項目を好意度順にソートする
一番上位に来た名前をピックアップ

関数がイヤでなければ、そんなにむずかしくはない…はずです。
※DBのテーブルでなく、配列変数でもできそうな気がしますが、ムリのようでした。
配列変数の内容をソートすると、なにもかもがぜんぶソートされるので、この方法には使えないようでした


●方法3:比較する方法2
つぎつぎ比較して、大きい方を残す方法です。
これは、優先順位つけて、ひとりだけを抽出する方法になります。
(なぜかぽろっと忘れてました…)
テキストアドベンチャー風に記述しますとこんなふうです。

0.X=0,Y=0,Z=1,N=Aさん と設定。また各キャラには、優先順位順に整理ナンバーがふってある。ここではAさんは1、Bさんは2、Cさんは3。
1.Yに、整理ナンバーZ番のヒトの好意度を代入。
2.X-Y>=0ならXのほうが大きいと判断(チャンピオン防衛成功ってヤツですな)、3へ
 そうでないなら4へ
3.Zを1加算して、Z>人数ならENDへ。そうでないなら1へ(=次の人と対戦)。
4.チャンピオン交代。XにYの値を代入、NにYに相当する整理ナンバーのヒトの名前を代入。で、3へ。
END Nの内容が、好意度最大のキャラの名前。Xがマックスの好意度。

項目1とか4は使う媒体によって色々記述が変わってくるので(ふつうは全条件式列挙になるだろう)、概念をハッキリさせるためここはあえて日本語訳としました。



◆パラメータ最大のときの確率、最低のときの確率だけほぼ決まってるときの調整法と成功判定式


●とりあえずずばり結果。
その時点での参照パラメータ値-「0〜(100*A)の乱数」>参照パラメータ値の中央値-(成功率ポイントの中央値*A)
なら判定成功。
(A=(基準パラメータ値の最大値−最小値)/(成功率ポイントの最大値−最小値))

●ポイント
Aを出すための、『成功率ポイントの最大値、最小値』の設定がミソ。できれば整数のAが返ってくるような値にするのがいいです。
でなければすくなくとも
・『「成功率ポイントの最大値−最小値」を2とか4とか5とかの倍数…「数を割り切れる数」「循環小数とかを発生させない数」に設定する』 か、 ・いっそ『(基準パラメータ値の最大値−最小値)のとこに修正項目いれて割り切りやすい数に直してしまう』のがいいです。(切り捨てとか面倒だし、なんたって後からアタマがモヤモヤしません)

※ 乱数部分が「0〜(100*A)の乱数」となっている理由は、『精霊使い』を作成しているライブメーカーが、こういう仕様だからです(ランダム値発生関数は、0〜指定値の間での乱数を発生させるから)。
もちろんほかのルールの言語なら、他の書き方もありです。

●この式の利点
・実際割り算してない→早い。「0割ってバグる」こともない。小数出ないので単純
(Aはあらかじめ出しておく数なので定数だし)。
・パラメータが負の数でもOK。
・なにより仕様変更に強い!
※ 設定値の中央値を使ってるので、パラメータや成功確率の上限、下限を拡張しても、上下同じ値ずつなら式を変えなくていい。っていうかいっそのこと、上限下限がいくつかなど忘れ去れる(爆)。
つまりほぼ信念直感だけあれば設置できるので、使い勝手がいいのです。


●詳細な、求めかた説明
☆ これは実際に『精霊使い』で使用の方法ですので、実例を挙げて紹介させて頂きます。実際の調整等のご参考までに…

『精霊使い』では主人公が「会いたい人を呼び寄せる」おまじないをすることができます。
(アンジェの『滝の祈り』効力1日版、てカンジ?)
このおまじないの成功率は、主人公のパラメータ値(…の、計算値。仮にPAとする)によって決まってきます。
これを設定するとき、こう考えました…

PAが最大値のときでも、10%位は失敗の可能性を残しておきたい(リロードだってできるのに、百発百中はつまらない)。
しかし最低のときでも、65%位は成功することにしたい(せっかく体力使っておまじないしたんだし!)。

このとき、『そのときのPA値からそのときの成功率を求める計算』はどう組み立てたらいいのか?
そして『それを使って、実際に成功判定までする』には?

…試行錯誤の末たどり着いたやりかたを、以下にご紹介します。


1.『PA値から、そのときの成功率ポイントを求める計算』の策定

PAの最大値は300、最小値は-300です。
このときの成功率は90%、70%です…
いいかえるなら、
このときの成功率ポイントは90、70です(仮)。

これらから、PA値から成功率を求めることのできる計算Xを求めるための式を組んでみますと

+300X=90
-300X=70

…このまま連立方程式として解いてもよさそうですが、なんとなく不吉なフンイキ(爆)です。
計算がフクザツになる…というか、値がフクザツになるような計算が求められてしまうととてもイヤなので、連立方程式はあきらめて(爆)調査の上微調整する方式とします。

〜調査〜
PAの落差は値が300〜-300なので、600です。
一方で成功率ポイントの落差は値が90〜70なので、20です。
値の変化の割合は、PA:成功率ポイント=30:1になります。

しかし、3の倍数が割る数に来るとこたえが循環小数になるからイヤ(←やっぱり来た来た!)なため、成功率ポイントをいじくります。

〜調整〜
PAの最大値は300、最小値は-300です。(ここはそのまま)
このときの成功率ポイントを95、65(仮2、ここが調整。)
とすると、
PAの落差は、300〜-300までなので、600です。(まんま)
一方で成功率ポイントの落差は95〜65なので、30です(調整の結果)。
値の変化の割合は、PA:成功率ポイント=20:1になります。

20が割る数に来るぶんには超OKですのでこの設定を採用とします!


さて、これですっきりはっきりしました。
値の変化の割合は、PA:成功率ポイント=20:1。
つまり『ここで扱っているモノは、PAが20ポイント上下するごとに、成功率ポイントが1ポイント上下する評価体系だ〜』ということになります。
ちょうどPAの中央値((最大+最小)/2)は0、成功率ポイントの中央値は80なので、
PAの値を20で割ったものをそのまま、80に加えれば、最終的な成功率ポイントが出ます。式に直すと、

PA(※)/20+80=最終的な成功率ポイント
(※本来なら、PA-PA中央値だけど、ここではPA中央値ゼロだから省略!)

となります。


2.成功率ポイント計算の、成功判定への組み込み

PA/20+80=おまじない成功率ポイント。
これが、「0〜100の乱数」よりも大きくなったとき、おまじないは成功です。

式に直すと
PA/20+80-「0〜100の乱数」>0 なら成功。
↑この式を(小数でないように)変形すると
PA+1600-20*「0〜100の乱数」>0
PA+1600-「0〜2000の乱数」>0
PA>「0〜2000の乱数」-1600
(ここで右辺は「-1600〜400」とできそうですが、これはやってはいけないようです。検算すると答えが合わなかったです。)

つまり
PA>「0〜2000の乱数」-1600
なら、おまじない成功。そうでないなら、失敗。
とすればOKです。

↑ さてこれを一般化したカタチで書くと、こうなります。

(※本来なら、PA-PA中央値だけど、中央値ゼロだから省略…)だったので
『その時点での参照パラメータ値-参照パラメータ値の中央値>「0〜(100*A)の乱数」-(成功率ポイントの中央値*A)
(A=(基準パラメータ値の最大値−最小値)/(成功率ポイントの最大値−最小値))』  …なら判定成功。

これでよーやく、求める計算が求まりました!


3.仕上げ。
やっと求まったところで、計算式をもうちょっと変形します。
計算の数が減った方が早くなるので、まとまった定数部分を作っときたいためです。
こんなふうにします…

『その時点での参照パラメータ値-「0〜(100*A)の乱数」>参照パラメータ値の中央値-(成功率ポイントの中央値*A)』

右辺は、システム上の決め事モノなんで、実際ゲームを動かすときにはばっちり定数入れられる…はずです。
これが、冒頭に提示しました計算式です。



◆パラメータ変動値に変数を使うことのススメ

つまりこういうことです。

ふつう、イベントなどでパラメータがかわるときは、
例.

(前略)

#かつおぶしをあげる
(コメント ベスト選択) 好意度A=好意度A+10

#あらまきじゃけ(丸ごと)をあげる
(コメント そこそこ選択) 好意度A=好意度A+5

#ていっ! シャケをくわえた熊ごとあげる!
(コメント ワースト選択) 好意度A=好意度A+1

…などのように書くのがほとんどです。

しかしこの場合、仕様変更するとけっこう大変なことになります。
たとえば
「3選択は少ないから4選択、そこそことわーすとの間にいまいちを追加。  で、そこそこを+7、いまいちを+3にする!」
なおかつ、
「プレーしてみたらやっぱり最大値を増やさないとすぐ全員とらぶらぶになってつまらない。そのためにはベストを12にしないとバランス取りづらい」

などとなった場合、同様のイベントを一つ一つ直すのは大変な手間となります。
(一応初心者、かつ数字センス皆無のH2にとってはままある事態…)

この場合、あらかじめこうしておくと悲劇が防げます。


修正例.(※ 変数名をコトバでつけているのがミソ)

(前略)

#かつおぶしをあげる
(コメント ベスト選択) 好意度A=好意度A+変数「たくさん」

#あらまきじゃけ(丸ごと)をあげる
(コメント そこそこ選択) 好意度A=好意度A+変数「中くらい」

#ていっ! シャケをくわえた熊ごとあげる!
(コメント ワースト選択) 好意度A=好意度A+変数「ちょびっと」


こうすれば数値の修正は、変数「たくさん」「中くらい」「ちょびっと」を直すだけでシナリオ全部に適用されるようになります。

ケースの追加もカンタンです。
上の例だと、これを追加します。

#思い切ってらいだーじゃけっとをあげる
(コメント いまいち選択) 好意度A=好意度A+変数「中の下」


変数名をコトバでつけると、自在に中間段階を設けられますから追加も楽です。
自分でお約束を忘れないよう、ネーミングは単純にして、あまり多くしない方がいいですが…。
(「中の下」「中よりは少ない」「中くらい−」なんてつくると混乱します(泣))

ネーミングを単純にするためには、変数名を「変動・レベル1」などのように数字管理にするのもテではあります。
が、おそらく追加により小数をつけることになりますので、それ前提にシステム作ってるとそこが破綻する恐れがあります
(選択肢番号とケースなんばー、変動値名を連動させてたら一部にだけ、修正のせいでそごが出た…とか)
ので、その対策は考える必要が出てきます。


なお変数名はさりげなくひらがなべた書きがオススメです。
ほかの文字種は全半角をまちがったりします(爆)
数字をアタマにもってくるのはダメなシステムもあるし。
かんじかな交じりとかいろいろな文字種いれてると変換のとこで間違うし…
(以上全て実話です。)
なによりわかりやすいです。
(システムによってはできませんが…(汗))



 →→→トップページへお戻りの際はブラウザバックでお願いしますm(__)m