麻雀は日本で人気のあるテーブルゲームで、多くの人が楽しんでいます。Pythonを使用して、麻雀の手役を自動的に判定する方法を紹介します。

麻雀の手役

麻雀には、複数の牌を組み合わせてできる手役が存在します。代表的な手役には「役牌」「一盃口」「断么九」といったものがあります。

麻雀の牌を表現する

Pythonで麻雀の手役を判定するために、まずは麻雀の牌を表現する必要があります。牌を表現する方法はいくつかありますが、ここではリストを使用して表現する方法を紹介します。

pai = ["東", "東", "南", "南", "西", "西", "北", "北", "一萬", "一萬", "一萬", "二萬", "二萬", "三萬", "四萬"]

上記の例では、14枚の牌をリストで表現しています。東南西北の風牌と、1萬から4萬までの萬子牌が含まれています。

手役を判定する

牌を表現する方法が分かったので、次は手役を判定する方法について説明します。ここでは、mjaigymというライブラリを使用して手役を判定します。

from mjai.shanten import Shanten
from mjai.hand import Hand

def check_yaku(pai):
    hand = Hand(pai)
    shanten = Shanten(hand, [])
    return shanten.get_num_yaochus() == 0

上記のコードでは、mjaiライブラリのShantenクラスを使用して手のシャンテン数を計算し、get_num_yaochus()メソッドを使用して役牌を含まない牌の数を取得しています。get_num_yaochus()メソッドの戻り値が0であれば、役が成立していることになります。

実行例

上記の関数を使用して、実際に手役を判定する例を紹介します。

pai1 = ["東", "東", "東", "南", "南", "西", "西", "西", "北", "北", "一萬", "二萬", "三萬", "四萬"]
pai2 = ["一萬", "一萬", "一萬", "二萬", "三萬", "四", "五萬", "五萬", "五萬", "六萬", "七萬", "八萬", "九萬"]

print(check_yaku(pai1))  # False
print(check_yaku(pai2))  # True

上記の例では、それぞれ異なる手牌を表現するリストを作成し、check_yaku()関数を使用して手役を判定しています。結果として、1つ目の手牌では役が成立しておらず、2つ目の手牌では「一盃口」が成立していることが分かります。

まとめ

以上がPythonを使用して麻雀の手役を自動的に判定する方法についての説明です。Pythonを使用して麻雀をプレイする場合や、麻雀AIの開発に役立つかもしれません。