はじめに
ドイツで定番のダイスゲーム「Kniffel(クニッフェル)」と「Zehntausend(ツェーンタウゼント/10000)」の点数ルールを整理し、あわせて「5個のサイコロでゾロ目(5個同じ目)が出る確率」を計算してみます。
Kniffel の点数ルール
Kniffel はアメリカの Yahtzee とほぼ同じゲームです。サイコロ5個を1ターン最大3回まで振り(2回目・3回目は好きなサイコロだけ振り直し可)、13個の役のどれか1つに記入します。
上段(Oberer Teil)
| 役 | 点数 |
|---|---|
| Einser〜Sechser(1〜6) | その目の合計 |
| ボーナス | 上段の合計が63点以上なら +35点 |
63点は「各目を3個ずつ」取った場合の合計((1+2+3+4+5+6)×3)です。
下段(Unterer Teil)
| 役 | 条件 | 点数 |
|---|---|---|
| Dreierpasch | 同じ目が3個以上 | 全ダイスの合計 |
| Viererpasch | 同じ目が4個以上 | 全ダイスの合計 |
| Full House | 3個+2個 | 25点 |
| Kleine Straße | 4連続 | 30点 |
| Große Straße | 5連続 | 40点 |
| Kniffel | 5個同じ目 | 50点 |
| Chance | 何でも | 全ダイスの合計 |
条件を満たさない役に記入する場合は0点になります。
Zehntausend の点数ルール
Zehntausend は Farkle と同系統のゲームで、先に10,000点に到達したプレイヤーが勝ちです(地域ルールの差が大きいので、代表的なものを紹介します)。
- 5個(ルールによっては6個)のサイコロを振り、得点になるサイコロを最低1個取り置く
- 残りを振り直すか、そこで止めて点数を確定するかを選ぶ
- 得点になるサイコロが1つも出なければ、そのターンの点数は0(バースト)
- 全部のサイコロが得点になったら、全部振り直して続行できる
| 組み合わせ | 点数 |
|---|---|
| 1 | 100 |
| 5 | 50 |
| 1が3個 | 1000 |
| 2〜6が3個 | 目×100(例:4が3個=400) |
| 同じ目4個 | 3個の点数×2 |
| 同じ目5個 | 3個の点数×4 |
| ストレート 1-2-3-4-5 | 500(ルールにより異なる) |
| ストレート 2-3-4-5-6 | 750(ルールにより異なる) |
多くのハウスルールでは、最初の得点確定に最低350点や500点が必要です。
実装例(JavaScript)
function scoreZehntausend(dice) {
const c = [0, 0, 0, 0, 0, 0, 0];
dice.forEach(d => c[d]++);
const s = [...dice].sort().join('');
if (s === '12345') return 500;
if (s === '23456') return 750;
let score = 0;
for (let v = 1; v <= 6; v++) {
if (c[v] >= 3) {
const base = v === 1 ? 1000 : v * 100;
score += base * 2 ** (c[v] - 3);
c[v] = 0;
}
}
return score + c[1] * 100 + c[5] * 50;
}
5個のサイコロでゾロ目が出る確率
1回振った場合
1個目は何でもよく、残り4個が同じ目になればよいので
$$P = 6 \times \left(\frac{1}{6}\right)^5 = \frac{1}{6^4} = \frac{1}{1296} \approx 0.077%$$
Kniffel ルール(3回まで振り直し)の場合
最も多い目を残して残りを振り直す最適戦略をとると、マルコフ連鎖で計算でき、1ターンで Kniffel が出る確率は約 4.6%(およそ 1/22)になります。
// 5個中の「最多の目の個数」を状態とする遷移を3回分シミュレーション
function kniffelProbability(trials = 1e6) {
let hit = 0;
for (let t = 0; t < trials; t++) {
let dice = Array.from({ length: 5 }, () => 1 + Math.floor(Math.random() * 6));
for (let r = 1; r < 3; r++) {
const c = [0, 0, 0, 0, 0, 0, 0];
dice.forEach(d => c[d]++);
let keep = 1;
for (let v = 2; v <= 6; v++) if (c[v] > c[keep]) keep = v;
dice = dice.map(d => (d === keep ? d : 1 + Math.floor(Math.random() * 6)));
}
if (dice.every(d => d === dice[0])) hit++;
}
return hit / trials; // ≈ 0.046
}
1回振りの約0.08%と比べると、振り直しによって約60倍も出やすくなることが分かります。
まとめ
- Kniffel は13役を埋めるカテゴリ型、Zehntausend は取り置きと振り直しのリスク判断型
- 5個のゾロ目は1回振りで 1/1296、Kniffel の3回ルールで約4.6%
ブラウザ上の3D物理サイコロで実際に遊べるページも作っています。