麻雀の局進行のプログラム方式 - koba::blog、麻雀の局進行のプログラム実装 - koba::blog で局進行のための通信方式は説明したので、今回は状態遷移について。
流局判定をのぞくと一局の状態遷移は下図のようになる。
電脳麻将 の局進行を制御するクラスは Majiang.Game
であるが、局進行に関するメソッドは以下の2種類に分けることができる。
- 牌山(
Majiang.Shan
)、手牌(Majiang.Shoupai
)、河(Majiang.He
) の状態を正しく維持し*1、Majiang.Player
へ通知メッセージを送信するメソッド Majiang.Player
からの応答メッセージを受信し、次の処理を選択するメソッド
1 に相当するメソッドの名前は通知するメッセージのtypeと一致する。2 に相当するメソッドは通知したtypeの先頭に reply_
を付加したメソッド名とした。*2
複雑になりすぎるために省略したが、図に記していない状態遷移として以下がある。
自摸処理 (zimo)
- 牌山が尽きたときは流局処理に遷移(荒牌平局もしくは流し満貫)
自摸応答待ち (reply_zimo)
- 応答メッセージのtypeが
'pingju'
(流局)だった場合、流局に遷移(九種九牌)
打牌処理 (dapai)
- 未開槓の槓がある場合、打牌通知の前に開槓通知を送信*3
打牌応答待ち (reply_dapai)
槓処理 (gang)
- 未開槓の槓がある場合、槓通知の前に開槓通知を送信(槓が連続するケース)
- 暗槓の場合、槓通知の前に開槓通知を送信*5