python でマージャンの点数計算をしてみる (2)

なぜ、マージャンの点数計算を題材として選んだか・・・ややこしいからだ。ここでは、python だが、好きな言語を使って考えてみればよいと思う。

マージャンの戦略を考えたり、プログラム同士を戦わせたり、など色々よくばりたいとは思いつつも、今回は、python 普及が目的なので、マージャンの点数計算に絞りたいと思う。目的/目標を明確にすることは重要だと思う。そうでないと、終わりが見えない。

マージャンを知らない人が読むと素通りされそうなので、ルール等をおおざっぱに説明しておく。

4人で行うゲームで、マンズ1-9(1萬-9萬)/ピンズ1-9(1筒-9筒)/ソーズ1-9(1索-9索)/東南西北白發中それぞれ4枚ずつの牌を使う。

牌が13枚配られ、毎回1枚ずつ引く(ツモ)か、他の人が捨てた牌をもらって(チー/ポン/カン)いき、役が完成したら上がって点がもらえる。

 

点数の計算方法は、基本的には、wikipedia の計算式や、のとおりだ。

おおむね役で決まる(それに応じて符は自動的に決まるので)のだが、例えば、「1萬1萬1萬2萬2萬2萬3萬3萬3萬」は、「1萬2萬3萬/1萬2萬3萬/1萬2萬3萬」とも「1萬1萬1萬/2萬2萬2萬/3萬3萬3萬」とも解釈できるため複雑そうだ。役も沢山あるので、組み合わせも多そうだ。記事を書き出してみたものの、いつ完成するのか・・・

 

順番に並べかえたり、牌の種別を調べたりすることが必要そうに思えるが、まずは、牌のデータの持ち方を決めることにしたい。

萬筒索字牌の種類で並びかえ、数字の小さいものから順に並べることが多いので、萬1、萬2、東、南、西などの文字列でデータを表してみることにしたい。そのほうが print できるし便利だろう。

さて、ポン、チー、カン(明槓-他人の捨てた牌で4枚の組にする、暗槓-自分がツモった牌で4枚の組にする)、など、役数にも影響するので、これらも識別する必要がありそうだ。

とりあえず、データの持ち方は、リストにして、

[“萬1”, “萬2”, …., 同種で順に並んだ3個の牌の組, 同じ牌3個の牌の組, 同じ牌4個の牌の組]

とし、「牌の組」には、他からもらったものか(鳴いた)ものかどうか区別できるような構造にしてみようかと思う。

これを、

[[牌の組, 牌の組, 牌の組, 牌の組, 牌の組], [牌の組, 牌の組, 牌の組, 牌の組, 牌の組],…]

に変形するか、

[牌, 牌, …]

に展開するか

して、役に一致するかを判定すればよいのではなかろうか。

 

つづく・・・かな?w