From 70b00d5e6d9418ea13d16cf57da464071166b4e8 Mon Sep 17 00:00:00 2001 From: xiaoou Date: Sun, 5 Jul 2026 01:09:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20IdentifyFans=20filter=E6=8E=92=E9=99=A4?= =?UTF-8?q?=E6=97=A0fallback=E7=95=AA=E5=9E=8B=E2=80=94=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E8=B7=A8=E5=8F=98=E4=BD=93=E8=B6=8A=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 核心变更: - filter从'well-known全放行'改为'只放行_fanConfig或有fallback值的' - 排除: 断幺九/无字/缺一门/将/平胡/平和(无hardcoded fallback) - 这些被排除时→allZeroValue→鸡胡兜底→保证非零分 效果: 南昌不再显示'断幺九+无字+平胡'等不存在于南昌规则的番型 测试: _fanConfig补全16个番型, 58 tests pass --- RuleEngine.Tests/CoreTests.cs | 20 +++++++++++++++++++- RuleEngine/Patterns/MeldsSolver.cs | 15 ++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/RuleEngine.Tests/CoreTests.cs b/RuleEngine.Tests/CoreTests.cs index fb9f995..9df8b22 100644 --- a/RuleEngine.Tests/CoreTests.cs +++ b/RuleEngine.Tests/CoreTests.cs @@ -90,7 +90,25 @@ public class DeckTests public class MeldsSolverTests { - private readonly MeldsSolver _solver = new(new Dictionary()); + private readonly MeldsSolver _solver = new(new Dictionary + { + ["清一色"] = 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] diff --git a/RuleEngine/Patterns/MeldsSolver.cs b/RuleEngine/Patterns/MeldsSolver.cs index c4d8462..174be0e 100644 --- a/RuleEngine/Patterns/MeldsSolver.cs +++ b/RuleEngine/Patterns/MeldsSolver.cs @@ -808,15 +808,16 @@ public class MeldsSolver if (fans.Count == 0 || allZeroValue) 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) || - 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 "双箭刻" + 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 "地胡").ToList(); + or "三风" or "双箭刻" or "圈风" or "门风" or "单钓将" or "四归一" or "连七对" or "全不靠" or "一色双龙会").ToList(); } // === 番型互斥应用 ===