fix: 确定性牌计数推理 — UnknownCount修复 + 绝对大牌判断 + EndgameSolver修正
CardTracker: - UnknownCount: 52→48 - handSize - seenCount (修正底牌+手牌漏算) - 新增 RemainingCount/GetUnknownPool: 精确剩余牌计数 - 新增 IsAbsolutelyHighest: 全牌型确定性无敌判断 (单张/对子/三张/炸弹/顺子/连对/飞机) EndgameSolver: - GeneratePool → 调用 tracker.GetUnknownPool (修复已见牌未排除bug) IsmctsBot: - 确定性无敌出牌加成: 无敌出牌 +15-25% win rate bonus SOIsmctsBot: - 同步 UnknownCount(hand) 调用 验证: 100局0错误, 0.8s/局, ENDGAME求解正常触发
This commit is contained in:
@ -85,13 +85,13 @@ namespace PdkFriendServer.Logic
|
||||
if (hand.Length == 0) return Pass(view);
|
||||
|
||||
// 终局精确求解:手牌≤5 + 未知牌少 → 替代 ISMCTS
|
||||
if (hand.Length <= 5 && _tracker.UnknownCount <= 15)
|
||||
if (hand.Length <= 5 && _tracker.UnknownCount(hand) <= 15)
|
||||
{
|
||||
var endgameResult = EndgameSolver.Solve(hand, view, _tracker, _rng);
|
||||
if (endgameResult.HasValue)
|
||||
{
|
||||
var ep = endgameResult.Value;
|
||||
Console.WriteLine($"[ISMCTS pos{view.MyPos}] ENDGAME hand={hand.Length} unknown={_tracker.UnknownCount} → 精确求解");
|
||||
Console.WriteLine($"[ISMCTS pos{view.MyPos}] ENDGAME hand={hand.Length} unknown={_tracker.UnknownCount(hand)} → 精确求解");
|
||||
return new PlayOutCardPdkF
|
||||
{
|
||||
Pos = (byte)view.MyPos,
|
||||
@ -255,6 +255,24 @@ namespace PdkFriendServer.Logic
|
||||
}
|
||||
}
|
||||
|
||||
// 5.6. 确定性无敌出牌:基于牌计数,如果某出牌绝对无人能压制 → 大幅加分
|
||||
for (int i = 0; i < scoredCandidates.Count; i++)
|
||||
{
|
||||
var (p, wr, am, m) = scoredCandidates[i];
|
||||
if (p.Type != CardType1.None && p.Ids != null && p.Ids.Length > 0)
|
||||
{
|
||||
if (_tracker.IsAbsolutelyHighest(hand, p.GameNum, p.Ids.Length, p.Type))
|
||||
{
|
||||
// 确定性无敌 → 大幅加分(相当于省掉 ISMCTS 模拟噪声)
|
||||
double bonus = 0.15;
|
||||
if (am <= 2) bonus = 0.25; // 马上就要赢
|
||||
else if (m) bonus = 0.20; // 多牌无敌
|
||||
wr += bonus;
|
||||
scoredCandidates[i] = (p, wr, am, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 6. 两阶段选择:多牌优先
|
||||
scoredCandidates.Sort((a, b) => b.winRate.CompareTo(a.winRate));
|
||||
var best = scoredCandidates[0];
|
||||
|
||||
Reference in New Issue
Block a user