HOME > ActionScript > テトリスアルゴリズム > 抽選テーブル

抽選テーブル

均一化

テトリスのアルゴリズムには直接関係ありませんが、抽選結果の均一化を行う為のRandomTableクラス(RandomTable.asファイル)を追加しておきます。
ついでに追加するクラスなのでクラスの詳細については説明しませんが、RandomTableクラスが行う事と使い方だけ説明しておきます。

ソースファイル pt13.zip

RandomTableクラスが行う事

概要

テトリスで利用する場合を例にして説明しますと(そもそも数年前にテトリスに使用する目的で作成したクラスです)、テトリミノパターンが1~7ありその出現率が大体均一になる様な感じにしたいなと考えた時に必要な事は以下の様な事でした。

  • 沢山出現したテトリミノの確立を下げたい
  • あまり出現していないテトリミノの確立を上げたい

基本的に上記2点の事をそのまま行うのがRandomTableクラスです。

new でインスタンス化して使用していきます(main.asファイル 150行目)。
インスタンス化する際に引数で「目」の数と「ポケット」の数を指定します。
例えばテトリスならテトリミノが7パターンあるので目は7。ポケットの数は任意なので100でも200でも構いませんが、少なくとも「目」で指定した数よりは大きくしてください。また、抽選する度に次の抽選に備えて抽選テーブルを作成する仕様になっているので、値が大きければその分計算回数も多くなります。

で、その抽選テーブルについてですが、仮にインスタンス化の際に「目」を7、「ポケット」を256と指定すると、256のポケットがあるルーレットに0~6の目が分布している状態の抽選テーブルを作成するイメージです。

抽選テーブルの作成

このクラスはくじが引かれる度にどの「目」が引かれたのかをカウントします。そして常にその「目」の出現率を基に「多く出現している目のポケットは少なく、少ない出現率の目のポケットは多く」と言う感じに調整しながら、次の抽選に備えて新しい抽選テーブルを用意します。

このクラスを使用する時に利用者が行う事は、インスタンス化の際の「目」と「ポケット」数の指定、その他は実際にくじを引くだけです(main.asファイル 345行目と601行目)が、一応
Publicクラスとしてくじを引く関数のほかにリセット用の関数を用意しています。

実は有利な目

「均一化の為のクラス」と言っておきながら、実は「0」の目が若干有利になっています。と言いますのもポケット数が必ず目の数で割り切れるとは限りません。そのため、余ったポケットについては全て0が割り当てられるようなルーチンになっています。
テトリスの場合この「0」は棒型テトリミノに相当しますので、若干棒型テトリミノが出現しやすくなります。

動作確認

動かない時はFlash画面上を一度クリックしてみてください。
均一均一といいましても、短いスパンを抜き出すと実際には結構偏ります。このクラスを使用していても3~4回くらいの連続は割と目にします。ただ、それ以上の連続は殆ど起きないはずです。
今回はおまけでテトリミノの出現推移を棒グラフで表示するようにしました。数百回くらいの抽選回数ですと結構偏るのが悩ましげですが、長く繰り返していると少しずつ均一化して行く(棒型有利)辺りにちょっとロマンを感じます。

ちなみに棒グラフの棒は一定の高さに到達するとそれ以上は伸びません。

Flashファイルをご覧いただくためには、
アドビシステム株式会社のフラッシュプレーヤー(Flash Player)が必要です。
インストールされていない方は下のボタンから、最新版が無償で入手できます。

Adobe Flash Playerのダウンロード

ソースファイルについて

ソースファイルはasファイルのみです。

使用する環境としてはFlashIDE(動作確認はSC4のみ)を想定していますので。適当に用意したflaファイルに、ダウンロードしたソースファイルをドキュメントクラスとして適切に設定すれば問題無く動作します。
また、コーディングはFlashDevelopを使用して行っておりますので、プロジェクト内にファイルを適切に配置、もしくはクラスパスを設定するなどすればFlashDevelopだけでも問題なく動作します。Stageサイズは幅420px、高さ500pxです。
申し訳ありませんが、ご質問等にはお答えできませんので、ご使用は環境に合わせて各自行ってください。

TOP