ボードゲームアリーナでも遊べるボードゲーム、キャントストップ(Can't Stop)の効率の良いプレイを目指し、ダイスの出目の確率を計算するプログラムを作成して検討してみた。
キャントストップ(Can't Stop)とは
すごろくゲームであるが、進む列が複数あるのが特徴。 プレイヤーは各ターンに4つのダイスを振って、それを2つずつ2組に分ける。 ボードには2〜12の数字の列が用意されており、各組の合計と同じ数字の列を1マス進むことができる。 各列はゴールまでのマス目の数が異なっており、出る確率が高い列はマス目が多くなっている。
自分のターンには、以下の条件を満たしている限り何回でもダイスを振ることができる。
- 1ターンに同時に進める列は3列まで。すでにどちらかのプレイヤーがゴールしている列は進むことができない。
- どのダイスの組み合わせでも進める列がなかった場合は失敗となり、現在のターンで進んだ分は無効になり相手のターンになる。
- ダイスを振らずにストップすることもでき、この場合は現在のターンで進んだ分を確定させて相手のターンになる。
これを繰り返していき、3つの列をゴールしたプレイヤーが勝利となる。
詳細なルールは以下のページから。
実際にプレイすると「どの列を進めるべきか?」「もう一度振るべきか?」と迷うことになる。 この際に、どれぐらいの確率で出るのかが把握できていればプレイの参考になりそうなため、計算してみる。
確率計算
適当なスクリプトを書いて確率を計算してみる。 全てのダイス4つの組み合わせについて、2つのダイスを選んだ時に2〜12を作る時ができるかどうかを判定して数え上げる*1。
dice = [1, 2, 3, 4, 5, 6] count = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] for a in dice: for b in dice: for c in dice: for d in dice: tmp = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] tmp[a+b] += 1 tmp[c+d] += 1 tmp[a+c] += 1 tmp[b+d] += 1 tmp[a+d] += 1 tmp[b+c] += 1 for t in range(2, 12+1): if tmp[t] > 0: count[t] += 1 for t in range(2, 12+1): print(t, '{:.2f}'.format(((count[t]*100) / (6*6*6*6))))
結果は以下のようになった。
数 | 確率 | マス数 |
---|---|---|
2 | 13.19% | 3 |
3 | 23.30% | 5 |
4 | 35.57% | 7 |
5 | 44.75% | 9 |
6 | 56.10% | 11 |
7 | 64.35% | 13 |
8 | 56.10% | 11 |
9 | 44.75% | 9 |
10 | 35.57% | 7 |
11 | 23.30% | 5 |
12 | 13.19% | 3 |
7が最も出やすいのは想像通りではあるが、3回に2回程度は出る計算になる。最も出にくい2と12と比較すると、単純計算では5倍ほど出やすいことになる。
ただ、進むべきマス数は5倍以下であるため、これだけみると確率が高い目を狙って進むのが効率が良さそう。
3列を進めている時の確率計算
実際のゲームでは、自分のターンで3列を進めている時に「もう一度振っていいのか?」を判断する場面が多くなるため、こちらも全パターンを計算してみる。
dice = [1, 2, 3, 4, 5, 6] count = {} for a in dice: for b in dice: for c in dice: for d in dice: tmp = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] tmp[a+b] += 1 tmp[c+d] += 1 tmp[a+c] += 1 tmp[b+d] += 1 tmp[a+d] += 1 tmp[b+c] += 1 for x in range(2, 10+1): for y in range (x+1, 11+1): for z in range(y+1, 12+1): if (tmp[x] > 0) or (tmp[y] > 0) or (tmp[z] > 0): if (x, y, z) not in count: count[(x, y, z)] = 1 else: count[(x, y, z)] += 1 for x in range(2, 10+1): for y in range (x+1, 11+1): for z in range(y+1, 12+1): print((x, y, z), '{:.2f}'.format((count[(x, y, z)]*100) / (6*6*6*6)))
結果は以下のようになった*2。
2-3 | 確率 | 2-4 | 確率 | 2-5 | 確率 | 2-6 | 確率 | 2-7 | 確率 | 2-8 | 確率 | 2-9 | 確率 | 2-10 | 確率 | 2-11 | 確率 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | 52.16% | 5 | 65.74% | 6 | 77.01% | 7 | 86.42% | 8 | 89.04% | 9 | 82.25% | 10 | 70.99% | 11 | 57.87% | 12 | 43.83% |
5 | 58.41% | 6 | 75.85% | 7 | 80.94% | 8 | 88.35% | 9 | 83.56% | 10 | 81.56% | 11 | 63.66% | 12 | 55.17% | ||
6 | 68.36% | 7 | 80.71% | 8 | 82.87% | 9 | 83.33% | 10 | 83.33% | 11 | 73.61% | 12 | 63.43% | ||||
7 | 75.23% | 8 | 81.56% | 9 | 76.00% | 10 | 81.10% | 11 | 77.85% | 12 | 73.84% | ||||||
8 | 75.62% | 9 | 75.62% | 10 | 75.62% | 11 | 75.62% | 12 | 78.09% | ||||||||
9 | 71.22% | 10 | 73.84% | 11 | 71.22% | 12 | 73.84% | ||||||||||
10 | 63.43% | 11 | 63.43% | 12 | 63.43% | ||||||||||||
11 | 52.55% | 12 | 55.17% | ||||||||||||||
12 | 43.83% |
3-4 | 確率 | 3-5 | 確率 | 3-6 | 確率 | 3-7 | 確率 | 3-8 | 確率 | 3-9 | 確率 | 3-10 | 確率 | 3-11 | 確率 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
5 | 66.90% | 6 | 77.08% | 7 | 86.50% | 8 | 89.27% | 9 | 83.56% | 10 | 77.85% | 11 | 65.66% | 12 | 52.55% |
6 | 74.23% | 7 | 78.70% | 8 | 85.34% | 9 | 84.26% | 10 | 83.33% | 11 | 70.99% | 12 | 63.43% | ||
7 | 79.09% | 8 | 80.79% | 9 | 82.64% | 10 | 83.56% | 11 | 75.85% | 12 | 71.22% | ||||
8 | 79.63% | 9 | 77.62% | 10 | 82.25% | 11 | 77.62% | 12 | 75.62% | ||||||
9 | 77.85% | 10 | 75.85% | 11 | 75.85% | 12 | 77.85% | ||||||||
10 | 75.62% | 11 | 70.99% | 12 | 73.61% | ||||||||||
11 | 65.66% | 12 | 63.66% | ||||||||||||
12 | 57.87% |
4-5 | 確率 | 4-6 | 確率 | 4-7 | 確率 | 4-8 | 確率 | 4-9 | 確率 | 4-10 | 確率 | 4-11 | 確率 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
6 | 79.63% | 7 | 88.58% | 8 | 90.28% | 9 | 86.27% | 10 | 82.25% | 11 | 75.62% | 12 | 63.43% |
7 | 84.80% | 8 | 91.13% | 9 | 89.27% | 10 | 88.35% | 11 | 75.85% | 12 | 73.84% | ||
8 | 84.57% | 9 | 86.42% | 10 | 87.65% | 11 | 82.25% | 12 | 75.62% | ||||
9 | 79.86% | 10 | 88.35% | 11 | 83.56% | 12 | 81.10% | ||||||
10 | 82.25% | 11 | 83.33% | 12 | 83.33% | ||||||||
11 | 77.85% | 12 | 81.56% | ||||||||||
12 | 70.99% |
5-6 | 確率 | 5-7 | 確率 | 5-8 | 確率 | 5-9 | 確率 | 5-10 | 確率 | 5-11 | 確率 |
---|---|---|---|---|---|---|---|---|---|---|---|
7 | 88.66% | 8 | 91.44% | 9 | 86.65% | 10 | 79.86% | 11 | 77.85% | 12 | 71.22% |
8 | 89.51% | 9 | 85.34% | 10 | 86.42% | 11 | 77.62% | 12 | 75.62% | ||
9 | 86.65% | 10 | 89.27% | 11 | 82.64% | 12 | 76.00% | ||||
10 | 86.27% | 11 | 84.26% | 12 | 83.33% | ||||||
11 | 83.56% | 12 | 83.56% | ||||||||
12 | 82.25% |
6-7 | 確率 | 6-8 | 確率 | 6-9 | 確率 | 6-10 | 確率 | 6-11 | 確率 |
---|---|---|---|---|---|---|---|---|---|
8 | 91.98% | 9 | 89.51% | 10 | 84.57% | 11 | 79.63% | 12 | 75.62% |
9 | 91.44% | 10 | 91.13% | 11 | 80.79% | 12 | 81.56% | ||
10 | 90.28% | 11 | 85.34% | 12 | 82.87% | ||||
11 | 89.27% | 12 | 88.35% | ||||||
12 | 89.04% |
7-8 | 確率 | 7-9 | 確率 | 7-10 | 確率 | 7-11 | 確率 |
---|---|---|---|---|---|---|---|
9 | 88.66% | 10 | 84.80% | 11 | 79.09% | 12 | 75.23% |
10 | 88.58% | 11 | 78.70% | 12 | 80.71% | ||
11 | 86.50% | 12 | 80.94% | ||||
12 | 86.42% |
8-9 | 確率 | 8-10 | 確率 | 8-11 | 確率 |
---|---|---|---|---|---|
10 | 79.63% | 11 | 74.23% | 12 | 68.36% |
11 | 77.08% | 12 | 75.85% | ||
12 | 77.01% |
9-10 | 確率 | 9-11 | 確率 |
---|---|---|---|
11 | 66.90% | 12 | 58.41% |
12 | 65.74% |
10-11 | 確率 |
---|---|
12 | 52.16% |
最も出やすい 6-7-8 の組み合わせでは 91.98% の確率でどれかの列を進めることができる。 これはおよそ25回中23回進める計算になるので、この組み合わせの場合は強気に進めてくるプレイヤーが多いのも納得できる*3。
また、最も出にくい 2-3-12 または 2-11-12 の組み合わせでも 43.83% と、単体で2や12を出すよりもかなり高い確率で進めるので、余裕があるときや一発逆転が必要な場面では狙っていくと良いように思う。
ここまで計算してきたのはあくまでも理論上の確率の話であり、相手があと一手であがりそうな時など勝負しないといけない場面は多くあるので、あくまでゲームを楽しむため参考程度になっていれば幸いである。