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个通过
102 lines
2.5 KiB
YAML
102 lines
2.5 KiB
YAML
game:
|
|
name: 武汉麻将
|
|
type: mahjong
|
|
engine_type: mahjong
|
|
players: { min: 4, max: 4 }
|
|
|
|
requires:
|
|
- deck.generator_mahjong
|
|
- meldsolver.standard_win
|
|
- meldsolver.seven_pairs
|
|
- meldsolver.wildcard
|
|
- phase.mahjong_turn
|
|
- phase.priority_arbitration
|
|
- scoring.fan_exclusion
|
|
|
|
deck:
|
|
generator: mahjong
|
|
includeHonors: true
|
|
includeFlowers: false
|
|
wildcardTile: 红中
|
|
wildcardCount: 4
|
|
total: 136
|
|
|
|
deal:
|
|
cards_per_player: 13
|
|
dealer_extra: 1
|
|
|
|
wildcard_rules:
|
|
type: fixed
|
|
tiles: [红中]
|
|
wildcard_encoding: 50
|
|
behavior: substitute
|
|
fan_calculation_policy: optimal
|
|
scoring:
|
|
per_wildcard_in_win: 1
|
|
|
|
win_condition:
|
|
pair_must_be_258: true
|
|
|
|
fan_types:
|
|
- { name: 碰碰胡, base_fan: 2 }
|
|
- { name: 清一色, base_fan: 8, excludes: [缺一门, 无字] }
|
|
- { name: 七对, base_fan: 8, excludes: [门前清, 单钓将] }
|
|
- { name: 将一色, base_fan: 16, excludes: [碰碰胡, 缺一门] }
|
|
- { name: 全求人, base_fan: 4 }
|
|
- { name: 杠上开花, base_fan: 1, excludes: [海底捞月] }
|
|
- { name: 海底捞月, base_fan: 1 }
|
|
- { name: 抢杠胡, base_fan: 1 }
|
|
- { name: 天胡, base_fan: 32 }
|
|
- { name: 地胡, base_fan: 16 }
|
|
- { name: 癞子胡, base_fan: 1, condition: hand_contains_wildcard }
|
|
- { name: 将, base_fan: 0 }
|
|
|
|
fan_stacking: add
|
|
max_fan: 100
|
|
|
|
phases:
|
|
- name: deal
|
|
type: auto
|
|
action: deal_cards
|
|
next: play
|
|
|
|
- name: play
|
|
type: mahjong_turn
|
|
turn_order: counter_clockwise
|
|
sub_phases:
|
|
draw:
|
|
type: auto
|
|
action: draw_card
|
|
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: 100
|
|
|
|
pre_hooks:
|
|
- name: wildcard_count
|
|
description: 统计胡牌手牌中癞子数量,每张癞子+1番
|