[英語ページはこちら](/wiki/en/boardgamewiki/boardgame/domemo)
13階サークルで作成したドメモの[論文](/wiki/article_of_board_game/)もあります!
## 概要
場の状況から確率に基づく[推理](/wiki/system/detective)と演繹を駆使して、自分が持っている[数字](/wiki/system/number)を考え当てる体験を楽しむボードゲーム。
[TOC]
## 詳細な説明
DOMEMOとは1から7までの[数字](/wiki/system/number)が書かれたカードを、
**その[数字](/wiki/system/number)分の枚数**使用して行うゲームである。
### ゲームの目的
自分に配られたカードの[数字](/wiki/system/number)を当てることである。
### ゲームの流れ
1. 初めに各プレイヤーにカードを配る(配る枚数はプレイする人数によって変わる)。
プレイヤーは自分に配られたカードを自分には見えないように、かつ、相手には見えるように置く。
2. 余ったカードは半分を表、半分を裏にして、全員が見えるように場の中央に置く。
3. プレイヤーは自分の手番に1から7までの[数字](/wiki/system/number)を一つ宣言する。
4. 宣言した[数字](/wiki/system/number)が自分の手札の中にあった場合、該当するカードを1枚だけ取り除く。
5. 上記を繰り返して、自分の手札にある数字をすべて当てれば上がり
重要なのは[数字](/wiki/system/number)が重複していた場合、つまり、1, 2, 6, 6のカードが手札にあった場合、6と宣言しても1枚の6しか当てたことにならないという点である。
## [作家](/wiki/designer)
[アレックス・ランドルフ](/wiki/designer/alex-randolph)
## シミュレーションについて
**論文で考察している内容を少しだけ記載します。**
ここで行うシミュレーションは数字の宣言の仕方についてである。
どのような宣言の仕方が優れているのか、また規則的な宣言の仕方をシミュレーションすることで、何か面白い結果が出るのではないかと思う。
また、pythonでデータ分析を行うはじめの一歩になればと思う。
## 環境
ここでは以下の環境でシミュレーションを行った。
* python3.7
* Windows 10
## シミュレーション結果
使用しているモデルについては後述する実装を確認してほしい。
### 低い数から宣言するプレイヤーモデル
**LowNumberPlayerModel**を使用。
これは極めて単純なモデルである。
すなわち、相手がどんな発言をしようと、どんなカードがプレイヤーに見えていようとも、次のように宣言していく。
「 1, 2, 3, 4, 5, 6, 7, 1, 2, ・・・」
このモデルの最も大きな欠点は、自分が確認できる情報源、すなわち相手のカードや場のカード、を無視しているという点であろう。例えば、極端な話だが場に「 1, 2, 2, 3 」がある場合でも「1」と「2」を宣言してしまうのである。
強みとしては、はじめの宣言時に「1」や「2」といった他のプレイヤーが宣言しにくい数字を言えるというところだろう。「1」を持っているプレイヤーからすれば、誰かに「1」と言われた時点で、自分の手札には「1」が無いと思い込んでしまう。
上記のプレイヤーモデルで 10000 回ゲームを行った結果である。
[image:9 size:large]
低い数から宣言するモデル(10000回シミュレーションの結果)
横軸が終了までの宣言回数、縦軸がその宣言回数で終了したゲーム回数である。
最小宣言回数である 4 回も存在しているが、 7 回が最も多い。特徴的なのは 7 回、14 回、 21 回、 28 回に極大値があるという点である。これは7と宣言したタイミングで終了した回が多いことを意味している。7は最もカード枚数が多いため、結果自分の手札に存在する確率が高い。このモデルでは「7」と宣言出来るタイミングは7の倍数回目であるため、そこに極大値がある。
また、 7 回目が最大値であるが 7 回目と 14 回目で上がったゲーム回数に比べて、21回目、28回目で上がった回数が極端に低いことから、自分の手札にある7の枚数は1枚か、2枚である場合が多いと言える。
このモデルは終了までの宣言回数が 28 回を超えることがない。これはこのモデルの特徴的な点である。
### 高い数から宣言するプレイヤーモデル
**HighNumberPlayerModel**を使用。
このモデルは低い数から宣言するプレイヤーモデルと真逆のモデルと言える。宣言の仕方は次のようになる。
「 7, 6, 5, 4, 3, 2, 1, 7, 6 ・・・」
7から宣言していくという点は、確率の観点からすれば、高く評価出来る。7は7枚存在するわけであるから、7が自分の手札にある可能性が最も高く、その次は6と順々に低い数になっていく。このことは、すべてのカードが伏せられている状態を考えるとわかりやすい。28枚のカードがあり、完全な第三者が宣言した数がプレイヤーの手札にあるかどうかを判断するのである。プレイヤーには全く情報がないため、確率的に考えれば
7が自分の手札にある確率が最も高くなる。
上記のプレイヤーモデルで 10000 回ゲームを行った結果である。
[image:10 size:large]
高い数から宣言するモデル(10000回シミュレーションの結果)
特筆するべき点は、最小回数である 4 回目で終わる回が低い数から宣言するモデルよりも多く、最大回数が25回であるということである。また、周期的に極大値をがあった低い数から宣言するモデルと異なり、8回目をピークに持っている。8回目がピークになっている点については次のように考えられる。まず、7回目までですべての数を1度宣言したことになるため、手札の数に重複がない場合は7回目まででゲームが終了することになる。8回目からは2度目の宣言になる。7を宣言する8回目が最も大きいということから、7が最も重複しやすい数だと言える。これは7が最も枚数の多いカードであるという点を裏付けている。
つまり、 7 がもっとも重複しやすく、 6, 5, 4, 3, 2 と重複する確率は減少し、1が重複する確率は0になる。
このように考えると、このモデルの最大宣言回数は低い数から宣言するモデルと異なり、28回も無いことに気がつく。2周目で自分の手札に1がある確率は0になり、同様に3週目では2がある確率が0になる。抽象的に言えばn週目にn-1のカードがある確率は必ず0になる。このゲームでは4枚のカードを当てればいいので、4週目までで必ず終了するが、4週目においては 3, 2, 1 のカードが無いため、4まで宣言した時点で必ず上がれる。
したがって、最大宣言回数は7の3倍、21に4週目で宣言する可能性のある 7, 6, 5, 4 という4つの数字を足して、25回であると言える。
以上のことから、高い数から宣言するモデルと低い数から宣言するモデルを比較すると、高い数から宣言するモデルのほうが優れていることが分かる。
### ランダムに宣言するモデル ( ただし自分が宣言して外れだった数は除く )
**RandomNumberWithoutOncePlayerModel**を使用。
このモデルは宣言自体は 1 から 7 までの数をランダムに選択し行う。ただしそれだと結果はわかりきっているので、自分が一度宣言して外れた数字は二度と宣言しないことにする。
つまり次のような宣言になる。
「 4( ハズレ ), 5( アタリ ), 5( ハズレ ) ・・・」※ただし、 4, 5 は一度外しているので宣言しない。
このモデルは高い数から宣言するモデル、低い数から宣言するモデルと比べてかなり賢くなっているが、公開情報を利用していないという点は共通している。つまり、相手の手札と場に表になっているカードの情報を全く参照していない。
上記のプレイヤーモデルで 10000 回ゲームを行った結果である。
[image:12 size:large]
ランダムに数字を宣言するモデル、ただし一度宣言して外した数は言わない(10000回シミュレーションの結果)
特徴的なのは右上がりのグラフになっており、かつ最大宣言回数が10回であるという点である。また10000回の内、10回宣言して終了したゲーム回数が最も多い結果になっている。
まず、このモデルにおいて、具体的な数字の宣言を見ていく。
例えば1つも数字が重複していない場合「1, 2, 3, 4」を考える。このときの最小宣言回数は4回、すなわち「1, 2, 3, 4」と宣言した場合になる。一方で最大宣言回数を考える。「7, 6, 5」と最初に3回宣言した場合、4回目の宣言以降は「7, 6, 5」は宣言しないため、「1, 2, 3, 4」のいずれかを宣言することになる。
4回目に「4」と宣言した場合は、5回目以降は引き続き「1, 2, 3, 4」のいずれかを宣言することになる。「4」は正解の数字だからである。
ここで5回目に再び「4」を宣言するとこれは外れなので、6回目以降は「4」を宣言しない。
6回目で「3」と宣言し、7回目も同様に「3」と宣言した場合は8回目以降「3」と宣言しない。この時点で残りの手札は「1, 2」の2枚である。8回目に「2」と宣言し9回目にも「2」と宣言すれば10回目に宣言出来るのは「1」のみになり、10回目でゲームが終了する。
値が重複している場合も同様に考えることが出来る。「1, 2, 2, 3」であれば、「4, 5, 6, 7」は1回しか宣言することが出来ず、「1, 3」は2回までしか宣言できない。
つまり合計8回宣言した時点で「2」のみしか宣言できなくなり、10回目の宣言で必ずゲームが終わる。
これは自分の手札に、ある数nがm枚含まれている場合、その数nはm + 1回しか宣言することが出来ないと言える。nは7種類あり、mの最大値は4である。
以上のことから、どのような場合もこのモデルを使用すると最大宣言回数は10回となる。
もう一つの重要な点としては最大宣言回数が最頻出していることである。これは公開情報なしにドメモを行った場合、その終了までの回数が10回に収束することを示している。
何が言いたいかといえば、例え相手がどのようなブラフを言ったとしても、真面目にやっている限り、宣言回数が10回を超えることは無いということである。
逆説的に言えば、ブラフを何回言ったとしても、得られる最大の効果は相手の勝利を6回遅らせるだけしかならないということである。
### 一般的なプレイヤーの思考モデル
**NormalPlayerModel**を使用
これまでのモデルはかなり特殊な例を扱ってきた。なぜならば、公開情報を全く活用していないモデルたちであったからである。一般的なプレイヤーは目隠しをしてこのゲームをしているわけではないので公開されている相手の手札と場の情報を見ることが出来る。
単純に考えれば、プレイ人数が5人の場合、使用しているカードが28枚で、自分以外のプレイヤーが持っているカードの合計が16枚、場に表になっているカードが4枚あるため、非公開なカードは8枚だけである。
一般的なプレイヤーは、公開されている情報から宣言する数字を絞り込むことが可能である。例えば、4が4枚見えているのにもかかわらず、4と宣言する必要はない。
このモデルでは、自分が宣言したカードが外れだった場合、二度と宣言しない上に、上記のようにある数nがn枚公開されている場合はその数nも宣言しない。このいずれにも当てはまらないカードをランダムで宣言する。
場「 2, 2, 3, 4 」、「 1( ハズレ ), 3, 4, ・・・」※既に場に 2 があるので 2 は言わない。
上記のプレイヤーモデルで 10000 回ゲームを行った結果である。
[image:11 size:large]
一般的なプレイヤーの思考モデル(10000回シミュレーションの結果)
このモデルでは最大宣言回数が8回、最頻出宣言回数が6回となっている。
最大宣言回数が8回なのはプレイヤー人数が5人であることも起因している。これは非公開のカード枚数が8枚であるため、真面目に宣言すれば8回以内でゲームを終了することが出来るということを表している。
特徴的なのは最頻出回数が6回であるという点である。これは単純に最小宣言回数と最大宣言回数の中間値であるということを示している。
また、5回宣言して終わる場合よりも7回宣言して終わる確率が高いという点は目を引く。各プレイヤーの力量にもよるが、6回か7回の宣言回数が一般的だと言えるのだろう。
6回が最頻出値だという点から、勝利するためにはブラフは1回までに留める必要がある。ブラフを全く気にしないプレイヤーは6回目で上がってしまう確率が高いため、5回目で勝つためには1回しか無駄な宣言を行うことが出来ないのである。