先日の記事で、ランダムサンプリングの例で「トランプのデッキ」を作る方法をサンプルコードを交えながら紹介したが、今回は「麻雀の配牌」を作ってみようと思う。

全136枚の麻雀牌をPythonで用意する

まずは全136枚の麻雀牌を用意するところから始めよう。

麻雀牌は3種(マンズ・ピンズ・ソーズ)の1~9の牌が4枚ずつと、字牌7種が4枚ずつ、合計136枚で構成されている。

これをPythonのオブジェクトとして生成すると次のとおりとなる。

import pandas as pd

# マンズ、ピンズ、ソーズの頭文字
mps = ['M', 'P', 'S']

# 東、南、西、北、白、発、中
ji = ['t', 'n', 's', 'p', 'h', 'a', 'c']

hai_num = list(range(1, 10))
hai_all = []

# 数牌
for mps_str in mps:
    for num in hai_num:
        hai_all.extend(str(num) + mps_str for _ in range(4))

# 字牌
for ji_str in ji:
    hai_all.extend(ji_str for _ in (range(4)))

yama = pd.Series(hai_all)

# 0      1M
# 1      1M
# 2      1M
# 3      1M
# 4      2M
# 5      2M
# 6      2M
# 7      2M
# 8      3M
# 9      3M
# 10     3M
#        ..
# 130     a
# 131     a
# 132     c
# 133     c
# 134     c
# 135     c
# Length: 136, dtype: object

ヤマから配牌を取る関数を作る

次に配牌の関数を作成する。

def haipai(yama, n=14):
    return yama.sample(n)

では早速、用意した関数を使ってヤマから14枚の牌を取ってみよう。

tehai = haipai(yama)

# 12     4M
# 26     7M
# 20     6M
# 58     6P
# 91     5S
# 55     5P
# 120     p
# 23     6M
# 19     5M
# 94     6S
# 129     a
# 111     t
# 50     4P
# 6      2M
# dtype: object

見事に136枚のヤマの中から、14枚の配牌を得ることができた。

理牌をする関数を用意する

理牌は、手配をソートするだけなので単純だ。

一応これも関数として用意しよう。

def ripai(tehai):
    return tehai.sort_index()

では関数を実行して手配を並び替えてみる。

tehai = ripai(tehai)
# 6      2M
# 12     4M
# 19     5M
# 20     6M
# 23     6M
# 26     7M
# 50     4P
# 55     5P
# 58     6P
# 91     5S
# 94     6S
# 111     t
# 120     p
# 129     a
# dtype: object

理牌してみると分かりやすい。

456の三色が期待できそうな手であることが分かった。