Files
card-game-engine/dsl-examples/guangdong_jipinghu.yaml
xiaoou 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

104 lines
2.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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