麻将逻辑图
出牌
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|单人[参考单人流程];