このブログを検索

2013/04/06

麻雀の聴牌判定プログラム



を書いてみようと思った。


牌はマンズがm1, m2, ... m9


ピンズが pn, ソーズがsn、字牌を x1, x2 ... x9(東南西北白發中)


とし、136枚のなかから13枚をランダムに選び、配列に格納してソートする。


まず、刻子、順子、対子をさがすプログラムを作った。


ソートした配牌を最初から順に探し、隣り合った牌が同じか連続しているものを選んでいく。


そこまでは難しくない。


まず困ったのは、112233 というようなイーペーコーの形のときだ。


これは並んだ順に探していくと3つのトイツになってしまう。


それから、77789 というような形は77 789でトイツと順子になるが、777 89という刻子とターツの場合がある。


このようなパターンをもれなくあげるにはどうすればよいのか。


チートイツや国士は特別なので後回しにする。





13枚の牌から3枚選ぶパターンは combin(13,3) 通りある。


combin(13,3)通りを列挙する。それらすべての組み合わせのなかからメンツになるものを探していく。メンツになったら、その3枚を配牌からとりのぞく。残り10枚のなかからcombin(10,3)通りを列挙する。その中からメンツになるものを探す。・・・これを残り一枚になるまで繰り返す。


そのパターン数は、combin(13,3) * combin(10,3) * combin(7,3) * combin(4*3) である。


これがタンキ待ちの場合。


アタマがある場合。アタマ候補を列挙する。combin(13,2)。


アタマを除いた11枚から3個ずつメンツ候補を列挙していく。


combin(13,2) * combin(11,3) * combin(8,3) * combin(5, 3)


残った2枚がトイツかターツ(カンチャンかペンチャンかリャンメン)であるかを調べる。