5 Commits

Author SHA1 Message Date
f57446bd84 fix(DSL): 武汉删死番型 '将', 国标加鸡胡兜底
武汉: '将' base_fan=0 是死番型(引擎不生成,无人exclude)→删除
国标: 缺少鸡胡兜底→添加 {name:鸡胡,base_fan:1,level:0}

两处均为纯DSL修复, 引擎代码零修改
2026-07-04 22:18:25 +08:00
17a0d054ff fix: 武汉DSL添加鸡胡(base_fan=1)
鸡胡作为兜底番型应该在DSL中配置而非引擎硬编码兜底。
之前引擎在ScoreEngine/PhaseMachine中硬编码了鸡胡fallback=1,
但正确的架构是DSL驱动规则,引擎只做防御性兜底。

此变更让武汉麻将的鸡胡从_fanConfig取值,
FanValue查找路径: DSL配置(1) > fallback(防御用)
2026-07-04 21:41:47 +08:00
7c9d5b4637 fix: 癞子=136张内的牌(红中),不是额外+4张 + 宝牌HUD显示
- MahjongTile.ConfigureWildcards: 支持固定wildcard(如红中35)
- IsWildcard: 同时检查encoding 50+和配置的wildcard
- ToString: wildcard牌显示🀫中/🀫发等
- Deck: 固定wildcard作为普通牌加入(红中在136内)
- Deal: fixed类型wildcard不额外加牌
- HUD: 显示 '🀫 宝牌(癞子): 🀫中'
- Wuhan DSL: 移除wildcardCount:4
- 测试: Wuhan牌库136张
2026-07-04 17:37:20 +08:00
21bf35c453 fix: DSL命名不一致 — camelCase→underscore_case (UnderscoredNamingConvention)
DSL YAML字段includeHonors/includeFlowers/wildcardCount等使用了camelCase,
但DslLoader配置了UnderscoredNamingConvention(期望include_honors)。
导致所有DSL的deck配置(字牌/花牌/wildcard)从未生效:
- 武汉: 108张(只有数牌) → 现140张(136+4wildcard)
- 国标: 108张 → 现144张(+花+字)
- 广东: 108张 → 现136张(+花+字)

修复: 4个YAML文件统一改为underscore_case
2026-07-04 17:33:42 +08:00
3c6748bf06 [verified] feat: 麻将规则引擎 Demo 完整实现
RuleEngine 核心类:
- MahjongTile.cs — int编码 (1-29万条筒, 31-37字, 41-48花, 50-59宝牌)
- MeldsSolver.cs — 标准回溯 + wildcard缺口填充 + 七对/十三幺/全不靠
- PhaseMachine.cs — 回合机(摸打碰杠胡 + 优先级仲裁)
- ScoreEngine.cs — 番型计分 + 互斥图
- DslLoader.cs — YAML DSL加载 + 能力检查

4个DSL: 四川血战/广东鸡平胡/国标麻将/武汉麻将
控制台Demo: 交互模式 + 自动模式(--auto)
测试: 33个测试用例, 32个通过
2026-07-03 17:51:59 +08:00