こんにちは。
趣味のボドゲ解析の次のターゲットとして、今回はノッカノッカについて調べてみようと思います。
解析するにも、まずはゲームのサイズを見極める必要があるので、局面数について調べていきます。
ノッカノッカとは
二人対戦型のボードゲームです。以前 QuizKnock でも紹介されていました。
www.youtube.com
ノッカノッカの公式サイトがあり、現在もオンラインで購入できるようです。
www.undanoga.com
上記サイトではスマートフォンゲームとしても公開されています。ルールを理解するには実際に遊んでみるのが一番早いかもしれません。どうやらサービス終了しているみたいです。無念。
局面の数え方の作戦
ノッカノッカのルールのうち、局面の数え上げに利用できる特徴を整理します。
- 白と黒のコマを利用する。同色のコマ同士の区別はない。
- 白と黒はそれぞれ5個。ゲーム中増減することはない。
- あるコマが別のコマに乗っかることができる。ただし高さは最大で3。
- コマは 5×6 のマス目上を移動する。
そこで、以下のような2ステップで数えてみることにします。
1. 色のついていないコマ10個の配置の仕方を考える
2. 色の塗り方を考える
作戦実行
色のついていないコマ10個の配置の仕方を考える
ボード上に並べる前に、積まれ方の組み合わせを列挙してみます。1〜3 の組み合わせで、合計が 10 になるものをすべて列挙すると、以下の14組となります。
- (1, 3, 3, 3)
- (2, 2, 3, 3)
- (1, 1, 2, 3, 3)
- (1, 1, 1, 1, 3, 3)
- (1, 2, 2, 2, 3)
- (1, 1, 1, 2, 2, 3)
- (1, 1, 1, 1, 1, 2, 3)
- (1, 1, 1, 1, 1, 1, 1, 3)
- (2, 2, 2, 2, 2)
- (1, 1, 2, 2, 2, 2)
- (1, 1, 1, 1, 2, 2, 2)
- (1, 1, 1, 1, 1, 1, 2, 2)
- (1, 1, 1, 1, 1, 1, 1, 1, 2)
- (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
これらをボード上に配置する方法を考えます。いくつかピックアップして具体的に考えてみます。
まず (2, 2, 3, 3) について。まず2のスタックを2個並べます。マスは30個あるので、これらの並べ方は 通りになります。次に3のスタックを2個並べます。残りのマスは28個なので、並べ方は
通りになります。これらの積
が全体の並べ方の総数です。
次に (1, 1, 2, 3, 3) を考えてみます。先程と同様の考え方で、以下のように計算できます。
- 1 のスタックの並べ方は
通り
- 2 のスタックの並べ方は
通り
- 3 のスタックの並べ方は
通り
したがって総数は 通りとなります。
一般化しましょう。1 のスタックが 個、2 のスタックが
個、3 のスタックが
個ある場合、並べ方の総数は
以下、それぞれのパターンでの並べ方の総数を表にしたものです。
| スタックの高さの組 | スタック数 | 並べ方の総数 |
|---|---|---|
| (1, 3, 3, 3) | (1, 0, 3) | 109,620 |
| (2, 2, 3, 3) | (0, 2, 2) | 164,430 |
| (1, 1, 2, 3, 3) | (2, 1, 2) | 4,275,180 |
| (1, 1, 1, 1, 3, 3) | (4, 0, 2) | 8,906,625 |
| (1, 2, 2, 2, 3) | (1, 3, 1) | 2,850,120 |
| (1, 1, 1, 2, 2, 3) | (3, 2, 1) | 35,626,500 |
| (1, ..., 1, 2, 3) | (5, 1, 1) | 85,503,600 |
| (1, ..., 1, 3) | (7, 0, 1) | 46,823,400 |
| (2, 2, 2, 2, 2) | (0, 5, 0) | 142,506 |
| (1, 1, 2, 2, 2, 2) | (2, 4, 0) | 8,906,625 |
| (1, ..., 1, 2, 2, 2) | (4, 3, 0) | 71,253,000 |
| (1, ..., 1, 2, 2) | (6, 2, 0) | 163,881,900 |
| (1, ..., 1, 2) | (8, 1, 0) | 128,764,350 |
| (1, ..., 1) | (10, 0, 0) | 30,045,015 |
| 合計 | 587,252,871 |
色の塗り方を考える
各コマに対して、以下の要領で 1〜10 の番号を振ります。
- 30個のマスに 1〜30 の番号をつける
- 上記の番号の順にマスを確認し、コマがあったら下から順番にコマに番号を振る
あとは 1〜10 に対して黒 or 白を対応させる組み合わせを列挙すれば、すべての塗り方が考えられます。これは 通りです。
局面数について考察
以前、Tokyo Doves の局面数を数えた際に、局面数について軽くレビューしました。
smooth-pudding.hatenablog.com
ポイントは以下です。
- 現在人類が完全解析に成功している 6×6 オセロの局面数がおおよそ
- Tokyo Doves の局面数は
- つまり Tokyo Doves はギリギリなんとか完全解析できる可能性がある (後日、実際に完全解析をやりきれた)
今回も、なんと約 という絶妙な数値で、ノッカノッカもギリギリ完全解析できる可能性が見えてきました。ワクワクですね。
ではまた。
おまけ
この記事での計算方法を Python で実装してみました。
NUM_CELLS = 30 NUM_WHITE = 5 NUM_BLACK = 5 def solve_x_2y_3z(rhs: int): """x + 2y + 3z = rhs を満たす非負整数 (x, y, z) を全列挙する""" if rhs < 0: return for z in range(rhs // 3 + 1): for y in range((rhs - 3 * z) // 2 + 1): x = rhs - 2 * y - 3 * z yield x, y, z def main(): import math num_pieces = NUM_BLACK + NUM_WHITE num_patterns = sum( math.comb(NUM_CELLS, x) * math.comb(NUM_CELLS - x, y) * math.comb(NUM_CELLS - x - y, z) for x, y, z in solve_x_2y_3z(num_pieces) ) print(f"パターン総数: {num_patterns:,}") total_positions = num_patterns * math.comb(num_pieces, NUM_BLACK) print(f"総局面数: {total_positions:,}") if __name__ == '__main__': main()
以下で実行できます。
*1:5マスの向きの中央で反転しても、ルール上局面の効果は変わりません。