xiaoou b038d5e2da fix: GetLegalActions从硬编码改为读DSL+条件求值+wildcard计数修正
子代理审查MED级bug修复:

1. GetLegalActions硬编码忽略DSL action列表
   →从play phase的SelfActions/OthersReactions读取允许的action
   →DSL可禁用an_kong/bu_kong/pung等操作

2. action condition字符串完全未求值
   →CheckCondition()支持:can_win/can_chi/has_two_same等10种条件
   →国标can_win_tumo_and_fan_ge_8条件被评估

3. wildcard bonus仅计缺口填充
   →改为统计赢家手牌+副露中全部癞子(per_wildcard_in_win语义)

4. PhaseMachine两处wildcard计数从静态IsWildcard改为_wildcards实例

6个文件:PhaseMachine+ScoreEngine(核心)+MahjongRoom(WildcardRegistry引用)
2026-07-04 20:37:13 +08:00

Card Game Engine — 棋牌规则引擎

YAML DSL 驱动的棋牌规则引擎。一份 DSL 配置文件 = 一种玩法, 引擎加载后自动运行,不需要写玩法特定代码。

项目结构

card-game-engine/
├── docs/
│   ├── architecture-plan.md        # 架构设计文档
│   └── demo-implementation-plan.md # Demo 实施计划
├── RuleEngine/                     # C# 规则引擎核心
│   ├── Core/                       # MahjongTile 编码 / Deck 牌堆 / GameState 状态
│   ├── Patterns/                   # MeldsSolver 胡牌判断 + 番型识别
│   ├── Phase/                      # PhaseMachine 回合状态机
│   ├── Scoring/                    # ScoreEngine 计分引擎
│   ├── Dsl/                        # DslLoader YAML 加载 + CapabilityRegistry
│   └── AI/                         # RandomMahjongAI 随机AI验证用
├── RuleEngine.Tests/               # 单元测试 (45个)
├── dsl-examples/                   # 玩法 DSL 配置 (YAML)
│   ├── xuezhandaodi.yaml           # 四川麻将血战到底 (108张)
│   ├── guangdong_jipinghu.yaml     # 广东麻将鸡平胡 (136张 + 花牌)
│   ├── guobiao.yaml               # 国标麻将 (144张81番种)
│   └── wuhan.yaml                 # 武汉麻将 (136张红中癞子 + 258将)
└── Demo/                           # 控制台 Demo

核心设计

  • 规则引擎 ≠ 游戏引擎纯逻辑库C#),不依赖图形框架。输入状态 → 输出合法操作
  • 扑克/麻将引擎分离:各自精专,共享基础层
  • int 编码4 bytes/tile性能优先
  • 加载时能力检查DSL 声明 requires,引擎 CapabilityRegistry 自动验证

已实现能力

胡牌判断 (MeldsSolver)

能力 状态 说明
标准胡牌 (4面子+1对) 回溯搜索,含 wildcard 缺口填充
七对 纯对子形态wildcard 配对支持
十三幺 13种幺九+1重复
全不靠 14牌从16位置模板选wildcard 补位
一色双龙会 同色1-9各至少2张wildcard 支持
鬼牌/癞子 缺口填充式回溯 O(w×2^w)
258将检查 武汉麻将专用

番型识别 (IdentifyFans)

自动识别 16 种结构性番型:清一色、混一色、字一色、对对胡、暗七对、带幺九、混幺九、缺一门、平胡、断幺九、全大、全中、全小、大于五、小于五、全双、碰碰和

回合控制

能力 状态
摸→打→碰杠胡回合
优先级仲裁 (胡>杠>碰>吃)
血战到底 (胡后不结束)
查叫/查花猪
花牌 (摸到即补)

DSL 热切换

4 种麻将变体 100% 覆盖率,--dsl 参数切换

Demo 用法

# 交互模式(逐局展示)
dotnet run --project Demo
dotnet run --project Demo -- --dsl wuhan
dotnet run --project Demo -- --dsl guobiao
dotnet run --project Demo -- --dsl guangdong_jipinghu

# 压测模式
dotnet run --project Demo -- --auto --count 1000

# 运行测试
dotnet test                              # 全部 45 个

测试覆盖

  • 45 个单元测试 全部通过
  • 覆盖:牌编码、牌库构建、标准胡牌、七对、十三幺、全不靠、一色双龙会、 wildcard 补位、258将检查、番型识别清一色/混一色/字一色/对对胡/ 带幺九/缺一门/平胡/断幺九/全大/全小/全双)
  • 1000 局压测 0 报错

开源参考

  • q_algorithm (C# 胡牌算法库)
  • majiang_algorithm (Java 麻将引擎 + AI)
  • MahjongKit (Python 牌谱分析)
Description
YAML DSL 驱动的棋牌规则引擎 — 麻将 + 扑克,玩法即配置
Readme 1 MiB
Languages
C# 100%