先日の記事で、ランダムサンプリングの例で「トランプのデッキ」を作る方法をサンプルコードを交えながら紹介したが、今回は「麻雀の配牌」を作ってみようと思う。
全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の三色が期待できそうな手であることが分かった。