fix: IdentifyFans filter排除无fallback番型—防止跨变体越权
核心变更: - filter从'well-known全放行'改为'只放行_fanConfig或有fallback值的' - 排除: 断幺九/无字/缺一门/将/平胡/平和(无hardcoded fallback) - 这些被排除时→allZeroValue→鸡胡兜底→保证非零分 效果: 南昌不再显示'断幺九+无字+平胡'等不存在于南昌规则的番型 测试: _fanConfig补全16个番型, 58 tests pass
This commit is contained in:
@ -90,7 +90,25 @@ public class DeckTests
|
|||||||
|
|
||||||
public class MeldsSolverTests
|
public class MeldsSolverTests
|
||||||
{
|
{
|
||||||
private readonly MeldsSolver _solver = new(new Dictionary<string, FanConfig>());
|
private readonly MeldsSolver _solver = new(new Dictionary<string, FanConfig>
|
||||||
|
{
|
||||||
|
["清一色"] = new() { BaseFan = 24 },
|
||||||
|
["混一色"] = new() { BaseFan = 6 },
|
||||||
|
["字一色"] = new() { BaseFan = 64 },
|
||||||
|
["对对胡"] = new() { BaseFan = 2 },
|
||||||
|
["碰碰和"] = new() { BaseFan = 6 },
|
||||||
|
["暗七对"] = new() { BaseFan = 8 },
|
||||||
|
["带幺九"] = new() { BaseFan = 2 },
|
||||||
|
["缺一门"] = new() { BaseFan = 0 },
|
||||||
|
["平胡"] = new() { BaseFan = 0 },
|
||||||
|
["断幺九"] = new() { BaseFan = 2 },
|
||||||
|
["无字"] = new() { BaseFan = 0 },
|
||||||
|
["全大"] = new() { BaseFan = 12 },
|
||||||
|
["全中"] = new() { BaseFan = 12 },
|
||||||
|
["全小"] = new() { BaseFan = 12 },
|
||||||
|
["全双"] = new() { BaseFan = 24 },
|
||||||
|
["鸡胡"] = new() { BaseFan = 1 },
|
||||||
|
});
|
||||||
|
|
||||||
// === 标准胡牌 ===
|
// === 标准胡牌 ===
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@ -808,15 +808,16 @@ public class MeldsSolver
|
|||||||
if (fans.Count == 0 || allZeroValue)
|
if (fans.Count == 0 || allZeroValue)
|
||||||
fans.Add("鸡胡");
|
fans.Add("鸡胡");
|
||||||
|
|
||||||
// Filter: only keep fans that exist in DSL config or are well-known
|
// Filter: keep fans in _fanConfig OR event fans OR well-known structural fans
|
||||||
|
// Exclude zero-value markers (无字/缺一门/将) and no-fallback fans (断幺九/平胡/平和)
|
||||||
|
// → these trigger allZeroValue→鸡胡 to ensure non-zero scoring
|
||||||
return fans.Where(f => _fanConfig.ContainsKey(f) ||
|
return fans.Where(f => _fanConfig.ContainsKey(f) ||
|
||||||
f is "清一色" or "混一色" or "对对胡" or "碰碰和" or "暗七对" or "七对"
|
f is "杠上开花" or "海底捞月" or "抢杠胡" or "天胡" or "地胡" or "癞子胡"
|
||||||
or "带幺九" or "十三幺" or "字一色" or "断幺九" or "无字" or "将"
|
or "清一色" or "混一色" or "对对胡" or "碰碰和" or "暗七对" or "七对" or "带幺九" or "十三幺" or "鸡胡" or "字一色"
|
||||||
or "缺一门" or "平胡" or "全大" or "全中" or "全小" or "全双"
|
or "全大" or "全中" or "全小" or "全双" or "大于五" or "小于五"
|
||||||
or "将一色" or "大四喜" or "大三元" or "小四喜" or "小三元" or "三风" or "双箭刻"
|
or "将一色" or "大四喜" or "大三元" or "小四喜" or "小三元"
|
||||||
or "一色四同顺" or "一色三同顺" or "一般高" or "五门齐" or "全求人" or "门前清"
|
or "一色四同顺" or "一色三同顺" or "一般高" or "五门齐" or "全求人" or "门前清"
|
||||||
or "鸡胡" or "癞子胡" or "平和"
|
or "三风" or "双箭刻" or "圈风" or "门风" or "单钓将" or "四归一" or "连七对" or "全不靠" or "一色双龙会").ToList();
|
||||||
or "圈风" or "门风" or "单钓将" or "四归一" or "杠上开花" or "海底捞月" or "抢杠胡" or "天胡" or "地胡").ToList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// === 番型互斥应用 ===
|
// === 番型互斥应用 ===
|
||||||
|
|||||||
Reference in New Issue
Block a user