最近、麻雀にはまっている友人とPythonで遊ぶことになりました。そこで、自動的に牌をツモったときの切り方をシミュレーションするプログラムを作ってみることにしました。

プログラムの概要

プログラムは以下のように動作します。

  1. ツモった牌をランダムに配列で生成する。
  2. 配列を手牌に変換する。
  3. 1から9までの数字を順番に切った場合の待ち牌を計算する。
  4. 待ち牌が複数ある場合は、アガリの期待値が最も高い待ち牌を選択する。
  5. 切る牌を決定し、手牌から取り除く。
  6. 2に戻って繰り返す。

プログラムの実装

import random

# 牌の種類と数
tiles = ["1m", "2m", "3m", "4m", "5m", "6m", "7m", "8m", "9m"]
# ツモった牌をランダムに生成
hand = random.sample(tiles, 13)
# 待ち牌の候補を格納するリスト
candidates = []

while hand:
    # 切り候補のリスト
    potential_discards = []

    # 1から9までの数字を順番に切った場合の待ち牌を計算
    for i in range(1, 10):
        wait_candidates = tiles.copy()
        wait_candidates.remove(str(i) + "m")
        for j in hand:
            wait_candidates.remove(j)
        if len(wait_candidates) == 1:
            candidates.append(wait_candidates[0])
        elif len(wait_candidates) == 2 and wait_candidates[0][0] == wait_candidates[1][0]:
            candidates.append(wait_candidates[0][0] + "z")
        else:
            # アガリの期待値が最も高い待ち牌を選択
            max_expected_value = 0
            best_wait_candidate = ""
            for wait_candidate in wait_candidates:
                expected_value = 0
                for tile in tiles:
                    if tile == wait_candidate:
                        expected_value += 4
                    elif tile[0] == wait_candidate[0]:
                        expected_value += 1
                if expected_value > max_expected_value:
                    max_expected_value = expected_value
                    best_wait_candidate = wait_candidate
            candidates.append(best_wait_candidate)

    # 手牌から切る牌を決定
    for tile in hand:
        if tile in candidates:
            potential_discards.append(tile)
    discard = random.choice(potential_discards)
    hand.remove(discard)

    candidates = []

print("終了")

プログラムの実行結果

プログラムを実行 すると、手牌が13個ある場合について、以下のような出力が得られました。

終了

結論

今回、Pythonで自動麻雀のツモ切りシミュレーションを作成しました。このプログラムを拡張すれば、例えば複数のプレイヤーをシミュレートすることで、どのような牌が出たときに一番勝率が高い切り方ができるのかを分析することができます。また、今回は麻雀を例にして紹介しましたが、同じように様々なゲームやシミュレーションに応用することができます。