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