【プチコン3号】多重分岐の沼にはまる
こんにちは。
前回に引き続き確率計算のプログラムを打っています。プログラムの内容はざっくり言って0~65535の乱数から複数の条件分岐につなげて数値の変動を確認する形です。
使う乱数は、当初おちゃめ氏による線形合同法を目コピして試していました。
しかし、必ず0~4095でループする変数D_Yが530の時乱数が最大値になる状態から動かせない(いわゆるSEED値で乱数テーブルを変えられないような)状態が続き「(今の自分のプログラミングスキルでは)ちょっと使えないかも」……と思ったので、今度は𡈽方 雅之氏がプチコン4のゲーム「KALEIDO TRIGGER」で使用していたXORSHIFT法を目コピしました。
で、結局このユーザ関数D_FPRNDにRND(479232)をぶち込むことで再現性は皆無だがなんとなく小当たりと大当たりがばらついた乱数っぽくはなりました。
まあ任意の加減する変数を使えば全く同じ値が出ることは確認できた(1フレームごとに1増える変数で確認)ので、まだ改善の余地は大です。というか、もう少し理解できるまで誰かに教えてほしいな……と。
条件分岐も単純なIF文の羅列だけでなくELSEIF文にも慣れておこうと思い、試行錯誤した跡を簡易にまとめます。
式の順番が降順か昇順かもめちゃくちゃで、わざわざ比較演算子>=、<=を使わないようにしてるのは上記の画面未更新バグが修正前で何がどうなってIF文に異常をきたしているのかわからなかったためこうなっています。条件分岐なんもわからん。入れ子でもないのに。
'乱数D、フラグ配列MF'
'IF文ベタ打ち'
IF D==65535 THEN MF[1]=15
IF (D>65528 && D<65535) THEN MF[1]=14
'~中略~'
IF (D>32768 && D<49153) THEN MF[1]=2
IF D<32769 THEN MF[1]=1
'ELSEIF'
IF (D<32769)!=0 THEN
MF[1]=1
ELSEIF (D>32768 && D<49153)!=0 THEN
MF[1]=2
'~中略~'
ELSEIF (D>65528 && D<65535)!=0 THEN
MF[1]=14
ELSEIF D==65535 THEN
MF[1]=15
ENDIF
とりあえずこの論理式が成立(true)の時は1、不成立(false)の時は0っていうのはわかったような、わからないような。どちらでもIF文はそれなりに機能しているっぽいので、わざわざ!=0でくくらなくてもよかったような。写経して気づいたけどD==65535はくくってないし。
で、このプログラムをどのようなゲームに活かすのかというと
ちょっとした息抜きとして「かんたん!タイトル・エディター」とkurieita氏の講座からプログラムを抜き書きしてタイトル画面をサクッと作りました。ゴキゲンなBGM9番もつけています。
タイトルは「MEINE×MINE(マイネ×マイン)」
ドイツ語で「私の鉱山」……になるんですかね、一応。実のところ「マイン」をドイツ語めかして「マイネ」と言ってみたかっただけで、あまり正しい言葉ではありません。マイネクラフトという直球の名前を寸前で飲み込んだ
その名の通り、鉱山で土の中から鉱石を掘り出して金を稼ぎ、SHOPなどで売り買いして思い思いのものをクラフトする……ようなゲームになればいいなと思いつつ、実装できているのは「Aボタンを押すと画面がフラッシュしてMONEYが増える」ゲームの中核部分だけです。
バイトヘルクリッカーゲームにも似たつくりですが、例えばボタンを押して掘る作業を自動化したり、お金の増える倍率を上げたりといったインフレーションにはあまり興味がなく、むしろ低確率のレアアイテムを一定確率のまま引き当てるまでのモチベーションを維持するためのゲームデザインがしたい、と考えています。
というのもこのゲームの目的は、夜中にスマホでツイッターや動画サイトを見て徹夜して朝型の生活リズムを乱してしまう悪癖を解消することであり、インターネットにアクセスして不特定多数とつながるような錯覚から多幸感を覚えることや、そこで狩猟採集の本能に溺れてしまうことを阻止できる「甘い水」でなければならないのです。
似たイメージとしてはポケモンのポケルス感染確率(3/65536)があります。VC版で対戦環境を整えようとして毎晩木にずつきを繰り返していたのですが、抽選までの演出をもっと削ぎ落して高速化できたらいいのになと思いました。
ポケモンの厳選ですら最終的には飽きてしまうものですが、片手間にテレビでも見ながらポチポチとしていられる3DSこそ、禁スマホのフィジェットトイに最適なのではないかと考えます。
今後は
とりあえず条件分岐のデータを本編に組み込んでみますが、今のところ賞金が倍々に増えるだけなのでいまいち「この低確率を引いた!」という実感がつかみづらいです。「〇〇を掘り当てた!」というシステムメッセージを出せないこともない(ついでに言えばその個数も控えられる)ですが、なんとも。
今までどちらかというと3DSを30分~一晩放置して「一番気持ちのいいタイミングで1/65535が出ない!」というところに目が行っていたので、具体的なボーナスの中身についてはあまりアイデアを詰めていませんでした。今後はそちらについて深めていくことになりそうです。
お金の使い道(ショップ機能・クラフト機能)については、まあ追々……。それはそれで一個のゲームプログラムを作ることになりそうなので、今の実力ではおいそれと手を出せません。
また何かあれば報告します。それでは。
(終)