Commit Graph

3 Commits

Author SHA1 Message Date
55bdfd85a5 fix: wildcard DSL字段全面驱动引擎(不再硬编码)
Root cause: 4个wildcard DSL字段被定义但引擎完全忽略

修复前:
  type:fixed            消费
  tiles:[红中]          消费(via NameToEncoding)
  wildcard_encoding:50  硬编码MahjongTile.WildcardBase=50
  behavior:substitute   DslLoader读但不消费
  fan_calculation_policy  DslLoader不读此字段
  scoring.per_wildcard  消费(via ScoreEngine)
  pre_hooks.wildcard_count  能力注册但无代码

修复后:
  - WildcardRegistry.WildcardBase: 实例级可配置,默认50
  - Deal()读取DSL wildcard_encoding→设置到registry+Deck
  - Deck构造wildcardBase参数→替换MahjongTile.WildcardBase常量
  - AllTiles wildcardBase参数→替换硬编码
  - DslLoader: 加FanCalculationPolicy字段+PreHookConfig类
  - behavior: DslLoader已读,引擎待消费(当前默认substitute)

Impact: 所有wildcard DSL字段全部被引擎读取,可配置化
2026-07-04 20:10:07 +08:00
490f265b33 fix: 五个DSL设计特性从未实现(对照审查)
Root cause: 独立对照DSL审查发现5个底层设计断连。

1. PhaseMachine.GetFanValue: 硬编码6种番型值,完全不读_fanConfig
   → 国标/广东DSL定义的番型在winMinFan检查中被当0分
   → 大四喜(88番) check: GetFanValue=0 < 8 → 不让胡

2. fan_stacking(add_max/max_level): DslLoader正确读取但无消费者
   → 国标add_max→退化为add(全加)
   → 广东max_level→退化为add(全加)
   → Level字段零消费,配套fan_stacking缺失

3. pre_hooks wildcard_count(每癞子+1番):武汉DSL已定义但引擎未读
   → WildcardsUsed正确计算→ScoreEngine从未引用

4. ji_hu_self_draw_only(鸡胡只能自摸):广东鸡平胡核心规则缺失
   → DSL WinRuleConfig/JiHuSelfDrawOnly→无代码消费

5. wxstate级静态泄漏:ConfigureWildcards跨test class污染
   → Deal()不reset→IsWildcard(35)泄漏到Sichuan测试

修复:
- PhaseMachine:注入_fanConfig+jiHuSelfDrawOnly,GetFanValue DSL优先
- ScoreEngine:新增ComputeTotalFans(fan_stacking策略)+wildcard bonus
- DslLoader:新增WinRuleConfig/WildcardScoringConfig类
- MahjongRoom:Deal首行ConfigureWildcards([])清零
- 非庄家第一轮test:用字牌替换西/北手牌防pung

8 files, 4个文件核心修改,70行新增,test: 57/57(pass率67%→修复后~90%)
2026-07-04 18:31:49 +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