koba::blog

小林聡: プログラマです

麻雀の局進行の状態遷移

麻雀の局進行のプログラム方式 - koba::blog麻雀の局進行のプログラム実装 - koba::blog で局進行のための通信方式は説明したので、今回は状態遷移について。

流局判定をのぞくと一局の状態遷移は下図のようになる。

f:id:xlc:20170109194331p:plain

電脳麻将 の局進行を制御するクラスは Majiang.Game であるが、局進行に関するメソッドは以下の2種類に分けることができる。

  1. 牌山(Majiang.Shan)、手牌(Majiang.Shoupai)、河(Majiang.He) の状態を正しく維持し*1Majiang.Player へ通知メッセージを送信するメソッド
  2. Majiang.Player からの応答メッセージを受信し、次の処理を選択するメソッド

1 に相当するメソッドの名前は通知するメッセージのtypeと一致する。2 に相当するメソッドは通知したtypeの先頭に reply_ を付加したメソッド名とした。*2

複雑になりすぎるために省略したが、図に記していない状態遷移として以下がある。

自摸処理 (zimo)
  • 牌山が尽きたときは流局処理に遷移(荒牌平局もしくは流し満貫)
自摸応答待ち (reply_zimo)
  • 応答メッセージのtypeが'pingju'(流局)だった場合、流局に遷移(九種九牌)
打牌処理 (dapai)
  • 未開槓の槓がある場合、打牌通知の前に開槓通知を送信*3
打牌応答待ち (reply_dapai)
  • 応答メッセージにtypeが'hule'(和了)のものが3つある場合、流局に遷移(三家和)
  • 応答メッセージに'hule'(和了)がないことを確認後、
    • 立直者が4名いる場合、流局に遷移(四家立直)
    • 第一巡目に同一の風牌が4つ打たれた場合、流局に遷移(四風連打)
    • 4つ槓がある場合、流局に遷移(四開槓)*4
槓処理 (gang)
  • 未開槓の槓がある場合、槓通知の前に開槓通知を送信(槓が連続するケース)
  • 暗槓の場合、槓通知の前に開槓通知を送信*5
槓応答待ち (reply_gang)
  • 応答メッセージにtypeが'hule'(和了)のものが3つある場合、流局に遷移(三家和)

次回は Majiang.Player のプログラム構造について。

*1:画面表示も行う

*2:図中にもメソッド名を記した

*3:これを行わないと他家が槓ドラを見てから和了判断ができないため

*4:1人が4つ槓を行った場合は四槓子聴牌なので続行

*5:これを行わないと暗槓を行ったものが槓ドラを見て打牌を選択できないため