[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个通过
This commit is contained in:
xiaoou
2026-07-03 17:51:59 +08:00
commit 3c6748bf06
24 changed files with 7083 additions and 0 deletions

View File

@ -0,0 +1,103 @@
game:
name: 广东麻将鸡平胡
type: mahjong
engine_type: mahjong
players: { min: 4, max: 4 }
requires:
- meldsolver.standard_win
- meldsolver.seven_pairs
- meldsolver.thirteen_orphans
- deck.flower_cards
- phase.mahjong_turn
- phase.priority_arbitration
- scoring.fan_exclusion
deck:
generator: mahjong
includeHonors: true
includeFlowers: true
total: 136
deal:
cards_per_player: 13
dealer_extra: 1
flower_rules:
on_draw: replace_and_draw
replace_tiles: BEFORE_GAME_START
scoring:
normal: 1
matching:
value: 1
mapping:
1: [春, 梅]
2: [夏, 兰]
3: [秋, 竹]
4: [冬, 菊]
fan_types:
# 鸡胡1番只能自摸
- { name: 鸡胡, base_fan: 1, level: 1 }
# 平胡4番
- { name: 清一色, base_fan: 8, level: 3, excludes: [缺一门, 无字] }
- { name: 对对胡, base_fan: 4, level: 2, conflicts: [暗七对] }
- { name: 暗七对, base_fan: 8, level: 3, conflicts: [对对胡] }
- { name: 混一色, base_fan: 4, level: 2, excludes: [缺一门] }
- { name: 带幺九, base_fan: 4, level: 2, excludes: [缺一门] }
# 爆胡8番+
- { name: 十三幺, base_fan: 32, level: 3, excludes: [五门齐, 门前清] }
- { name: 大四喜, base_fan: 32, level: 3 }
- { name: 大三元, base_fan: 32, level: 3 }
- { name: 杠上开花, base_fan: 1, level: 1, excludes: [海底捞月] }
- { name: 海底捞月, base_fan: 1, level: 1 }
- { name: 抢杠胡, base_fan: 1, level: 1 }
fan_stacking: max_level
max_fan: 999
win_rule:
ji_hu_self_draw_only: true # 鸡胡只能自摸
phases:
- name: deal
type: auto
action: deal_cards_with_flowers
next: play
- name: play
type: mahjong_turn
turn_order: counter_clockwise
sub_phases:
draw:
type: auto
action: draw_card
on_draw_flower: replace
on_empty_deck: exhausted
self_action:
options:
- { action: discard }
- { action: an_kong }
- { action: bu_kong, condition: has_punged_pair }
- { action: win, condition: can_win_tumo }
others_reaction:
options:
- { action: chi, priority: 1, condition: can_chi }
- { action: pung, priority: 2, condition: has_two_same }
- { action: ming_kong, priority: 3, condition: has_three_same }
- { action: win, priority: 4, condition: can_win }
- { action: pass, priority: 0 }
priority_policy: highest_wins
on_win: game_over
end_conditions:
- { type: player_wins, action: settle }
- { type: deck_exhausted, action: draw_game }
- name: settle
type: auto
action: calculate_scores
next: null
scoring:
mode: fan_table
max_cap: 999