From 488e96114f7cf85e4c2463735a76b25366261eab Mon Sep 17 00:00:00 2001 From: xiaoou Date: Sat, 4 Jul 2026 23:17:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20excludes=E5=BC=95=E7=94=A8=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E7=94=A8enginePatterns=E6=9B=BF=E4=BB=A3fanTypes(?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=AF=AF=E6=8A=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因分析: - excludes用字符串匹配(ApplyFanExclusions操作输出名单),不依赖_fanConfig 例: 清一色excludes缺一门→引擎生成'缺一门'时排除生效,即使缺一门不在fan_types 之前按fan_types检查导致误报(武汉4个/国标2个) - conflicts需要双方都在_fanConfig才能比较BaseFan数值 修复: - excludes: 改查enginePatterns(39个引擎可生成名)替代fanNames - conflicts: 保持查fanNames(必须双方在_fan_config) - guobiao.yaml: conflicts[暗七对]→[七对](引擎通过FanName解析返回七对) 效果: 武汉5→1 国标15→12 (消除误报,剩余为真缺失:圈风/门风等引擎不支持) --- RuleEngine/Dsl/DslLoader.cs | 10 ++++++---- dsl-examples/guobiao.yaml | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/RuleEngine/Dsl/DslLoader.cs b/RuleEngine/Dsl/DslLoader.cs index e287ea1..fa0e101 100644 --- a/RuleEngine/Dsl/DslLoader.cs +++ b/RuleEngine/Dsl/DslLoader.cs @@ -132,17 +132,19 @@ public class CapabilityRegistry if (recognized < rules.FanTypes.Count) warnings.Add($"番型识别率: {recognized}/{rules.FanTypes.Count}→{rules.FanTypes.Count - recognized} 个番型得分为0"); - // Excludes/Conflicts 引用完整性: 引用的番型名必须存在于 fan_types + // Excludes/Conflicts 引用完整性 + // excludes: 用字符串匹配(不依赖_fanConfig), 只检查引擎是否可能生成该番型名 + // conflicts: 需要双方都在_fanConfig中才能比较BaseFan var fanNames = rules.FanTypes.Select(f => f.Name).ToHashSet(); foreach (var f in rules.FanTypes) { if (f.Excludes != null) foreach (var excluded in f.Excludes) - if (!fanNames.Contains(excluded)) - warnings.Add($"番型「{f.Name}」excludes 引用了不存在的番型「{excluded}」→排除规则失效"); + if (!enginePatterns.Contains(excluded)) // excludes work on string names, check engine can generate + warnings.Add($"番型「{f.Name}」excludes 引用了引擎不识别的番型「{excluded}」→排除规则无效(引擎不生成此名)"); if (f.Conflicts != null) foreach (var conflict in f.Conflicts) - if (!fanNames.Contains(conflict)) + if (!fanNames.Contains(conflict)) // conflicts need _fanConfig for comparison warnings.Add($"番型「{f.Name}」conflicts 引用了不存在的番型「{conflict}」→冲突规则失效"); } diff --git a/dsl-examples/guobiao.yaml b/dsl-examples/guobiao.yaml index f0b3387..7a58d5e 100644 --- a/dsl-examples/guobiao.yaml +++ b/dsl-examples/guobiao.yaml @@ -65,7 +65,7 @@ fan_types: - { name: 大于五, base_fan: 8, level: 5 } - { name: 小于五, base_fan: 8, level: 5 } # 6番 - - { name: 碰碰和, base_fan: 6, level: 4, conflicts: [暗七对] } + - { name: 碰碰和, base_fan: 6, level: 4, conflicts: [七对] } - { name: 混一色, base_fan: 6, level: 4, excludes: [缺一门] } - { name: 五门齐, base_fan: 6, level: 4 } - { name: 全求人, base_fan: 6, level: 4 }