ブログ内検索

2019年12月8日日曜日

18-2 ヘブンツリーのプログラム

ビンゴバルーンを待っている間に、ちょっと合間に作った程度なのでプログラムに誤りがあるかもしれない。よって以下に示す情報はシミュレーション結果といえども、確実ではないことに注意。間違いに気づいたらこの記事は取り下げるつもりである。
ただ、いろいろなパターンでちゃんとオッズが計算されていることを確かめたので、たぶん正しいはず…。

プログラムは以下。まずは各種操作の定義。

 oddsmakingという関数は、フロアがアップしていくとき、出現フロアの階層に応じて何倍のオッズが出現するかを規定している。
oddsupという関数は、各フロアのHIT状況を判定し、HITかつそのマスにODDSUPがあればその倍率が加算される。なおその後加算された倍率値は初期化される。でないと毎回その値が加算されてしまうからである。ちなみにFor文でi=1からi=1と一見意味のないことをしているように見えるが、これは関数をひとまとめとして処理するためにやむなく付け加えている。そうしなければセミコロン以降の次の処理が無視されるためである。たぶんこれについてはもっといい方法があるはずだが安直にこれを採用しておいた。
floorup1は現在フロアから何フロア上昇するかを判定する関数。これは途中に出てくる2FUPや3FUPに対してもうまく動くのは一応確認しておいた。
Normというのが中にあるが、要するにNormが0でない、というのはいずれかのマスは必ず0でない、つまりそのフロアから次のフロアへ上昇できる、ということを意味している。
別に愚直に書いても良いが…。(「または」の記号を3つ使うことになる)
floorup2はfloorup1にて取得した上昇階数分、フロア上昇処理を行う。このときにオッズアップマスが生成されるのでoddmakingが役に立つ。また番号はアニマツリーの番号配置の定義に従っている。つまり、次のフロアに出てくる候補の番号は現時点までにすでに出ていない番号であってかつフロア移動後真ん中と下の段と番号がかぶらない番号の中から2つ昇順に選ばれる。この辺りの条件はComplement(補集合)とUnion(和集合)などを使って書いている。


そして用意が整ったのでいよいよゲーム処理実行。
最初の番号を固定しているが、これは別にほかの番号にしてもたぶん確率は変わらないのでこのままでよい。
上の画像ではヘブンツリーなのに中段と上段に番号が4つ配置されているがこれは後で修正した。
あとはまあ特筆すべきことはない…と思う。

これらのプログラムが正しいことを仮定して、以後はシミュレーションの話に移る。
一応いろんなパターンでうまく動作していることを確かめたのでおそらくあっていると思うが…。