feat: 番型识别DSL驱动化 + 全不靠/一色双龙会测试完善
IdentifyFans: 从4种扩展到17种结构性番型自动识别 - 清一色/混一色/字一色/对对胡/暗七对/带幺九/混幺九 - 缺一门/平胡/断幺九/全大/全中/全小/大于五/小于五/全双/碰碰和 - FanConfig 新增 Condition 字段预留game-event条件 TryAllOrphans: 修正容差 +2(16选14),允许非幺九数牌 TryDoubleDragon: 增加honor/越界保护 测试: 33→45,新增12个(全不靠×3/一色双龙会×2/番型×7) 100局压测: 0出错
This commit is contained in:
83
README.md
83
README.md
@ -1,6 +1,6 @@
|
||||
# Card Game Engine — 麻将规则引擎
|
||||
# Card Game Engine — 棋牌规则引擎
|
||||
|
||||
YAML DSL 驱动的麻将规则引擎。目标:一份 DSL 配置文件 = 一种麻将玩法,
|
||||
YAML DSL 驱动的棋牌规则引擎。一份 DSL 配置文件 = 一种玩法,
|
||||
引擎加载后自动运行,不需要写玩法特定代码。
|
||||
|
||||
## 项目结构
|
||||
@ -11,27 +11,82 @@ card-game-engine/
|
||||
│ ├── architecture-plan.md # 架构设计文档
|
||||
│ └── demo-implementation-plan.md # Demo 实施计划
|
||||
├── RuleEngine/ # C# 规则引擎核心
|
||||
├── RuleEngine.Tests/ # 单元测试 (78个用例)
|
||||
├── ai-companion/ # Python AI 陪打服务
|
||||
│ ├── 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 # 四川麻将血战到底
|
||||
│ └── guangdong_jipinghu.yaml # 广东麻将鸡平胡
|
||||
│ ├── xuezhandaodi.yaml # 四川麻将血战到底 (108张)
|
||||
│ ├── guangdong_jipinghu.yaml # 广东麻将鸡平胡 (136张 + 花牌)
|
||||
│ ├── guobiao.yaml # 国标麻将 (144张,81番种)
|
||||
│ └── wuhan.yaml # 武汉麻将 (136张,红中癞子 + 258将)
|
||||
└── Demo/ # 控制台 Demo
|
||||
```
|
||||
|
||||
## 核心设计
|
||||
|
||||
- 规则引擎 ≠ 游戏引擎:纯逻辑库,不依赖图形框架
|
||||
- 扑克/麻将引擎分离:各自 100% 覆盖,共享基础层
|
||||
- int 编码:性能优先,4 bytes/tile
|
||||
- 加载时能力检查:DSL 声明 requires,引擎自动验证
|
||||
- **规则引擎 ≠ 游戏引擎**:纯逻辑库(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 用法
|
||||
|
||||
```bash
|
||||
# 交互模式(逐局展示)
|
||||
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 牌谱分析)
|
||||
|
||||
## 状态
|
||||
|
||||
📋 架构设计完成 → 待开始编码
|
||||
|
||||
Reference in New Issue
Block a user