[Python] 182 麻雀アプリ 06 自家のみポン可能なミニ麻雀ゲーム

2021年3月18日作成

全家に配牌して、自家のみポンできるミニ麻雀ゲームのコードです。

他家の捨て牌は埋牌後の右端の牌なのでまず和了れません。ここまで書いて結構くたびれました。

鳴いた後に下家の番になるようにするところや、ポンして出来る刻子の扱いに悩まされました。

次はチーやリーチができるようにして、さらに他家も自動的に鳴けるようにしたいです。

コード例
クラスは省略し本文のみ。自家は親番鳴いた牌はリストの左端に2次元リストとして表示。

taku = Taku()
yama = taku.yama

print(f'初期状態の山\n{yama}')
print(f'山の枚数 {len(yama)}\n')

janshi1 = Janshi('自家')
janshi2 = Janshi('下家')
janshi3 = Janshi('対面')
janshi4 = Janshi('上家')
janshi_l = [janshi1,janshi2,janshi3,janshi4]

# 配牌
for j in janshi_l:
    j.haipai()
    print(f'janshi{(janshi_l.index(j))+1} 手牌\n{j.tehai}')

del yama[0:52]
print(f'配牌後の山\n{yama}')
print(f'配牌後 山の枚数 {len(yama)}\n')

# 埋牌
for j in janshi_l:
    j.riipai()
    print(f'janshi{(janshi_l.index(j))+1} 埋牌後手牌\n{j.tehai_all}\n')

# 順番に打牌
meld_l = [0]
countdown = 70
for i in range(18):
    for j in janshi_l:
        if meld_l[-1] == 1 and j == (janshi1 or janshi3 or janshi4):
           pass
        else:
            tsumohai = j.tsumo(yama)
            countdown -= 1
            print(f'残り {countdown}枚')
            print(f'janshi{(janshi_l.index(j))+1} ツモ牌 {tsumohai}')
            j.riipai()

            if j == janshi1:
                print(f'janshi{(janshi_l.index(j))+1} ツモ後手牌\n{j.tehai_all}\n')

            print(f'janshi{(janshi_l.index(j))+1} 向聴数 {j.shanten_calc(j.tehai_all)}')

            if int(j.shanten_calc(j.tehai)) < 0:
                j.hand_result = j.keisan(j.tehai,tsumohai)
                try:
                    j.print_hand_result(j.hand_result)
                except:
                    print('役なしのため和了れません')
                else:
                    print('和了!')
                    sys.exit()
            
            if j == janshi1:
                print('捨て牌を選んでください')
                dahai = input()
                j.dahai(dahai)
            else:
                print(f'janshi{(janshi_l.index(j))+1} 打牌 {j.tehai_all[-1]}')
                j.dahai(j.tehai_all[-1])

                print(f'鳴く場合は牌を入力してください')
                get_hai = input()
            
                if get_hai == '':
                    meld_l.append(0)
                    pass
                elif get_hai != j.sutehai[-1]:
                    print('入力ミスです。もう一度入力してください')
                    get_hai = input()
                else:
                    meld_l.append(1)
                    janshi1.pon(get_hai)
                    print('捨て牌を選んでください')
                    dahai = input()
                    janshi1.dahai(dahai)
                    print(janshi1.tehai)

            print(f'janshi{(janshi_l.index(j))+1} 打牌後手牌\n{j.tehai_all}')
            print(f'janshi{(janshi_l.index(j))+1} 河\n{j.sutehai}\n')

        if countdown == 0:
            print('流局です!')
            sys.exit()
--------------------------------------------------

  出力
--------------------------------------------------
<略>
  残り 14枚
janshi4 ツモ牌 z3
フリー牌 ['m2', 'm6', 'm9', 'p1', 'p1', 'p2', 'p6', 'p6', 'p6', 'p8', 'p9', 's1', 's2', 'z3']
鳴き牌 []
全手牌 ['m2', 'm6', 'm9', 'p1', 'p1', 'p2', 'p6', 'p6', 'p6', 'p8', 'p9', 's1', 's2', 'z3']
janshi4 向聴数 3
janshi4 打牌 z3
鳴く場合は牌を入力してください
z3
捨て牌を選んでください
m8

janshi4 打牌後手牌
['m2', 'm6', 'm9', 'p1', 'p1', 'p2', 'p6', 'p6', 'p6', 'p8', 'p9', 's1', 's2']
janshi4 河
['z5', 'z2', 'z2', 'z2', 'z5', 'z7', 's8', 'z4', 's8', 's6', 's4', 's3', 's2', 'z3']
  <略>
  残り 6枚
janshi1 ツモ牌 m8
フリー牌 ['m2', 'm3', 'm4', 'm6', 'm6', 'm7', 'm7', 's4', 's5', 's6', 'm8']
鳴き牌 [['z3', 'z3', 'z3']]
全手牌 [['z3', 'z3', 'z3'], 'm2', 'm3', 'm4', 'm6', 'm6', 'm7', 'm7', 'm8', 's4', 's5', 's6']
janshi1 ツモ後手牌
[['z3', 'z3', 'z3'], 'm2', 'm3', 'm4', 'm6', 'm6', 'm7', 'm7', 'm8', 's4', 's5', 's6']

janshi1 向聴数 0
捨て牌を選んでください
m7
janshi1 打牌後手牌
[['z3', 'z3', 'z3'], 'm2', 'm3', 'm4', 'm6', 'm6', 'm7', 'm8', 's4', 's5', 's6']
janshi1 河
['z1', 'p1', 's9', 'm9', 'p8', 'p1', 'p4', 'p4', 's5', 'm3', 'p7', 'p7', 'z5', 'm1', 'm8', 's8', 'm7']
  <略>