fix: StepTurn回合流转重构 + 碰/杠牌数修正

Root cause:
1. 摸牌在碰/杠检测之前→摸的牌浪费→手牌净减
2. RemoveAll一次删光所有同牌→碰2张变删N张
3. 碰/杠后没让玩家出牌→手牌只减不补
4. 显示只展示手牌不展示暴露副露

修复:
- 重构StepTurn: 先处理LastDiscard反应(碰/杠/胡)
  没人反应才摸牌→决定→出牌
- RemoveAll→Remove 精准删除
- 碰/杠后强制出一张牌
- HandleDiscardReactions替代旧CheckReactions
- RenderFinal展示Exposed副露
This commit is contained in:
xiaoou
2026-07-04 11:29:49 +08:00
parent b871395884
commit c902482d4b
2 changed files with 86 additions and 68 deletions

View File

@ -181,12 +181,19 @@ void RenderFinal(MahjongRoom room)
Console.WriteLine($" 游戏结束,牌墙剩余 {state.Deck.Count} 张");
Console.WriteLine();
Console.WriteLine(" 最终手牌:");
Console.WriteLine(" 最终状态:");
foreach (var p in state.PlayerOrder)
{
var hand = state.Hands[p];
var sorted = string.Join(", ", hand.OrderBy(t => t).Select(MahjongTile.ToString));
Console.WriteLine($" {p}{(p == state.Dealer ? "()" : "")}: {sorted} ({hand.Count}张)");
var exposedStr = "";
if (state.Exposed.TryGetValue(p, out var melds) && melds.Count > 0)
{
var meldDescs = melds.Select(m =>
$"{m.Type}[{string.Join(",", m.Tiles.Select(MahjongTile.ToString))}]");
exposedStr = $" | 已碰/杠: {string.Join(" ", meldDescs)}";
}
Console.WriteLine($" {p}{(p == state.Dealer ? "()" : "")}: {sorted} ({hand.Count}张){exposedStr}");
}
if (state.HuPlayers.Count > 0)