fix: PhaseMachine硬编码>=8番 → 读DSL win_min_fan
4处修复: - PhaseMachine构造函数新增 _winMinFan 参数 - GetLegalActions 中 discard win check (line 139): >= 8 → >= _winMinFan - GetLegalActions 中 self-draw win check (line 165): >= 8 → >= _winMinFan - CheckCondition 中的 can_win*_and_fan_ge_8 (line 97-98): >= 8 → >= _winMinFan - MahjongRoom 传参: winMinFan=_rules.WinMinFan 效果: 国标胡牌率 30%→13% (baseFan<8的低番手牌被正确拦截) 58 tests pass, 5 variants 0 errors
This commit is contained in:
@ -40,7 +40,8 @@ public class MahjongRoom
|
||||
_phaseMachine = new MahjongPhaseMachine(phases, _solver, wildcardCount: wc, require258: r258,
|
||||
fanConfig: fanConfig,
|
||||
jiHuSelfDrawOnly: _rules.WinRule?.JiHuSelfDrawOnly ?? false,
|
||||
wildcards: State.Wildcards);
|
||||
wildcards: State.Wildcards,
|
||||
winMinFan: _rules.WinMinFan);
|
||||
|
||||
_scoreEngine = new MahjongScoreEngine(new ScoringConfig
|
||||
{
|
||||
|
||||
@ -44,13 +44,15 @@ public class MahjongPhaseMachine
|
||||
private readonly bool _jiHuSelfDrawOnly;
|
||||
private readonly WildcardRegistry _wildcards;
|
||||
private readonly bool _chiAllowed;
|
||||
private readonly int _winMinFan;
|
||||
public bool ChiAllowed => _chiAllowed;
|
||||
|
||||
public MahjongPhaseMachine(List<PhaseConfig> phases, MeldsSolver solver,
|
||||
int wildcardCount = 0, bool require258 = false,
|
||||
Dictionary<string, FanConfig>? fanConfig = null,
|
||||
bool jiHuSelfDrawOnly = false,
|
||||
WildcardRegistry? wildcards = null)
|
||||
WildcardRegistry? wildcards = null,
|
||||
int winMinFan = 0)
|
||||
{
|
||||
_phases = phases;
|
||||
_solver = solver;
|
||||
@ -59,6 +61,7 @@ public class MahjongPhaseMachine
|
||||
_fanConfig = fanConfig ?? new();
|
||||
_jiHuSelfDrawOnly = jiHuSelfDrawOnly;
|
||||
_wildcards = wildcards ?? new();
|
||||
_winMinFan = winMinFan;
|
||||
_chiAllowed = phases.Any(p =>
|
||||
p.OthersReactions.Any(o => o.Action == "chi"));
|
||||
}
|
||||
@ -94,8 +97,8 @@ public class MahjongPhaseMachine
|
||||
"can_chi" => chiAllowed,
|
||||
"can_win" => canSelfWin,
|
||||
"can_win_tumo" => canSelfWin,
|
||||
"can_win_tumo_and_fan_ge_8" => canSelfWin && fanSum >= 8,
|
||||
"can_win_and_fan_ge_8" => canSelfWin && fanSum >= 8,
|
||||
"can_win_tumo_and_fan_ge_8" => canSelfWin && fanSum >= _winMinFan,
|
||||
"can_win_and_fan_ge_8" => canSelfWin && fanSum >= _winMinFan,
|
||||
_ => true // unknown condition → allow (fail-open for safety)
|
||||
};
|
||||
}
|
||||
@ -136,7 +139,7 @@ public class MahjongPhaseMachine
|
||||
{
|
||||
// Don't add win action; 鸡胡 can only self-draw
|
||||
}
|
||||
else if (!requireWinFan || result.Fans.Sum(f => GetFanValue(f)) >= 8)
|
||||
else if (!requireWinFan || result.Fans.Sum(f => GetFanValue(f)) >= _winMinFan)
|
||||
actions.Add(new ActionOption { Action = "win", Priority = 4 });
|
||||
}
|
||||
}
|
||||
@ -162,7 +165,7 @@ public class MahjongPhaseMachine
|
||||
wildcardCount: wildInSelf, require258Pair: _require258);
|
||||
if (tumoResult != null && tumoResult.IsWin)
|
||||
{
|
||||
if (!requireWinFan || tumoResult.Fans.Sum(f => GetFanValue(f)) >= 8)
|
||||
if (!requireWinFan || tumoResult.Fans.Sum(f => GetFanValue(f)) >= _winMinFan)
|
||||
actions.Add(new ActionOption { Action = "win", Priority = 4 });
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user