From f9242cf965efa5f5d39db08525cf4f8becbd9965 Mon Sep 17 00:00:00 2001 From: xiaoou Date: Sat, 4 Jul 2026 11:49:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BA=BA=E7=B1=BB=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=91=B8=E5=88=B0=E7=9A=84=E7=89=8C=20(LastD?= =?UTF-8?q?rawnTile=20+=20=E7=AE=AD=E5=A4=B4=E9=AB=98=E4=BA=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GameState新增LastDrawnTile字段 - StepTurn摸牌时记录LastDrawnTile - HumanMahjongPlayer显示'刚刚摸到:X'并用→←箭头标记新牌 - 庄家首轮LastDrawnTile清空 --- RuleEngine/AI/HumanMahjongPlayer.cs | 11 ++++++++++- RuleEngine/Core/GameState.cs | 1 + RuleEngine/MahjongRoom.cs | 5 ++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/RuleEngine/AI/HumanMahjongPlayer.cs b/RuleEngine/AI/HumanMahjongPlayer.cs index b3b8438..e68f336 100644 --- a/RuleEngine/AI/HumanMahjongPlayer.cs +++ b/RuleEngine/AI/HumanMahjongPlayer.cs @@ -21,13 +21,22 @@ public class HumanMahjongPlayer var hand = state.Hands.GetValueOrDefault(Name, new List()); var sorted = hand.OrderBy(t => t).ToList(); + // Highlight last drawn tile + int? drawnTile = state.LastDrawnTile; + int drawnIdx = drawnTile.HasValue ? sorted.IndexOf(drawnTile.Value) : -1; + while (true) { Console.WriteLine(); Console.WriteLine($"=== {Name} 的回合 ==="); + if (drawnTile.HasValue && drawnIdx >= 0) + Console.WriteLine($" 🀫 刚刚摸到: {MahjongTile.ToString(drawnTile.Value)}"); Console.WriteLine($"手牌 ({hand.Count}张):"); for (int i = 0; i < sorted.Count; i++) - Console.WriteLine($" [{i + 1}] {MahjongTile.ToString(sorted[i])}"); + { + bool isDrawn = (i == drawnIdx); + Console.WriteLine($" [{i + 1}] {(isDrawn ? "→ " : " ")}{MahjongTile.ToString(sorted[i])}{(isDrawn ? " ← 新摸" : "")}"); + } Console.WriteLine(); // Show available actions diff --git a/RuleEngine/Core/GameState.cs b/RuleEngine/Core/GameState.cs index 34fdd2e..e85808a 100644 --- a/RuleEngine/Core/GameState.cs +++ b/RuleEngine/Core/GameState.cs @@ -31,6 +31,7 @@ public class MahjongGameState public bool IsDeckExhausted { get; set; } public List RecentEvents { get; set; } = new(); public int FlowerReplaced { get; set; } + public int? LastDrawnTile { get; set; } public MahjongGameState Clone() { diff --git a/RuleEngine/MahjongRoom.cs b/RuleEngine/MahjongRoom.cs index b7517cc..88c4de9 100644 --- a/RuleEngine/MahjongRoom.cs +++ b/RuleEngine/MahjongRoom.cs @@ -135,13 +135,16 @@ public class MahjongRoom // Phase 2: Draw card (skip for dealer on first turn — they already have 14) bool isDealerFirstTurn = (player == State.Dealer && State.RoundNumber == 0); - if (!isDealerFirstTurn) + if (isDealerFirstTurn) + State.LastDrawnTile = null; + else { if (State.Deck.Count > 0) { int drawn = State.Deck[^1]; State.Deck.RemoveAt(State.Deck.Count - 1); State.Hands[player].Add(drawn); + State.LastDrawnTile = drawn; State.AddEvent("draw", player, drawn, $"摸牌: {MahjongTile.ToString(drawn)}");