麻雀 pythonライブラリまとめ

python
スポンサードリンク

最近麻雀にはまっているので、pythonで何かできないかと探しいるのですが、なかなか情報が少ないです。しかし、いくつかライブラリを見つけたのでまとめました。

スポンサードリンク

mahjong

ライブラリ:

mahjong
Mahjong hands calculation

参考記事:

Pythonライブラリの「麻雀(mahjong)」って?? - Qiita
#「mahjong」みなさん、Pythonに「mahjong」というライブラリがあるのをご存知でしょうか?↓Pythonライブラリ「mahjong」…

pythonの基本的な麻雀ライブラリ

コードサンプル

# ライブラリをインポート
from mahjong.hand_calculating.hand import HandCalculator
from mahjong.tile import TilesConverter
from mahjong.hand_calculating.hand_config import HandConfig
from mahjong.meld import Meld
# タンヤオの上がり
calculator = HandCalculator()

# we had to use all 14 tiles in that array
tiles = TilesConverter.string_to_136_array(man='22444', pin='333567', sou='444')
win_tile = TilesConverter.string_to_136_array(sou='4')[0]

result = calculator.estimate_hand_value(tiles, win_tile)

print(result.han, result.fu)
print(result.cost['main'])
print(result.yaku)
# 符詳細
for fu_item in result.fu_details:
    print(fu_item)
出力結果
1 40
1300
[Tanyao]
{'fu': 30, 'reason': 'base'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 4, 'reason': 'closed_pon'}
{'fu': 2, 'reason': 'open_pon'}

cmajiang

github:

GitHub - TadaoYamaoka/cmajiang: Pythonの麻雀ライブラリ (A mahjong library for Python)
Pythonの麻雀ライブラリ (A mahjong library for Python). Contribute to TadaoYamaoka/cmajiang development by creating an account on...

jupyter notebookで使えば牌姿がsvg画像で出力してくれる。

サンプル

対局を開始し、1巡目でツモを行い、手牌を表示する例。

from cmajiang import *

game = Game()
game.kaiju()
game.qipai()
game.zimo()

game.shoupai[0]
出力結果

和了点数計算

hule(Shoupai("m123p123z1z1,s1-23,z222="), menfeng=0, baopai=["z1"], haidi=True)
海底摸月	1翻
三色同順	1翻
混全帯幺九	1翻
ドラ	3翻
40符 6翻 跳満 18000点

漢字表示してくれるのが見やすくていいです。

mahjong-calculate-generator

麻雀の点数計算の問題を出力してくれるライブラリ

cmajiangと組み合わせて点数計算の問題を出力してくれる。

import time

import pandas as pd
from IPython.display import display
from cmajiang import Shoupai
from mahjong_question_generator import generate_question

n = 1 # 問題数
df = generate_question(n) # n問生成
questions = df.to_dict('records')

for q in questions[:n]:
    print('======================================')
    print(f'場風: {q["round_wind"]}, 自風: {q["player_wind"]}')
    print('ドラ表示牌')
    display(Shoupai(q['dora_str']))
    print('------------------------------------------------------------------')
    print('手牌')
    display(Shoupai(q['hand']))
    print('リーチ' if q['is_riichi'] else '', 'ツモ' if q['is_tsumo'] else 'ロン', '海底摸月' if q['is_haitei'] else '', '河底撈魚' if q['is_houtei'] else '')
    display(Shoupai(q['win_tile']))

    print(f'正解は {q["hand_value_hu"]}符{q["hand_value_han"]}飜, {q["hand_value_cost_additional"]}, {q["hand_value_cost_main"]}です。')
    print(f'役: {q["hand_value_yaku"]}')

出力結果

※hand_value_cost_additional
ロン上がり時: 0点
ツモ上がり時: 親(自風が東)の場合: hand_value_cost_mainと同じ
       子の場合: 子の点数

感想

いくつかライブラリを見つけましたが、麻雀に関する情報が少ないのでプログラミング言語を絞らずにいろいろ探してみようと思いました。時間はかかるけれども一から自分でやってみるのもいいかもしれません。

コメント