From d08eddda28bd7bb06137dead5c755c592ec8c688 Mon Sep 17 00:00:00 2001 From: xiaoou Date: Sat, 4 Jul 2026 22:28:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20HumanMahjongPlayer=E5=90=AC=E7=89=8C?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E4=B8=8D=E5=90=AB=E5=AD=97=E7=89=8C=20+=20wi?= =?UTF-8?q?ldcard=E6=98=BE=E7=A4=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. CheckTing硬编码AllTiles(false,false)→漏字牌(武汉/国标等) 修复: 构造函数传includeHonors, MahjongRoom传_rules.Deck.IncludeHonors 2. wildcard显示: 翻牌定精时显示翻到的牌+精牌(带🀫前缀) --- RuleEngine/AI/HumanMahjongPlayer.cs | 18 +++++++++++++----- RuleEngine/MahjongRoom.cs | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/RuleEngine/AI/HumanMahjongPlayer.cs b/RuleEngine/AI/HumanMahjongPlayer.cs index 7c3069a..547d152 100644 --- a/RuleEngine/AI/HumanMahjongPlayer.cs +++ b/RuleEngine/AI/HumanMahjongPlayer.cs @@ -12,11 +12,13 @@ public class HumanMahjongPlayer { public string Name { get; } private readonly MeldsSolver _solver; + private readonly bool _includeHonors; - public HumanMahjongPlayer(string name, MeldsSolver solver) + public HumanMahjongPlayer(string name, MeldsSolver solver, bool includeHonors = false) { Name = name; _solver = solver; + _includeHonors = includeHonors; } public (string action, int? tile) Decide(List legalActions, MahjongGameState state) @@ -34,9 +36,15 @@ public class HumanMahjongPlayer Console.WriteLine($" 牌墙: {state.Deck.Count}张 | 弃牌堆: {state.DiscardPool.Count}张"); // Show wildcard info - var wcTiles = state.Wildcards.ConfiguredWildcards; - if (wcTiles.Count > 0) - Console.WriteLine($" 🀫 宝牌(癞子): {string.Join(" ", wcTiles.Select(MahjongTile.ToString))}"); + var wcTiles = state.Wildcards.ConfiguredWildcards; + if (wcTiles.Count > 0) + { + var wcDisplay = string.Join(" ", wcTiles.Select(t => MahjongTile.ToString(t, state.Wildcards))); + if (state.Wildcards.RevealedTile.HasValue) + Console.WriteLine($" 🀫 精: {wcDisplay} (翻牌: {MahjongTile.ToString(state.Wildcards.RevealedTile.Value)})"); + else + Console.WriteLine($" 🀫 宝牌(癞子): {wcDisplay}"); + } // Show opponent summary Console.Write(" 对手: "); @@ -117,7 +125,7 @@ public class HumanMahjongPlayer fullHand.AddRange(m.Tiles.Where(t => t != -1)); // Check all possible tiles for win potential - var allTiles = MahjongTile.AllTiles(false, false); + var allTiles = MahjongTile.AllTiles(_includeHonors, false); int wc = state.Wildcards.CountWildcards(fullHand); foreach (var tile in allTiles) { diff --git a/RuleEngine/MahjongRoom.cs b/RuleEngine/MahjongRoom.cs index 0be42c1..61abe67 100644 --- a/RuleEngine/MahjongRoom.cs +++ b/RuleEngine/MahjongRoom.cs @@ -32,7 +32,7 @@ public class MahjongRoom _solver = new MeldsSolver(fanConfig, State.Wildcards); if (humanPlayer != null) - _human = new HumanMahjongPlayer(humanPlayer, _solver); + _human = new HumanMahjongPlayer(humanPlayer, _solver, includeHonors: _rules.Deck.IncludeHonors); var phases = BuildPhases(); _playPhase = phases.FirstOrDefault(p => p.Name == "play") ?? new PhaseConfig();