fix: CanAnKong硬编码false + 人类HUD显示听牌/杠/对手状态

修复:
- CanAnKong: 硬编码false → 检查手牌中4张相同(暗杠)
- HumanMahjongPlayer: 添加MeldsSolver依赖,实时检测听牌
- 人类HUD: 显示牌墙/副露/听牌🀄/杠类型(暗/明/加)
- 交互模式人类: 对手显示'X张手牌 | 已pung[..]'不暴露手牌
This commit is contained in:
xiaoou
2026-07-04 17:24:05 +08:00
parent 3c381f2758
commit d416450e56
4 changed files with 81 additions and 25 deletions

View File

@ -146,17 +146,43 @@ else
// Show current hands
if (!room.IsFinished)
{
// In human mode, show only opponent hands (human HUD shows their own)
Console.WriteLine();
Console.WriteLine(" 当前手牌:");
foreach (var p in room.State.PlayerOrder)
if (humanMode)
{
if (!room.State.AlivePlayers.Contains(p)) continue;
var hand = room.State.Hands[p];
Console.WriteLine($" {p}: {string.Join(" ", hand.OrderBy(t => t).Select(MahjongTile.ToString))} ({hand.Count}张)");
Console.WriteLine(" 对手状态:");
foreach (var p in room.State.PlayerOrder)
{
if (p == "AI-东") continue; // skip human
if (!room.State.AlivePlayers.Contains(p)) continue;
var hand = room.State.Hands[p];
var exposedStr = "";
if (room.State.Exposed.TryGetValue(p, out var melds) && melds.Count > 0)
{
var descs = melds.Select(m =>
$"{m.Type}[{string.Join(",", m.Tiles.Where(t => t != -1).Select(MahjongTile.ToString))}]");
exposedStr = $" | 已{string.Join(" ", descs)}";
}
Console.WriteLine($" {p}: {hand.Count}张手牌{exposedStr}");
}
}
else
{
Console.WriteLine(" 当前手牌:");
foreach (var p in room.State.PlayerOrder)
{
if (!room.State.AlivePlayers.Contains(p)) continue;
var hand = room.State.Hands[p];
Console.WriteLine($" {p}: {string.Join(" ", hand.OrderBy(t => t).Select(MahjongTile.ToString))} ({hand.Count}张)");
}
}
Console.Write("\n[按 Enter 继续]");
Console.ReadLine();
// In human mode, don't wait for Enter — human interactions already pause
if (!humanMode)
{
Console.Write("\n[按 Enter 继续]");
Console.ReadLine();
}
}
}