麻雀の向聴数のアルゴリズム 雀頭編

猫と麻雀 麻雀のプログラミング

一般手の向聴数

向聴数の公式

向聴数とは聴牌までに必要な有効牌の数であると定義されます。麻雀C言語プログラム集を参考にすると、向聴数の公式は、

\[8 – 2 \times 面子 –  面子候補 – 雀頭\]

と表現できます。ここで、面子の数を \( a \)、面子候補 (搭子、対子)の数を \( b \)、雀頭の有無を \( c \) とすると、向聴数 \( f(a,b,c)\) は、

\[ f(a, b, c) = 8 – 2a – b – c \]

と表現できます。ただし、\( 0 \leq a + b \leq 4 \wedge 0 \leq c \leq 1 \) です。

しかし、

一萬一萬一萬一萬四萬四萬四萬四萬四筒五筒六筒七筒八筒九筒

を公式に当てはめると、\( f(4, 0, 0) = 0\) となり、聴牌となりますが、一萬四萬は雀頭の候補とならないので、\( 1 \) 向聴とする方が良いのかもしれません。これは、\( 5 \) 枚目を待ちとして認めるかという問題なので、定義によっては聴牌としても良いのかもしれません。余談ですが、聴牌ではこの手牌では聴牌宣言を行うことはできす、牌理ツールを使うと \( 1 \) 向聴となります。

したがって、雀頭候補が存在しないときを考慮して、制約を \( 0 \leq a + b \leq 4 \wedge -1 \leq c \leq 1 \) とします。よって、上記の手牌の向聴数は \( f(4, 0, -1) = 1\)となります。また、向聴数の値の範囲は、

\[ -1 \leq f(a, b, c) \leq 8\]

とします。 また、\( f(a, b, c) = -1 \) のときは和了形であることを示します。

雀頭について

上記の向聴数の公式について、\( f(0, 0, -1) = 9 \) となりますが、このような牌の分解の仕方は不適当であるとします。\( c = -1 \) を取るときの向聴数は、\( f(4, 0, -1) \) または \( f(3, 1, -1) \) が最適な分解であることが保証されます。雀頭候補が存在しないという条件は、手牌に \( 4 \) 枚同じ牌があるときに発生します。

手牌に同じ \( 4 \) 枚の牌が \( 1 \) 組あるとき

このとき、\( c = -1 \) という分解の仕方は不適当です。これは、同じ牌 \( 4 \) 枚の牌を手牌から除いたとき、残りは \( 10 \) 枚となります。このとき、\( 10 \) 枚から面子が \( 3 \) 組できるとすると、残った \( 1 \) 枚の牌が雀頭候補となります。このとき、\( f(4, 0, 0) = 0 \) となり聴牌であることが分かります。また、\( 2 \) 面子、\( 1 \) 面子候補では、\( 10 – 3 \times 2 – 2 = 2 \) 枚の牌が雀頭候補となります。このとき、\( f(3, 1, 0) = 1 \) となります。

手牌に同じ \( 4 \) 枚の牌が \( 2 \) 組あるとき

上記の手牌のように、\( 4 \) 面子存在するときに \( c = -1 \) となります。このとき、\( f(4, 0, -1) \) となります。

手牌に同じ \( 4 \) 枚の牌が \( 3 \) 組あるとき

ここで、次の手牌を考えます。

一萬一萬一萬一萬四萬四萬四萬四萬七萬七萬七萬七萬一筒二筒

いわゆる \( 4 \) ブロックしかないので、\( 3 \) 面子と \( 1 \) 面子候補または、\( 3 \) 面子と雀頭候補が存在するという分解の仕方があるので、\( f(3, 1, -1), f(3, 0, 0) \) となります。

同じ \( 4 \) 枚の牌について

上記の議論に関連して、同じ \( 4 \) 枚の牌について考えます。同じ \( 4 \) 枚の牌を槓子として扱わない場合、暗刻または雀頭と面子候補に分けるとします。

暗刻に分解するとき

このとき、暗刻が字牌であれば残りの \( 1 \) 枚の牌は雀頭候補にならないので、孤立牌となります。数牌であれば手牌によって面子候補となる可能性があります。

雀頭と面子候補に分けるとき

このとき、見かけ上は面子候補となりますが、面子となることはないので、このような分解の仕方は正しくありません。

まとめ

向聴数の公式

ここで、面子の数を \( a \)、面子候補 (搭子、対子)の数を \( b \)、雀頭を \( c \) とすると、向聴数 \( f(a,b,c)\) は、

\[ f(a, b, c) = 8 – 2a – b – c \]

と表現できます。ただし、\( 0 \leq a + b \leq 4 \wedge -1 \leq c \leq 1 \) であり、

\[ -1 \leq f(a, b, c) \leq 8\]

を満たします。\( c = 1 \) のときは雀頭が存在し、\( c = 0 \) のときは雀頭候補が存在し、\( c = -1 \) のときは雀頭候補が存在しないことを表します。

 

コメント

タイトルとURLをコピーしました