fix: IdentifyFans filter排除无fallback番型—防止跨变体越权

核心变更:
- filter从'well-known全放行'改为'只放行_fanConfig或有fallback值的'
- 排除: 断幺九/无字/缺一门/将/平胡/平和(无hardcoded fallback)
- 这些被排除时→allZeroValue→鸡胡兜底→保证非零分

效果: 南昌不再显示'断幺九+无字+平胡'等不存在于南昌规则的番型
测试: _fanConfig补全16个番型, 58 tests pass
This commit is contained in:
xiaoou
2026-07-05 01:09:42 +08:00
parent 84681297c0
commit 70b00d5e6d
2 changed files with 27 additions and 8 deletions

View File

@ -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]

View File

@ -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();
} }
// === 番型互斥应用 === // === 番型互斥应用 ===