ネームバトル系ゲームの最終兵器!?

ADAMの謎に迫る!!

 BASICでネームバトル系のゲーム(名前によってパラメータが変わり、それを用いて戦うゲーム)を作るとき一番の問題になるのはそのパラメータの計算方法です。
 通常は加減乗除を用いて計算しますが、それだとちょっとBASICの知識がある人だと容易に逆算ができ、最強のキャラクタが簡単にできてしまいます。それを防ぐにはどうするかというと乱数を使うのです。乱数では入力するたびに値が変わっていきそうですが、シャープのポケコンの場合「RND(負の数)」として乱数列を初期化してやれば同じ乱数を再び発生させることが可能(N88BASICなどの場合「RANDOMIZE(1〜32767の整数)」とやっても同じようなことが可能)になります。乱数列の初期化に使うのはアスキーコードの合計などにちょっと手を加えてやればよいでしょう。

 10 A=0:N$="(ここに名前を入れてね)"
 20 FOR I=1 TO LEN N$:A=A+ASC MID$(N$,I,1)*I:NEXT
 30 Z=RND -A

 アスキーコードの合計の計算で「*I」としているのは、単純に合計したのでは「ABC」という名前と「ACB」という名前で同じ値になるためです。もちろん、「*I」を「 /I」としてもOKです。
 これにより、逆算をして強いキャラクタを見付けるのはほぼ不可能となります。ここで「ほぼ」と書いたのは「乱数」といっても所詮コンピュータの作り出した「擬似乱数」なのでROMを解析して計算式を捜し出せば逆算が不可能ではないからです。でも、少なくともBASICレベルでは不可能でしょう。

 次に問題になるのはデータの生成部分です。最も簡単なのは次のようなものでしょう。

 100 A=RND 0
 110 PRINT A
(N88BASICの場合 「100 A=RND (1)」)

 このように乱数で単純に作ってしまえば当然のことながらすべての値が一様(Aの値が中央付近の0.5〜0.6の場合も0.9以上の高い値を取る場合も同じ確率になる)になってしまいます。
(グラフ)均等分布

 やはり、能力値の高いキャラクタは出現率を減らして希少価値を高めたいものですね。そこで登場するのが正規乱数です。正規乱数というのは正規分布に従った乱数のことですが、E500シリーズは正規乱数を発生させる命令をもってない(というか普通のポケコン・パソコンのBASICにはない)ので擬似的に作り出してやる必要があります。ここで積分などの難しい計算式を持ち出してもよいのですが、リストが長くなってしまうし、ここでは厳密な正規乱数を要求している訳ではないので簡易的なもので代用することにします。
 複数のサイコロを振ったときにその目の合計はほぼ正規分布に従いますので、これと同じことをBASICでやればよいのです。どうするかというと乱数を何回か発生させてその平均値を出すのです、

 100 P=7
 110 A=0:FOR I=1 TO P:A=A+RND 0:NEXT
 120 A=A/P
 130 PRINT A

(グラフ)正規分布

 これでうまくいったようですが、実は、この方法には方法にも欠点があるのです。それは、あまりに中央付近の値が出やすいということです。
 これのどこに問題があるのか分かりにくいと思いますので具体例を挙げます。例えば、RPGなどで能力値を決める場合、この擬似正規乱数を用いて10〜40の値(当然平均値は25ですね)を発生させた場合、「力25、素早さ23、かしこさ27」のようにあまりに平均値付近の値しか持たない個性のないキャラクタばかり出来てしまうのです。これを防ぐにはPの値を小さくすればある程度発生する値がバラバラになりますが、今度は高い能力の希少性が失われてしまいます。データのばらつきを取るか希少性を取るか悩むところですね。

(グラフ)バラつきについて

 実は、適度にデータがばらついて、なおかつ、高い(低い)能力値が出にくいそんな素晴らしい(?)乱数があるのです。それは正規分布の中央の山の所をペタっと押し潰して平らにしているから、中央部分は均等に分布して外側は正規分布になっているのです。これを私は「中央部平均型正規分布」と名付けました。

 100 P=7:Q=0.4
 110 A=0:FOR I=1 TO P:A=A+RND 0:NEXT
 120 A=A/P*(1-Q)+RND 0*Q
 130 PRINT A

(グラフ)中央部平均型正規分布

 Qの値を変えることによって確率分布の平らになっている部分の範囲を変えることが出来ます。この、リストではQの値は0.4になっていますが、これは、0.5を中心として±0.2の合計0.4ほど平らな部分が出来るという意味です。
 トレカで例えるならば、この平らなところがコモンで回りのところが、アンコまたはレアになるわけです。コモンカードだからといって同じカードばかりが出るわけではないですよね。それと同様にコモン領域(?)では適度にバラついているために同じ数ばかり出て面白く無いということは、まずありません。
 このPやQの値を変えることによって数値のばらつきを思うようにコントロールできるのです。いろいろ変えてみて好みに合ったものにしましょう。

 ちなみにこのシステムの略称は人類の祖先と言い伝えられているアダムと掛けています。あちらが人類ならばこちらはデータ生成の源ですからね。では、イブは・・・それはヒミツです(笑)。
 では、最後にこのADAMのメリットをまとめておきます。

  1. 逆算がほぼ不可能である
  2. 生成する値を簡単にコントロールできる
    • 生成する値に希少性を持たせられる
    • 生成する値をバラつかせることができる

 どうでしょうか。別にネームバトルゲームだけでなく、データ生成が必要な場面(例が思い付かなくてゴメン)でかなり活躍できるはずです。


RETURN

inserted by FC2 system