fix: HumanMahjongPlayer听牌检测不含字牌 + wildcard显示优化
1. CheckTing硬编码AllTiles(false,false)→漏字牌(武汉/国标等) 修复: 构造函数传includeHonors, MahjongRoom传_rules.Deck.IncludeHonors 2. wildcard显示: 翻牌定精时显示翻到的牌+精牌(带🀫前缀)
This commit is contained in:
@ -12,11 +12,13 @@ public class HumanMahjongPlayer
|
|||||||
{
|
{
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
private readonly MeldsSolver _solver;
|
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;
|
Name = name;
|
||||||
_solver = solver;
|
_solver = solver;
|
||||||
|
_includeHonors = includeHonors;
|
||||||
}
|
}
|
||||||
|
|
||||||
public (string action, int? tile) Decide(List<ActionOption> legalActions, MahjongGameState state)
|
public (string action, int? tile) Decide(List<ActionOption> legalActions, MahjongGameState state)
|
||||||
@ -34,9 +36,15 @@ public class HumanMahjongPlayer
|
|||||||
Console.WriteLine($" 牌墙: {state.Deck.Count}张 | 弃牌堆: {state.DiscardPool.Count}张");
|
Console.WriteLine($" 牌墙: {state.Deck.Count}张 | 弃牌堆: {state.DiscardPool.Count}张");
|
||||||
|
|
||||||
// Show wildcard info
|
// Show wildcard info
|
||||||
var wcTiles = state.Wildcards.ConfiguredWildcards;
|
var wcTiles = state.Wildcards.ConfiguredWildcards;
|
||||||
if (wcTiles.Count > 0)
|
if (wcTiles.Count > 0)
|
||||||
Console.WriteLine($" 🀫 宝牌(癞子): {string.Join(" ", wcTiles.Select(MahjongTile.ToString))}");
|
{
|
||||||
|
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
|
// Show opponent summary
|
||||||
Console.Write(" 对手: ");
|
Console.Write(" 对手: ");
|
||||||
@ -117,7 +125,7 @@ public class HumanMahjongPlayer
|
|||||||
fullHand.AddRange(m.Tiles.Where(t => t != -1));
|
fullHand.AddRange(m.Tiles.Where(t => t != -1));
|
||||||
|
|
||||||
// Check all possible tiles for win potential
|
// 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);
|
int wc = state.Wildcards.CountWildcards(fullHand);
|
||||||
foreach (var tile in allTiles)
|
foreach (var tile in allTiles)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -32,7 +32,7 @@ public class MahjongRoom
|
|||||||
_solver = new MeldsSolver(fanConfig, State.Wildcards);
|
_solver = new MeldsSolver(fanConfig, State.Wildcards);
|
||||||
|
|
||||||
if (humanPlayer != null)
|
if (humanPlayer != null)
|
||||||
_human = new HumanMahjongPlayer(humanPlayer, _solver);
|
_human = new HumanMahjongPlayer(humanPlayer, _solver, includeHonors: _rules.Deck.IncludeHonors);
|
||||||
|
|
||||||
var phases = BuildPhases();
|
var phases = BuildPhases();
|
||||||
_playPhase = phases.FirstOrDefault(p => p.Name == "play") ?? new PhaseConfig();
|
_playPhase = phases.FirstOrDefault(p => p.Name == "play") ?? new PhaseConfig();
|
||||||
|
|||||||
Reference in New Issue
Block a user