Kurter's Workshop

かーたーによるドミニオンのシミュレーション

Bone of my Simulator

いざ書き始めようとすると、結構大変なことに気が付いたかーたー、残念だったな…

 

 

とりあえず、各検証やそれに使用したアルゴリズムの説明を行うため、その土台となる部分の説明をしておこうと思いました。

 

 このシミュレーターはエクセルVBAで作成されております。

デッキや捨て札等、並び順が関係してくる変数を格納するためのシート(シート1とする)と、結果を出力しておくためのシート(シート2とする)、その他のプログラム部分から構成されています。

各カードは種類ごとに固有の番号を持っています。銅貨は0、銀貨は1、屋敷は10、鍛冶屋は20、等です。

これらの番号をシート1上で動かすか、或いはその他の派生した変数(例えば、プレイヤー0の手札にある銀貨枚数 cardInHand(0, 1))を動かすことで、カードの動きを管理します。

出力時は、視覚的な分かりやすさのため、番号ではなく、割り当てられた出力用変数を使用して表示されます。例えば、銅貨は"銅"、銀貨は"銀"、屋敷は"屋"、鍛冶屋は"鍛"、を使っています。

 

 

シート1の概要

各行が異なる種類の情報を格納します。

 

1行目はデッキ用の格納スペースで、列が若い程デッキの底の扱いになっています。

このため、カードを引くという動作は、最も右端のカードに対して行います。

 

2行目は手札用のスペースですが、データは格納しません。

最初期には使用していたので残している面もあるのですが、プログラム上、手札であるということを2で表すことにしているので、いちおう残しています。

 

3行目はプレイエリア用のスペースですが、こちらもデータを格納しません。

 

4行目はディスカード用のスペースです。

ディスカードは、順番を必ずしも必要としませんが、リシャッフル時には順番を与えなければならないため、用意しています。

 

5行目はリシャッフル時に必要な乱数生成用のスペースです。

 

6行目は持続用のスペースです。

本来のドミニオンには存在しませんが、カードが持続するか否かを区別するために、プレイエリアとは別に用意しました。

持続効果を持つカードはプレイ時にこのエリアに移動し、持続効果の発動時、または持続効果を持たずにディスカードされることが決まった時に、プレイエリアに移動します。

また、道具等の自身に関連して脇に避けるカードに対応するために、順番が必要になります。

 

7行目は公開用のエリアです。

現状は他プレイヤーに対する公開と、自分だけが見ることの区別をつける必要がないため、両方ともこちらで扱います。

デッキの上1枚だけを公開するような場合だと、単にデッキの一番上を参照するだけで、処理することもあります。

 

8行目は酒場マット用のエリアです。

このあたりまで来ると、関係しているカードが少なく、変数を用意するよりも簡単と思われたので、用意しています。(基本的に、変数のセットはカードセット全体に対して用意することになってしまう)

 

9行目は、脇に避ける用のエリアです。

召喚等、特別にマーカーが無い場合、こちらを使います。

 

10-14行目は、現状は空きエリアですが、島や原住民の村等、特定のエリアが必要になった場合、随時導入していく可能性があります。

 

15-16行目は、そのゲームにおける出力を、記入しておくエリアです。

各列はターン数に対応し、そのターンの出力内容を格納します。1列目は1ターン、10列目は10ターン、等です。

基本的には、30ターン以内にはほぼ大抵のゲームが終了すると思われ、検証も1ゲームあたり30ターンを上限に設けているため、ターン毎の出力は30列目までとなっています。

31-34列目までは、予期はしているが、起こす予定のなかった動きがあった場合に、その種類を出力するためのスペースにしています。

35-37列目までは、ゲーム終了時の出力で、それぞれ残りコイントークン数、終了ターン数、得点数を出力します。検証次第では別の値を出力する場合もあります。

ゲームが終了する毎に、この結果部分を、シート2にカットアンドペーストします。

出力エリアは、今後出力が複雑化する場合、20行目までは広げる可能性があります。

 

以上が1プレイヤー分の割り当てエリアであり、上記1-20目が、プレイヤー0(変数の都合上0になっている)、21-40行目が、プレイヤー1のエリアとなっています。

今後、プレイヤー2及び3の導入をする場合、同様に41-60行目、61-80目がそれぞれ該当のエリアになります。

 

 

シート2の概要

シート2には、1試行で繰り返されるゲーム数分(最大10000回)だけ、各ゲームの結果が出力されていきます。

 

各ゲームの終了時に、シート1の結果出力部分にあたる、15-16行目、1-37列目を、2行毎に、順番に格納していきます。

試行終了時には、10000ゲームとすると、20000行、37列の出力データが蓄積されます。

 

シート2には予め、38-39列目には平均終了ターン数、8(以下)-30ターンで終了したゲームのそれぞれの積算回数、分散、残りコイントークン数、バグの総出力数、等を計算、出力するようにしてあり、また、各ターンの積算回数を表示するグラフも用意してあります。

 

以上が1プレイヤー分の割り当てであり、上記の1-39列がプレイヤー0、41-79列がプレイヤー1のエリアになっています。

 

試行終了時には、シートを丸ごとカットアンドペーストし、出力部分をクリアするので、条件を変えた連続での試行も行うことができます。

 

 

 

長くなりそうなので、プログラム部分の説明は分割します。