fix: 听牌检测wc重复计数→部分可胡牌丢失

根因: GetTingTiles传了hand+fullHand+wc=CountWildcards(hand)
  → CheckWin内部又计wildcardsInTiles→双重计数→total%3≠2→guard拒绝

修复: wc固定为0(configured wildcards已在tiles中被CheckWin统计)
  wildcardCount参数仅用于encoding 50+的额外wildcard tiles

效果: 听牌检测不再遗漏可胡牌,显示完整的可胡张数
This commit is contained in:
xiaoou
2026-07-05 01:18:30 +08:00
parent e6c63923d1
commit 181696f93a

View File

@ -123,19 +123,17 @@ public class HumanMahjongPlayer
{ {
var result = new List<int>(); var result = new List<int>();
var hand = state.Hands.GetValueOrDefault(Name, new List<int>()); var hand = state.Hands.GetValueOrDefault(Name, new List<int>());
// Combine with exposed melds // CheckWin internally counts wildcards in tiles → wildcardCount is for EXTRA wildcards (encoding 50+)
var fullHand = new List<int>(hand); // Configured wildcards in hand/exposed are already counted by _wildcards.IsWildcard inside CheckWin
if (state.Exposed.TryGetValue(Name, out var melds)) // So wildcardCount=0 for Nanchang-type variants, or _rules.Deck.WildcardCount for fixed-extra variants
foreach (var m in melds) int wc = 0;
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(_includeHonors, false); var allTiles = MahjongTile.AllTiles(_includeHonors, false);
int wc = state.Wildcards.CountWildcards(fullHand);
foreach (var tile in allTiles) foreach (var tile in allTiles)
{ {
if (hand.Count(t => t == tile) >= 4) continue; if (hand.Count(t => t == tile) >= 4) continue;
var r = _solver.CheckWin(fullHand, newTile: tile, wildcardCount: wc); var r = _solver.CheckWin(hand, newTile: tile, wildcardCount: wc);
if (r != null && r.IsWin) result.Add(tile); if (r != null && r.IsWin) result.Add(tile);
} }
return result; return result;