koba::blog

小林聡: プログラマです

麻雀の打牌選択アルゴリズム(4)

麻雀の打牌選択アルゴリズム(3) - koba::blog麻雀の副露判断アルゴリズム(4) - koba::blog までである程度の手作りはできるようになったが、和了打点を意識した手作りができていない。例えば

ドラ __s9____
m1m2m3m7m8p1p2p3s1s3s4s8s8 m6

でテンパイした場合、

  • s1 : s2 s5 待ち(両面8枚)の平和 (30符1翻)
  • s4 : s2 待ち(嵌張4枚)の三色、ドラ1 (40符3翻)

となり、打 s4 が有利だが、現在のアルゴリズムは待ちの多さで評価するため s1 を打ってしまう。

この問題を解決するために、テンパイ時に和了打点と待ち枚数から打牌を決定するようにする。和了打点は簡単のために

  • ツモ和了
  • 門前テンパイ時は立直を和了役に加える(一発・裏ドラは考慮しない)

で計算することとすると、上記の例は

  • s1
    • s1 : 2700 x 4 (20符3翻: 立直、門前清自摸和、平和)
    • s0 : 5200 x 1 (20符4翻: 立直、門前清自摸和、平和、赤ドラ x 1)
    • s5 : 2700 x 3 (20符3翻: 立直、門前清自摸和、平和)

→ 合計 24,100 点

  • s4

→ 合計 32,000 点

となり、打 s4 が選択できる。

これを「牌姿の評価値」*1として以下に一般化する。

1. 牌姿が和了形(向聴数 = -1)の場合 (手牌が14枚)

和了打点を評価値とする。
m1m2m3m6m7m8p1p2p3s1s3s8s8 s2
の場合、30符5翻(立直、門前清自摸和、三色同順、ドラ x 1)で 8000点。

2. 牌姿が打牌後の場合 (手牌が13枚、テンパイもこの形)

向聴数の進む牌をツモった場合の評価値 x その牌の枚数 の総和をその牌姿の評価値とする。
m1m2m3m6m7m8p1p2p3s1s3s8s8
聴牌形の場合、待ちは s2 4枚、ツモった場合の打点は8000点なので、評価値は 8000 x 4 = 32,000 となる。

3. 牌姿が打牌可能な状態(ツモの後、副露の後)の場合 (手牌が14枚)

向聴数が戻らない打牌を行った後の牌姿の評価値のうち最大のものを、その牌姿の評価値とする。
m1m2m3m6m7m8p1p2p3s1s3s4s8s8
の場合、打 s1 は 24,100点、打 s4 は 32,000点なので、最大値の32,000点がこの牌姿の評価値となる。

これを再帰的に繰り返せば任意の牌姿の評価値を計算できる。*2

例えば以下の牌姿*3の場合

ドラ __z2____
p6p7p7p8s1s1s2s2s3s4s5z7z7 p0

s1s2 が打牌の候補となるが、その場合の聴牌形は以下のいずれかになる。

No聴牌待ち枚数打点評価値
1 p0p6p6p7p7p8s1s2s3s4s5z7z7
p0p6p7p7p8p9s1s2s3s4s5z7z7
s3 3 400028,000
s6 4 4000
2 p0p6p7p7p8s1s2s3s3s4s5z7z7
p0p6p7p7p8s1s2s3s4s5s6z7z7
p6 3 400028,000
p9 4 4000
3 p0p6p7p7p8s2s2s2s3s4s5z7z7 p6 3 400028,000
p9 4 4000
4 p0p6p7p7p8s1s1s1s3s4s5z7z7 p6 3 520036,400
p9 4 5200
5 p0p6p7p7p8s1s1s3s4s5z7z7z7
p0p6p7p7p8s2s2s3s4s5z7z7z7
p6 3 800055,600
p9 4 7900

No.4 は幺九牌が暗刻になっているためテンパネし、No.3 と比べ打点が高い。No.5 で p6 をツモしたパターンも嵌張待ちにとれるためテンパネする。

s1s2 からそれぞれの上記テンパイに至る枚数は、

打牌聴牌形への待ち牌 評価値
No.1 No.2 No.3 No.4 No.5
s1p6 p9 7枚 s3 s6 7枚 s2 2枚 z7 2枚 559,200
s2p6 p9 7枚 s3 s6 7枚 s1 2枚 z7 2枚 576,000

となるため、No.4 のテンパイがとれる打 s2 が最高の評価値となる。

電脳麻将 ver.0.9 にはこのアルゴリズムを採用する予定。具体的なプログラムについては次回説明する。

*1:確率を使用していないので「期待値」という言い方は避ける

*2:計算時間がかかるため、現実的に計算可能なのは2向聴から

*3:出典: 麻雀 傑作「何切る」300選