From 816000a286a47a0e0d96b1ed2cff0898a4dc0233 Mon Sep 17 00:00:00 2001 From: xiaoou Date: Sat, 4 Jul 2026 23:25:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E4=E4=B8=AA=E7=95=AA?= =?UTF-8?q?=E5=9E=8B=E8=AF=86=E5=88=AB=E5=99=A8=E2=80=94=E4=B8=89=E9=A3=8E?= =?UTF-8?q?/=E5=8F=8C=E7=AE=AD=E5=88=BB/=E4=B8=80=E8=89=B2=E4=B8=89?= =?UTF-8?q?=E5=90=8C=E9=A1=BA/=E4=B8=80=E8=88=AC=E9=AB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 4个新识别器均基于已有统计逻辑: - 三风: windKezi==3 (复用大四喜/小四喜的风刻统计) - 双箭刻: dragonKezi==2 (复用大三元/小三元的箭刻统计) - 一色三同顺: shunziGroups count>=3 (复用一色四同顺分组) - 一般高: shunziGroups count>=2 同步更新: enginePatterns + IdentifyFans well-known filter 效果: 国标--check警告 12→6 (消除三风×2/双箭刻×2/三同顺/一般高) 剩余6个: 圈风/门风/单钓将×3/四归一(需新状态跟踪) --- RuleEngine/Dsl/DslLoader.cs | 4 ++-- RuleEngine/Patterns/MeldsSolver.cs | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/RuleEngine/Dsl/DslLoader.cs b/RuleEngine/Dsl/DslLoader.cs index fa0e101..fe799b0 100644 --- a/RuleEngine/Dsl/DslLoader.cs +++ b/RuleEngine/Dsl/DslLoader.cs @@ -65,8 +65,8 @@ public class CapabilityRegistry "带幺九","全带幺","混幺九","缺一门","平胡","平和","断幺九", "全大","全中","全小","全双","大于五","小于五", "十三幺","全不靠","一色双龙会","连七对", - "将一色","大四喜","大三元","小四喜","小三元", - "一色四同顺","五门齐","全求人","门前清", + "将一色","大四喜","大三元","小四喜","小三元","三风","双箭刻", + "一色四同顺","一色三同顺","一般高","五门齐","全求人","门前清", "鸡胡","癞子胡", "杠上开花","海底捞月","抢杠胡","天胡","地胡", "将","无字" // base_fan:0/1 markers diff --git a/RuleEngine/Patterns/MeldsSolver.cs b/RuleEngine/Patterns/MeldsSolver.cs index f20c525..96a9260 100644 --- a/RuleEngine/Patterns/MeldsSolver.cs +++ b/RuleEngine/Patterns/MeldsSolver.cs @@ -710,10 +710,12 @@ public class MeldsSolver var keziTiles = melds.Where(m => m.Type == "kezi").SelectMany(m => m.Tiles).Where(t => t > 0); int windKezi = keziTiles.Where(t => t >= 31 && t <= 34).GroupBy(t => t).Count(g => g.Count() >= 3); if (windKezi == 4) fans.Add("大四喜"); + if (windKezi == 3) fans.Add("三风"); // 大三元: 3 dragon kongs/pungs (中35,发36,白37) int dragonKezi = keziTiles.Where(t => t >= 35 && t <= 37).GroupBy(t => t).Count(g => g.Count() >= 3); if (dragonKezi == 3) fans.Add("大三元"); + if (dragonKezi == 2) fans.Add("双箭刻"); // 小四喜: 3 wind kezi + wind pair var pairTiles = pair.Where(t => t > 0); @@ -726,11 +728,16 @@ public class MeldsSolver if (dragonKezi == 2 && dragonPair && pairTiles.Any(t => t >= 35 && t <= 37)) fans.Add("小三元"); - // 一色四同顺: four identical sequences in same suit + // 一色四同顺/一色三同顺/一般高: grouped by identical sequences var shunziGroups = melds.Where(m => m.Type == "shunzi") .GroupBy(m => string.Join(",", m.Tiles.OrderBy(t => t))); if (shunziGroups.Any(g => g.Count() >= 4)) fans.Add("一色四同顺"); + foreach (var g in shunziGroups) + { + if (g.Count() >= 3) fans.Add("一色三同顺"); + if (g.Count() >= 2) fans.Add("一般高"); + } // 五门齐: all 5 tile categories present (3 suits + honors + at least one terminal) var categories = new HashSet(); @@ -787,8 +794,8 @@ public class MeldsSolver 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 "地胡").ToList(); }