麻将逻辑图

出牌

graph TD; 出牌-->移除手牌[手牌中移除,添加出牌池]; 移除手牌--> 广播出牌; 广播出牌-->|清除所有玩家的
WAITOUT/HINTOUT|其他玩家{其他玩家是否有
碰/杠/胡}; 其他玩家-->|Y|操作类型[生成HINTOUT/WAITOUT]; 操作类型-->|碰|碰[发送HINTOUT]; 操作类型-->|杠|杠[发送HINTOUT]; 操作类型-->|胡|胡[发送HINTOUT]; 操作类型-->|等待|等待[发送WAITOUT]; 其他玩家-->|N|给下个玩家发牌;

graph TD; 碰-->出牌池减少被碰的牌[被碰玩家牌池移除被碰牌]; 出牌池减少被碰的牌-->手牌中移除玩家碰的牌[碰牌玩家手牌移除对子]; 手牌中移除玩家碰的牌-->|添加碰牌到碰牌列表|增加碰记录[碰牌玩家增加碰记录]; 增加碰记录-->|清除所有玩家的
HINTOUT/WAITOUT|广播碰成功[广播碰成功]; 广播碰成功-->检查暗杠{检查是否
可以暗杠}; 检查暗杠-->生成消息[根据检查结果
生成HINTOUT]; 生成消息-->|杠|杠[发送HINTOUT] 生成消息-->|出牌|出牌[发送HINTOUT]

graph TD; 杠-->判断杠类型{判断杠类型}; 判断杠类型-->|暗杠|移除暗杠牌[移除玩家手中暗
杠的四张牌]; 移除暗杠牌-->添加到杠牌列表; 判断杠类型-->|补杠|去除碰记录[删除碰记录,移除碰
列表中的碰牌,保留
被碰玩家的座位信息]; 去除碰记录-->添加到杠牌列表; 判断杠类型-->|直杠|出牌池移除牌[被杠玩家出牌池
移除被杠牌,
杠牌玩家移除三张杠牌]; 出牌池移除牌-->添加到杠牌列表; 添加到杠牌列表-->增加杠记录; 增加杠记录-->|清除所有玩家的
HINTOUT/WAITOUT|广播杠成功; 广播杠成功-->发牌;

graph TD; 胡-->|清除所有玩家的
HINTOUT/WAITOUT|胡类型{判断胡类型}; 胡类型-->放炮胡; 放炮胡-->移除放炮的牌[移动放炮玩家的放炮牌
至胡牌玩家手牌]; 移除放炮的牌-->广播胡牌[广播胡牌USEOUT]; 胡类型-->抢杠胡; 胡类型-->自摸; 抢杠胡-->移除被抢杠的牌[移动被抢杠玩家的
被抢杠的牌至胡牌玩家手牌] ; 移除被抢杠的牌-->广播胡牌; 自摸--> 广播胡牌[广播胡牌USEOUT];

graph TD; 过-->|清除所有玩家的
HINTOUT/WAITOUT|给下个玩家发牌[给出牌玩家的
下一个玩家发牌];

发牌

graph TD; 发牌[发牌给玩家]-->牌墙减少牌; 牌墙减少牌-->增加手牌[增加玩家的手牌]; 增加手牌 -->|清除所有玩家的
HINTOUT/WAITOUT|检查杠/胡; 检查杠/胡-->胡/杠[根据检查结果
生成HINTOUT]; 胡/杠-->|胡|发送胡[发送HINTOUT]; 胡/杠-->|杠|发送杠[发送HINTOUT]; 胡/杠-->|出牌|发送出牌[发送HINTOUT]; 胡/杠-->|等待|发送等待[给其他没有HINTOUT玩家
发送WAITOUT] ;

多人有HINTOUT,玩家选择碰/杠胡/过

graph TD; 多人[碰/杠/胡/过]-->其他玩家(判断其他玩家是
否有出牌提示); 其他玩家-->|Y|暂存玩家操作; 暂存玩家操作-->回复继续等待[回复继续等待
WAITOUT&&isKeep=true]; 其他玩家-->|N|判断暂存(判断是否有暂存操作); 判断暂存-->|Y|暂存操作[暂存玩家操作]; 暂存操作-->查暂存[从暂存列表中按'胡>杠>碰>过'
查找出可以执行的操作]; 查暂存-->结果[根据查找结果确定
最后执行的流程]; 结果-->|胡|执行胡[参考单人胡流程]; 结果-->|杠|执行杠[参考单人杠流程]; 结果-->|碰|执行碰[参考单人碰流程]; 结果-->|过|执行过[参考单人过流程]; 判断暂存-->|N|单人[参考单人流程];