配置使用说明
选择一套预设,按路径修改需要的内容。
无需复制完整规则,也不必保存展开后的大表。
打开目录
先创建一桌
先引用规则,再改少数字段。通常一小段文本就足够。
在创建房间页面的下拉菜单中选择预设,右侧会填入预设引用和默认房间名“用户名的房间”。保留预设引用,在后面添加要修改的字段,不必复制整份规则,青雀同样如此。自定义房间名和密码分别点“确定”写入配置;确认时不显示过程或成功提示,错误仍会显示。
- path: []
from: ["青雀"]
- path: [general_config, room_name]
value: "周末青雀"
- path: [general_config, main_time]
value: 20
- path: [general_config, reserve_time]
value: 60
- 选预设左侧点选规则。重新点选会替换当前编辑文本。
- 改文本右侧使用 YAML 操作列表;空操作列表 [] 表示配置模板。
- 校验/预览登录后由服务端校验。展开预览是只读完整配置,返回编辑可恢复原文。
- 创建房间创建时再次校验;创建者自动入座第一个固定席位,不自动准备。
path / value / from
当前配置格式是操作列表,旧版 base 写法已经停用。
| 每项内容 | 作用 | 示例 |
|---|---|---|
path | 要替换的位置;字符串为对象键,整数为从 0 开始的列表下标。 | [game_configs, 0, multi_win] |
value | 直接写入的值。与 from 二选一。 | false |
from | 从指定预设复制内容。第一项是预设名,之后是来源路径。 | ["国标", "game_configs", 0] |
path: [] | 替换整个 RoomConfig;日常用于引用整份预设。 | from: ["青雀"] |
操作从上往下执行,后项覆盖前项。替换的是整个目标值,不会递归合并。from 始终读取服务器里的预设,不读取前面操作产生的工作配置。
- path: []
from: ["国标"]
- path: [general_config, reserve_time]
from: ["配置模板", general_config, reserve_time]
- path: [game_configs, 0, multi_win]
value: false
路径和替换
- 父路径必须存在。对象可新增末级键,但列表不会自动增长;新增列表项时先替换整份列表。
- 改一个字段,就把 path 写到该字段;不要用不完整对象替换整个 params 或整个 GameConfig。
- 每项恰好是 path + value,或 path + from,不能同时填写 value 和 from。
- 各项执行中可以暂时不满足配置约束;全部替换后统一校验。路径本身每一步都必须有效。
YAML 写法
用空格缩进,不用 Tab。布尔值写 true/false;数字下标不要加引号。密码、01 位图、纯数字文字及枚举字符串建议加引号。
字符串、枚举和布尔值不要混写
- path: []
from: ["配置模板"]
- path: [general_config, password]
value: "1234"
- path: [game_configs, 0, kuikae]
value: "off"
- path: [game_configs, 0, flower]
value: ""
常用配置示例
展开需要的示例,复制整段;不要把多个“整份预设引用”直接串接。
众娱:300 分结束
- path: []
from: ["众娱"]
- path: [general_config, room_name]
value: "300 分房"
- path: [calculator_configs, 0, room_end]
value:
name: "score"
params: {target: 300}
模板:8 局、不限时
- path: []
from: ["配置模板"]
- path: [general_config, main_time]
value: 0
- path: [general_config, reserve_time]
value: 0
- path: [calculator_configs, 0, room_end]
value:
name: "round"
params: {rounds: 8}
青雀:局末公开全部手牌
- path: []
from: ["青雀"]
- path: [game_configs, 0, show_after_end]
value: true
国标:开局补花,且全局强制补花
- path: []
from: ["国标"]
- path: [game_configs, 0, opening_flower]
value: true
- path: [game_configs, 0, force_flower]
value: true
模板:随机方向、同色换三张
- path: []
from: ["配置模板"]
- path: [game_configs, 0, exchange_rule]
value: "same"
- path: [game_configs, 0, exchange_count]
value: 3
- path: [game_configs, 0, exchange_target]
value: [-1]
模板:每家两张虚拟万能牌
- path: []
from: ["配置模板"]
- path: [game_configs, 0, wildcard]
value: 2
模板:二人对局,同时调整人数、分数、设置和支付
- path: []
from: ["配置模板"]
- path: [general_config, max_player]
value: 2
- path: [general_config, starting_score]
value: [[0], [0], [0]]
- path: [general_config, seat_orders]
value: []
- path: [player_configs]
value:
- {auto_sort_hand: true, auto_win: false, auto_flower: false, auto_discard: false}
- {auto_sort_hand: true, auto_win: false, auto_flower: false, auto_discard: false}
- path: [calculator_configs, 0, settlements, win, params]
value:
discard_winner: 1
discard_loser: -1
discard_bystander: 0
draw_winner: 1
draw_loser: -1
"on": ["win"]
scorer: "win"
leave: true
第一个固定席位:自动和牌、自动补花
- path: []
from: ["配置模板"]
- path: [player_configs, 0, auto_win]
value: true
- path: [player_configs, 0, auto_flower]
value: true
只改一项番种分值,不替换整个番表
- path: []
from: ["配置模板"]
- path: [calculator_configs, 0, scorers, win, params, combinations, 0, score]
value: 2
总结构与多局配置
所有路径都从 RoomConfig 根部出发;下列字段适用于当前格式。
| 顶层字段 | 内容 | 使用方式 |
|---|---|---|
version | 正整数;当前预设为 1,也是牌谱 format_version 的来源。 | 一般沿用预设。不是软件版本,也不用于选择历史预设。 |
general_config | 房间名、人数、局配置选择、起始分数、座位和计时。 | 对象;例如 [general_config, main_time] |
game_configs | 一组单局流程配置。 | 列表;常用 [game_configs, 0, ...] |
calculator_configs | 一组计分、支付、结束和局末/整场结算配置。 | 列表;常用 [calculator_configs, 0, ...] |
player_configs | 按固定席位保存的自动操作设置。 | 长度必须等于人数。 |
每局选用哪一份配置
n 取实际局数 round_index 的第一项,从 0 开始;不按牌谱里的 game_id 选择。连庄时 n 不变,继续沿用原配置。两条序列独立循环:
game_configs[general_config.games[n % len(general_config.games)]]
calculator_configs[general_config.calculators[n % len(general_config.calculators)]]例如 games = [0, 1, 0],依次选第 0、1、0 份单局配置;calculators = [0, 1] 则独立交替。序列不能空,所指下标必须存在。
先建立两个列表位置,再填入完整配置并循环选择
- path: []
from: ["配置模板"]
- path: [game_configs]
value: [{}, {}]
- path: [game_configs, 0]
from: ["配置模板", game_configs, 0]
- path: [game_configs, 1]
from: ["配置模板", game_configs, 0]
- path: [game_configs, 1, allow_chi]
value: []
- path: [general_config, games]
value: [0, 1, 0]
calculator_configs 使用同样的方法建立多份,再配置 calculators。不要直接写超出列表长度的下标;示例中的临时空对象会在最终校验前被完整预设替换。
general_config:房间规则
表中默认值来自“配置模板”,不是所有预设的共同默认值。
| 字段 | 类型 | 说明 | 模板默认 |
|---|---|---|---|
room_name | 字符串,≤32 字符 | 房间列表显示的名称;空字符串允许,不会因此自动获得另一份规则。 | "配置模板" |
password | 字符串 | 入座密码;空字符串表示无密码。非空没有单独的字符数上限,仍受配置总大小限制。密码不限制观战。 | "" |
info | 字符串 | 房间固定说明文字;只是展示,不是规则表达式。 | "" |
max_player | 整数 2 / 3 / 4 | 固定席位总数。改变人数必须同步 starting_score、player_configs、seat_orders 和换牌方向。 | 4 |
games | 非空整数列表 | 按 n 循环选取 game_configs 的下标。 | [0] |
calculators | 非空整数列表 | 按同一个 n 独立循环选取 calculator_configs 的下标。 | [0] |
starting_round | 非空整数列表 | 初始局数,第一项≥0。普通规则通常 [0];立直规则必须 [局序, 本场数]。 | [0] |
starting_score | 二维整数列表 | 行数=人数+1,末行为公共分数池;每行非空且维数相同。 | [[0],[0],[0],[0],[0]] |
random_seat | 布尔值 | 首次开局前是否随机分配固定席位;下一局不再重新随机。 | false |
seat_orders | 二维整数列表 | 第 n 项给出局内玩家→固定席位映射,每项须为 0…人数−1 的完整排列;空或未覆盖的局数按局序轮换。 | [] |
main_time | 非负整数,秒 | 人工候选集合实际改变时重新给予的基本时限;不是每收到一次状态就刷新。 | 10 |
reserve_time | 非负整数,秒 | 基本时间用完后消耗;每局重置,不因单次行动或重连重置。 | 20 |
分数、座位与时间
四人一维分数可写 [[0], [0], [0], [0], [0]],二人则是三行。多维分数用于需要分别记账的规则;standard 支付只改第一维,free_count 输出维数必须与每行分数维数一致。
固定席位属于房间,局内玩家编号会随轮庄改变。player_configs 按固定席位保存,进入每局时映射到对应局内玩家。一个账号可以控制多个席位。
game_configs:单局规则
以下字段都在 game_configs 的某一项内,例如 [game_configs, 0, dead_wall]。
| 字段 | 类型/取值 | 说明 | 模板默认 |
|---|---|---|---|
wall | 字符串 | 按声明顺序列出每张牌,例如 1m1m2m。每张都是“数字+花色”;不能写成 112m。 | 136 张普通牌,见预设 |
shuffle | 布尔值 | 是否随机洗牌;true 时不使用用户给出的 wall_rand 排序。 | true |
wall_rand | 整数列表 | 不洗牌时,各声明牌的排序号。空列表沿用声明顺序;非空必须是从 0 开始、无重复的连续整数排列,建议与牌数等长。 | [] |
hand_size | 非负整数 | 每家初始发牌数量,不含庄家随后第一次摸牌;启用 wildcard 时实发 hand_size−wildcard 张。 | 13 |
wildcard | 整数 0…min(2, hand_size) | 虚拟万能牌数量,无实体牌 ID,不参与弃牌、吃碰杠或换牌。仅支持普通牌山的手牌拆解。 | 0 |
dead_wall | 非负整数 | 不供普通摸牌使用的保留牌数量;立直预设为 14。不可用旧 reserved_tiles 代替。 | 0 |
exchange_rule | "off" / "same" / "any" | 不换/同花色换/任意换。same 若没有同色合法组合,则允许任意选择。 | "off" |
exchange_count | 非负整数 | 每家换出张数。启用换牌时必须>0,且不得超过实发手牌数。 | 0 |
exchange_target | 整数列表 | 每项表示该局内玩家将牌交给谁;[-1] 在初始化随机方向。显式值必须是全部玩家编号的排列。 | [-1] |
flower | 01 字符串 | 按 wall 声明位置标记需补出的牌;空为不标记。花色 f 不会自动让牌成为补花牌。 | "" |
transparent | 01 字符串 | 按声明位置标记透明牌;当前在线视图向所有人提供其牌面,不必等到离开牌山。 | "" |
red | 01 字符串 | 按声明位置标记赤牌特征。是否加分由计分规则决定,不会单独生成牌。 | "" |
opening_flower | 布尔值 | 庄家第一次摸牌后进入顺序开局补花;启用换牌时先换牌。 | false |
force_flower | 布尔值 | 全局强制合法补花,不仅限开局;仍受可补花候选条件约束。 | false |
duplicate | 布尔值 | 将可摸牌山分给各家,模拟分别从自家分区摸牌;公共保留牌不分给玩家。 | false |
allow_chi | 花色字符串列表 | 允许吃的花色;[] 禁止吃。基础顺子按同花色连续数字生成,不会凭字符串自动定义特殊顺子。 | ["m","p","s"] |
allow_pon | 花色字符串列表 | 允许碰的花色;[] 禁止碰。 | ["m","p","s","z"] |
allow_kan | 花色字符串列表 | 允许杠的花色;[] 禁止所有这些花色的杠。 | ["m","p","s","z"] |
kan_after_chipon | 布尔值 | 吃碰后是否允许补花、暗杠或加杠;不改变已立直等其他资格。 | true |
chiponkan_with_empty_wall | 布尔值 | 普通可摸牌山耗尽时,是否仍允许吃碰杠及合法补花;false 会禁止对应候选。 | true |
riichi | "off" / "standard" | 关闭/启用立直行动;完整立直计分、供托、流局与终局还需要配套计算器。 | "off" |
kuikae | "off" / "same" / "suji" | 吃碰后食替:不限制/禁止同牌/吃牌另禁相应筋牌。杠后不设此限制。 | "off" |
tactical_call | 字符串枚举 | 战术发声和改选模式,见下表。 | "off" |
dora_indicator_timing | "off" / "immediate" / "after_discard" | 翻宝牌指示牌时机,见下文。不会仅凭翻牌自动计算宝牌分数。 | "off" |
show_after_win | 布尔值 | 和牌时公开和牌者手牌。 | true |
show_after_end | 布尔值 | 单局结束时公开各家手牌。 | false |
show_closed_kan | 布尔值 | true 时公开暗杠中间两张;false 不向他家公开。原牌数据另有透明等可见性时按实际数据显示。 | true |
multi_win | 布尔值 | 是否允许同一响应批次多家和牌;false 时由现有仲裁优先级确定一家。 | true |
牌面、位图与固定牌序
| 写法 | 含义 |
|---|---|
m / p / s | 万/筒/索 |
1z … 7z | 通常依次是东、南、西、北、中、发、白 |
1f … 8f | 花牌牌面;是否需要补花仍由 flower 位图决定 |
1m2m3m | 三张牌 |
123m | 会被解释成一张点数为 123 的牌,不是 1、2、3 万 |
flower、transparent、red 对应洗牌前 wall 的声明位置,不是摸牌顺序。位图短于牌山时,后续位置不标记;超出部分忽略;建议写到需要标记的最后一张。一般型和特殊型预设拆解主要处理普通 m/p/s/z;自定义未知花色不等于已有计分器会识别。
开局换牌与虚拟万能牌
换牌在庄家第一次摸牌后、开局补花前进行。每家选择被收齐后才统一移动。庄家 draw 区的牌可换出,换入的一张补到 draw 位置。exchange_target: [-1] 在四人时随机顺/逆/对家,在其他支持人数时随机顺/逆;[1,2,3,0] 表示 0→1→2→3→0。
wildcard 不把任何实体牌变成万能牌,而是假定手牌中另有该数量的虚拟牌。算分按补入普通牌后的拆解处理;组合麻将的组合奖励只用实牌,听牌奖励按补全处理。洁律 B 的替代牌计分是另一套规则,不能用 wildcard 代替。
战术发声
| tactical_call | 含义 |
|---|---|
"off" | 关闭战术发声,按最终确定行动处理。 |
"immediate_single" | 可发声时立即发声;已经发声的选择不再改选更高项。 |
"delayed_single" | 等待更高优先级表态后发声;发声后不再改选。 |
"immediate_continuous" | 立即发声;允许按仲裁重新开放的更高选项改选。 |
"delayed_continuous" | 延迟发声,并允许按仲裁重新开放的更高选项改选。 |
宝牌指示牌
off 完全不翻。其他模式在发牌后翻第一张,暗杠后始终立即翻;immediate 对明杠/加杠也立即翻。after_discard 对明杠/加杠延迟到后续普通 draw、吃、碰、杠或和时释放,不由 tail_draw 释放;不要只按英文名称理解成“discard 事件立刻翻”。
指示牌依次取初始牌序倒数第 6、8、10、12、14 张,最多五次。对应位置已经不是牌山或不存在时静默跳过实际翻牌。里宝牌由立直计分读取相应牌,不是另一个 GameConfig 字段。
公开、暗杠与复式
暗杠完全不向他家公开时,客户端对牌主遮住两端、显示中间两张;存在实际可见或透明牌时按实际数据展示。显示设置不代替规则中的门清、和牌与计分判断。
duplicate 下普通摸牌、补牌都从各自牌山前端取牌;保留牌山单独存放。不能整除时序号较低玩家多分一张。它提供分区牌山;不是跨房间比赛、配对排名或自动复刻平台。
player_configs:按席位自动操作
自动设置改变选择方式,不改变合法行动和计分规则。
| 字段 | 类型 | 用途 | 模板默认 |
|---|---|---|---|
auto_sort_hand | 布尔值 | 自动理牌。关闭后仍做必要归手,初始发牌会排序;局中保留既有牌序并将摸牌并入。 | true |
auto_win | 布尔值 | 有合法和牌候选时由 room 自动选择;不会绕过规则判和。 | false |
auto_flower | 布尔值 | 有合法补花候选时自动选择;与全局强制补花 force_flower 不同。 | false |
auto_discard | 布尔值 | 有合法 draw 区弃牌时自动摸切,不擅自代选普通手牌。 | false |
player_configs 的第 0 项对应第一个固定席位,不是永远的庄家。一人多席位时每席独立;列表长度必须等于 max_player。首版在建房配置中确定,尚未提供局中修改接口或手动整理牌序操作。
完整/简化牌桌、棋盘显示、音量和放大镜属于客户端显示设置,不写入 RoomConfig;它们不会改变牌局规则。
calculator_configs:计分与结束
日常只修改预设中的局部参数;换算法时要同步检查输入、分组、支付和结束策略。
每种策略都用 name 和 params 表示;即使没有参数,也保留 params: {}。scorers 和 settlements 是“自定义键 → 策略”的字典,不是列表。
| 字段 | 负责什么 | 当前可选 name |
|---|---|---|
discard | 指定落点的弃牌策略。 | none, grid |
scorers | 牌型/番种计分;每项都是一个具名 scorer。 | pure_add, group_max, category_max, riichi, jielv |
settlements | 行动触发的支付或奖励;显式绑定 scorer。 | standard, free_count, hand_award, riichi, riichi_deposit, diaopai, jielv |
game_end | 判断本局何时结束。 | standard, riichi, gomoku, none, off |
game_settlement | 本局结束时的结算与局数推进。 | standard, riichi, diaopai, jielv, none |
room_end | 判断整场何时结束。 | round, score, riichi, none, off |
room_settlement | 整场结束时的排名及最终结算。 | standard, riichi, none |
名字、算法与显式绑定
下面的 win 是字典中的自定义键;pure_add、standard 是算法名称。settlement.params.scorer 指向 scorer 的键,不会自动按名称配对,也不会自动把全部 scorer 分数累加。
计分与支付的完整绑定示例
- path: []
from: ["配置模板"]
- path: [calculator_configs, 0, scorers, win]
value:
name: "pure_add"
params:
base: 0
least: 1
patterns: ["regular_win"]
combinations:
- {definition: "模板和牌", display: "和牌", score: 1}
- path: [calculator_configs, 0, settlements, win]
value:
name: "standard"
params:
"on": ["win"]
scorer: "win"
leave: true
discard_winner: 2
discard_loser: -2
discard_bystander: 0
draw_winner: 3
draw_loser: -1
| settlement.params 公共字段 | 用途 |
|---|---|
on | 触发行动名列表。普通和牌支付使用 ["win"];立直供托专用策略用 ["discard"]。 |
scorer | 同一 CalculatorConfig.scorers 中的键;有非空 on 时必须绑定。 |
leave | 结算后是否记录离场,默认不由 win 自动决定。max_left 统计此类离场玩家。 |
同时配置多个被触发的结算策略,会分别处理。没有实现的触发/策略不能仅靠写一个新 name 获得功能;杠专用结算仍未完成。
允许的拆解:scorer.params.patterns
| 名称 | 含义 |
|---|---|
regular_win | 一般型,一对加若干顺子/刻子,固定副露纳入完整拆解。 |
seven_pairs | 一般七对,可将四张同牌按两对计。 |
strict_seven_pairs | 严格七对,七种不同的对子;立直预设使用此项。 |
thirteen_orphans | 十三幺。 |
all_unconnected | 全不靠。 |
combination_dragon | 组合龙的一般型拆解。 |
no_hand | 不要求手牌拆解,成立条件完全交给番种;五子棋使用,不能与 wildcard 混用。 |
任意花色/更大数字的一般型拆解工具尚未注册为预设 patterns。不能在配置中直接写 general_win 并期待运行。
番种:scorer.params.combinations
| 条目字段 | 说明 |
|---|---|
definition | 已注册番种或由它们构成的空格分隔逆波兰表达式。 |
display | 面向玩家的显示名称,可用 YAML 双引号中的 \n 换行。 |
score | 整数单位系数;实际条目分值为表达式整数值 × score。 |
params | 可选的条目参数;例如立直的计分分组。 |
番种返回非负整数:真值类为 0/1,数量类为实际数量。番种与 free_count 共用后缀表达式解释器,支持下表中的算术、比较、逻辑、数学取整和栈操作。番种常量仍为非负整数,最终恰好得到一个有限整数。逻辑与比较始终返回 0/1,条件成立时保留数量请用乘法,例如“国标花牌 国标自摸 *”;“国标花牌 2 >=”判断是否至少两张。只能引用已注册名称,不能写 Python 代码。
名称带规则前缀,如 模板和牌、众娱一色、国标清一色。洁律 A/B 共用一份“洁律”定义。完整注册名称见文末索引。
数量项包括国标花牌、幺九刻、数牌幺九刻、四归一,立直宝牌、里宝牌、赤宝牌、钓牌麻雀杠数及众娱字刻/杠归。众娱两项各按数量乘 10 分,旧一至四的条件定义仍可使用;国标旧 xN 条件也仍按 0/1 判断。国标顺刻复合去重后有 57 项;五组等价项只保留一色四同顺、清龙+一般高、一般高+喜相逢×2、一般高+连六×2、三色三同顺+一般高。其余非等价低阶复合和洁律非线性杠分保留。结算显示 ×N,但 score 已是实际得分,旧日志不重算。
scorer 类型与参数
| name | 主要 params | 计算方式 |
|---|---|---|
pure_add | base, least, patterns, combinations | 对每种拆解累加表达式值 × 单位分,取最高总分,加 base,再以 least 为起和线;输出一维。base 和 least 必须填写。 |
group_max | groups, context_groups?, least?, bonus?, patterns, combinations | 每组按表达式值 × 单位分取最高项。无 least 时按组输出多维;context_groups 下标不参与择优及单独赋予和牌资格。出现 least 时改为 [非奖励总分, 奖励总分],只有第一项通过起和线。 |
category_max | least, direct, whole_groups, combination_groups, status, accidental, no_fan, patterns, combinations | 组合麻将分类取高。直属命中后不再累计全体/组合/状态,偶然番按实际和牌另计;无其他番时使用 no_fan。配 hand_award。 |
riichi | 番、符、役满及宝牌相关参数;见下一节。 | 按实际支付择优,输出 [番, 符, 役满倍数, 基本点],由配套日麻支付解释。 |
jielv | mode, least, groups, bonus, patterns, combinations | mode 为 A 或 B;共用分组取高,另处理封顶、折半、替代牌等洁律规则。建议整套引用预设。 |
standard 与 free_count 支付
| 角色参数 | 对象 |
|---|---|
discard_winner | 点和者 |
discard_loser | 放铳者 |
discard_bystander | 点和旁观者 |
draw_winner | 自摸者 |
draw_loser | 自摸时的其他玩家 |
standard 中五项均为整数倍率,变化=score[0]×倍率;只改记账第一维,公共池及其他维不变。改变人数不会自动重算倍率。
free_count 用五个角色表达式代替整数倍率。a…z 表示 scorer 输出的第 1…26 维,空格分词,按栈顺序计算。最终栈从底到顶就是该角色的记账增减,必须全部为有限整数,维数与 starting_score 每行一致。先前已离场者不再承受负变化,但仍可得正分。
| 类别 | 操作 |
|---|---|
| 二元 | + - * / // % ** min max |
| 比较与逻辑 | == != < <= > >= and or not,结果为 0/1。 |
| 一元 | floor ceil round abs neg sqrt tanh |
| 栈操作 | dup swap drop |
| 示例 | a b + 得到一维相加;a b 留下两维;a 3 * neg 得到 −3a。 |
结算允许负数、小数常量和小数中间值,最终每一维须为整数;round 按恰好半数远离零处理。五个角色公式在加载时检查结构和 a~z 名称,执行时再检查数学错误及实际输出维数。番种表达式使用同一组运算符,但最后仅保留一个整数。
其他支付类型
| name | 用途和约束 |
|---|---|
hand_award | 组合麻将奖励;绑定 category_max,比对和牌、听牌、组合奖励。可以只加分,不要求收支平衡。 |
riichi | 四人立直支付、本场、供托与责任支付;绑定 riichi scorer,on=["win"]。 |
riichi_deposit | 立直宣言弃牌后未被和时收取供托;绑定 riichi scorer,on=["discard"]、leave=false。 |
diaopai | 钓牌麻雀支付;绑定有完整分组的 group_max,on=["win"],pao 控制包牌,按日志顺序确定责任。 |
jielv | 洁律支付;绑定 jielv scorer,on=["win"],A/B 与对应预设配套。 |
单局结束、局末和整场
| 位置/name | 参数和含义 |
|---|---|
game_end / standard | max_left≥1,默认1:达到离场人数;left_draw≥0,默认0:达到后保留的普通摸牌次数;left_wall≥0,默认0:提前流局的活牌余量阈值。 |
game_end / riichi | 四人日麻的和牌、荒牌与途中流局判断。 |
game_end / gomoku | 五连获胜、棋盘无落点或牌山耗尽结束。 |
game_settlement / standard | 无额外变分,正常推进局数。 |
game_settlement / riichi | 听牌罚符、流局满贯、本场及连庄。 |
game_settlement / diaopai | params.settlement 指向钓牌支付键;流局计算副露/杠等奖励,不重复支付赢家。 |
game_settlement / jielv | params.scorer 指向洁律 B 计分键;结算未和牌者的补牌替代得分。 |
room_end / round | params.rounds:next_round[0] 达到此绝对局序时结束;不是从 starting_round 再额外打这么多局。 |
room_end / score | params.target:任一玩家第一维达到目标时结束,不计公共池。 |
room_end / riichi | 四人日麻击飞、预定局数、延长、和了止/听牌止。 |
room_settlement / standard | 按已有最终分数生成排名,不额外加分。 |
room_settlement / riichi | 终局供托、返点、顺位点和同分处理。 |
立直麻将的配置位置
流程字段、计分参数、番表和结算参数分开存放;不要只改其中一处就视作整套规则已替换。
需要立直规则时,先整份引用“立直麻将”。只把 game.riichi 改成 standard 不会自动建立番种、符、供托和终局规则。当前日麻策略限四人,starting_round 必须为 [局序, 本场数];末行公共池是供托,需为非负的 1000 倍数。
立直麻将:东场预定局数,不再延长
- path: []
from: ["立直麻将"]
- path: [calculator_configs, 0, room_end, params, rounds]
value: 4
- path: [calculator_configs, 0, room_end, params, extension]
value: false
| 参数所在位置 | 常用字段 |
|---|---|
scorers.win.params | least, ippatsu, ura_dora, kan_dora, kan_ura_dora, multiple_yakuman, yakuman_limit, kazoe_limit, kiriage_mangan, double_wind_pair_fu, riichi_min_live_tiles, furiten_clear, kokushi_ankan_ron |
settlements.win.params | pao, pao_suukantsu, pao_scope, pao_honba, award_deposits |
game_end.params | kyuushu_abort, four_winds_abort, four_riichi_abort, four_kan_abort, three_ron_abort |
game_settlement.params | noten_penalty, nagashi_mangan, nagashi_allow_calls, tenpai_renchan |
room_end.params | tobi, rounds, target_score, extension, extension_rounds, agari_yame, tenpai_yame |
room_settlement.params | return_score, rank_points, tie_break, end_deposits |
| 字段/枚举 | 用途 |
|---|---|
least | 不含宝牌的起和番数,正整数。 |
ippatsu / ura_dora / kan_dora / kan_ura_dora | 分别启用一发、里宝牌、杠宝牌、杠里宝牌,布尔值。 |
multiple_yakuman / yakuman_limit | 是否累计多个役满,以及役满倍数上限;上限正整数。 |
kazoe_limit | "yakuman" / "sanbaiman" / "unlimited",数え役满上限模式。 |
kiriage_mangan / double_wind_pair_fu | 切上满贯开关;连风雀头符为 2 或 4。 |
riichi_min_live_tiles / furiten_clear | 立直所需活牌余量下限;同巡振听在 "draw" 或 "discard" 清除。 |
kokushi_ankan_ron | 国士抢暗杠开关。已立直暗杠另要求摸牌参与、杠后仍听且听张集合不变。 |
pao / pao_suukantsu | 责任支付及四杠子责任支付开关。 |
pao_scope / pao_honba | "liable" / "all" 为役满责任范围;"liable" / "discarder" 为本场责任承担方式。 |
award_deposits | 是否由普通和牌支付发放供托。 |
kyuushu_abort / four_winds_abort / four_riichi_abort / four_kan_abort / three_ron_abort | 九种九牌、四风连打、四家立直、四杠散了、三家和了流局开关。 |
noten_penalty | 荒牌未听罚符总额,非负且为 600 的倍数;常用 3000。 |
nagashi_mangan / nagashi_allow_calls / tenpai_renchan | 流局满贯、流满是否允许自身鸣牌,以及庄家听牌连庄。 |
tobi | 击飞开关;当前判断为分数小于 0,恰好 0 分不因此击飞。 |
rounds / target_score / extension / extension_rounds | 预定局序阈值、目标分、是否延长和延长上限;target_score=0 使用初始分的 6/5,extension_rounds=0 不设该上限。 |
agari_yame / tenpai_yame | 终局庄家和了止/听牌止,仍须满足顺位和目标分判断。 |
return_score | 计算比赛结果时的返点基准;0 使用初始分。 |
rank_points | "none" / "5_15" / "10_20" / "10_30" / "jpml",顺位点模式。 |
tie_break / end_deposits | "initial" / "shared":同分顺位;"winner" / "shared" / "discard":终场供托处理。 |
番与符仍在 combinations 中
条目 params.group 可为 han、fu、yakuman、bonus;宝牌、里宝牌、赤宝牌定义直接返回数量,与其他番种同样乘以单位 score;不再使用 params.count。符数定义使用汉字名称。宝牌不会单独满足起和番数。
当前立直预设:关闭食断(条目下标 7)
- path: []
from: ["立直麻将"]
- path: [calculator_configs, 0, scorers, win, params, combinations, 7, definition]
value: "立直断幺九 立直门前清 and"
该下标对应本文生成时的预设;重排番表后请重新在展开预览中确认,不要凭旧下标修改。
预设目录与专用规则
当前共有 11 套预设。表格直接取自本地预设常量,未复制完整番表。
| 预设名 | 默认人数 | 计分 | 普通支付/奖励 | 整场结束 |
|---|---|---|---|---|
| 配置模板 | 4 | pure_add | standard | round · {"rounds":8} |
| 众娱 | 4 | pure_add | standard | score · {"target":200} |
| 兼用卡 | 4 | pure_add | standard | round · {"rounds":4} |
| 青雀 | 4 | group_max | free_count | round · {"rounds":16} |
| 国标 | 4 | group_max | free_count | round · {"rounds":16} |
| 组合麻将 | 4 | category_max | hand_award | round · {"rounds":4} |
| 立直麻将 | 4 | riichi | riichi / riichi_deposit | riichi |
| 钓牌麻雀 | 4 | group_max | diaopai | round · {"rounds":8} |
| 五子棋 | 2 | pure_add | standard | round · {"rounds":1} |
| 洁律A | 4 | jielv | jielv | round · {"rounds":8} |
| 洁律B | 4 | jielv | jielv | round · {"rounds":8} |
预设名必须精确匹配。洁律A、洁律B 中间没有空格;创建页按钮显示的是服务器实际提供的目录。上表是当前本地版本的初始配置,不表示可任意混搭策略。
几项专用规则
- 青雀:番表较大,优先 from 引用后修改局部路径;保留 group_max 的分组维数和 free_count 公式关系。
- 钓牌麻雀:普通支付用 diaopai,局末也用 diaopai 并通过 params.settlement 引用支付键;可选包牌由 pao 控制,责任按实际日志增量处理。
- 洁律 A/B:共用定义,scorer 的 mode 区分计分;B 的 game_settlement 需引用 B 计分器,不应只将 A 的 mode 改为 B。
- 五子棋:二人、hand_size=0、按中/发交替的非随机牌山、discard=grid、game_end=gomoku,双方 auto_win=true。修改棋盘行列在 discard.params.rows/columns;不是修改麻将牌河布局。点格后若只有一张实际手牌则自动落子,否则继续点选手牌。
三人通用麻将可按 max_player 调整并补齐相关列表;当前没有完整三麻专用预设。开局换牌已经可用;局中修改玩家设置、手动牌序和杠专用支付仍未提供。
常见错误与旧版迁移
先看错误指向的操作序号和路径,不要为绕过类型检查把所有值都改成字符串。
| 现象/旧写法 | 改法或原因 |
|---|---|
base: 青雀 | 改为操作列表中的 path: [] + from: ["青雀"]。 |
room_config / game_config / calculator_config | 改为 general_config、game_configs、calculator_configs;后两者为列表,路径中需要整数下标。 |
max_player | 现在在 general_config。人数变化还要调整分数行数、玩家设置长度、座次和换牌方向。 |
wallrand | 现名 wall_rand,非空时必须是从 0 开始的连续整数排列。 |
end_type / end_target | 整场结束改为 calculator_configs[i].room_end 的 name / params。 |
end.params.max_win | 单局结束改为 game_end.params.max_left,统计 leave 人数。 |
calculator_config.patterns / combinations | 移到 calculator_configs[i].scorers[键].params。 |
scorer / settlement | 改为 scorers / settlements 字典,按键显式绑定。 |
riichi: 0 / tactical_call: -1 | 改用当前字符串枚举,如 "off"、"standard"、"immediate_single"。 |
reserved_tiles / indicator_timing | 分别使用 game_configs[i].dead_wall 与 dora_indicator_timing。 |
| 路径不存在或下标越界 | 先确认父路径、对象键、列表长度;不能在只有一项的列表中直接写第 1 项。 |
| 字段缺失 | 可能用不完整对象替换了整个配置段或 params。把路径写到要修改的末级字段,或提供完整对象。 |
| 字符串类型错误 | 密码、01 位图、off 等字符串需要引号;0 和 false 不是同一种类型。 |
| 未知策略/番种/牌型 | 必须引用当前注册名称;客户端不能仅靠配置定义新的 Python 实现。 |
| 有番但算分/支付不对 | 检查分组、bonus、least、scorer 绑定、输入向量与 free_count 输出维数。 |
| 三/二人配置不能通过 | 确认 starting_score 有人数+1行、player_configs 恰好人数项、seat_orders 和 exchange_target 为对应人数排列。立直及洁律策略目前限四人。 |
| 展开预览不能直接当输入 | 完整 RoomConfig 必须包在根路径 value 操作中;日常应保存精简操作列表。 |
校验分三步:解析 YAML/JSON 和操作格式;逐项定位及替换;检查最终字段、取值及已注册策略。它不保证任意算法、分组和支付公式组合都构成合理玩法。
番种名称索引
在页首搜索字段或番种,可直接定位;也可使用浏览器“查找”。
以下是当前已注册的番种名称,可以作为 definition 的单项或表达式操作数。名称不包含空格;清单用于查名,不替代各规则的番种定义和计分分组。
模板 1
模板和牌众娱 25
众娱一字刻众娱一杠归众娱一色众娱三同顺众娱三字刻众娱三杠归众娱三色同刻众娱三色同顺众娱两双同顺众娱二双色同刻众娱二字刻众娱二杠归众娱二色众娱双同顺众娱双色同刻众娱同色三连众娱同色四连众娱四字刻众娱四杠归众娱字刻众娱杠归众娱碰碰和众娱聚三数众娱聚四数众娱镜同兼用卡 24
兼用卡一杠兼用卡三元兼用卡三同兼用卡三数兼用卡三杠兼用卡三连兼用卡三逢兼用卡三风兼用卡二数兼用卡二杠兼用卡五数兼用卡双同兼用卡双逢兼用卡四同兼用卡四喜兼用卡四数兼用卡四杠兼用卡四连兼用卡字一色兼用卡对对和兼用卡混一色兼用卡清一色兼用卡清二色兼用卡门前清组合麻将 73
组合麻将一杠组合麻将一气贯通组合麻将一般高组合麻将七对子组合麻将三双同对组合麻将三同对组合麻将三同顺组合麻将三字刻组合麻将三暗刻组合麻将三杠组合麻将三步高组合麻将三聚组合麻将三色同刻组合麻将三色同顺组合麻将三色贯通组合麻将三色连刻组合麻将三连刻组合麻将三连环组合麻将两三同对组合麻将两双同刻组合麻将两双同对组合麻将两双连刻组合麻将两般高组合麻将九莲宝灯组合麻将二数组合麻将五门齐组合麻将八归组合麻将十三幺组合麻将十二归组合麻将双同刻组合麻将双同对组合麻将双字刻组合麻将双暗刻组合麻将双杠组合麻将双相逢组合麻将双连刻组合麻将双龙会组合麻将喜相逢组合麻将四刻组合麻将四同顺组合麻将四字刻组合麻将四归组合麻将四暗刻组合麻将四杠组合麻将四步高组合麻将四聚组合麻将四连刻组合麻将四连环组合麻将大三元组合麻将大四喜组合麻将天地和组合麻将字一色组合麻将字刻组合麻将字对组合麻将小三元组合麻将小四喜组合麻将岭上开花组合麻将无番和组合麻将暗杠组合麻将枯木逢春组合麻将混一色组合麻将混全带幺组合麻将混幺九组合麻将清一色组合麻将清全带幺组合麻将清幺九组合麻将缺一门组合麻将连六组合麻将连数组合麻将金鸡夺食组合麻将镜同组合麻将门前清组合麻将间数青雀 93
青雀一气贯通青雀一般高青雀七对青雀七连对青雀三元六对青雀三元对青雀三叠对青雀三同顺青雀三暗刻青雀三暗杠青雀三杠青雀三步高青雀三聚青雀三色二对青雀三色同刻青雀三色同对青雀三色同顺青雀三色贯通青雀三色连刻青雀三连刻青雀三连环青雀九莲宝灯青雀二叠对青雀二数青雀二聚青雀二般高青雀五连对青雀五门齐青雀八归青雀六连对青雀剩余一人青雀剩余三人青雀剩余二人青雀剩余四人青雀十三幺青雀十二归青雀双暗杠青雀双杠青雀双龙会青雀叠对青雀四同顺青雀四喜对青雀四暗刻青雀四暗杠青雀四杠青雀四步高青雀四聚青雀四连刻青雀四连对青雀四连环青雀地和青雀大三元青雀大四喜青雀天和青雀字一色青雀对对和青雀小三元青雀小四喜青雀岭上开花青雀抢杠青雀映数青雀暗杠青雀河底捞鱼青雀海底捞月青雀混一数青雀混一色青雀混带幺青雀混幺九青雀清一色青雀清带幺青雀清幺九青雀满庭芳青雀番牌青雀番牌七对青雀番牌三刻青雀番牌三副青雀番牌二刻青雀番牌二副青雀番牌五对青雀番牌六对青雀番牌刻青雀番牌四刻青雀番牌四副青雀连数青雀镜同青雀镜同三对青雀镜同二对青雀镜数青雀门前清青雀间数青雀风牌七对青雀风牌三刻青雀风牌六对国标 157
国标一般高国标一色三同顺国标一色三步高国标一色三节高国标一色双龙会国标一色四同顺国标一色四步高国标一色四节高国标七对国标七星不靠国标三同刻国标三暗刻国标三杠国标三色三同顺国标三色三步高国标三色三节高国标三色双龙会国标三风刻国标不求人国标九莲宝灯国标五门齐国标全不靠国标全中国标全双刻国标全大国标全小国标全带五国标全带幺国标全求人国标十三幺国标单钓将国标双同刻国标双同刻x2国标双明杠国标双暗刻国标双暗杠国标双箭刻国标和绝张国标喜相逢国标四归一国标四归一x2国标四归一x3国标四归一x4国标四暗刻国标四杠国标圈风刻国标坎张国标大三元国标大于五国标大四喜国标妙手回春国标字一色国标小三元国标小于五国标小四喜国标平和国标幺九刻国标幺九刻x2国标幺九刻x3国标幺九刻x4国标抢杠和国标推不倒国标数牌幺九刻国标数牌幺九刻x2国标数牌幺九刻x3国标数牌幺九刻x4国标断幺国标无字国标无番和国标明暗杠国标明杠国标暗杠国标杠上开花国标海底捞月国标混一色国标混幺九国标清一色国标清幺九国标清龙国标碰碰和国标箭刻国标组合龙国标绿一色国标缺一门国标老少副国标自摸国标花牌国标花牌x2国标花牌x3国标花牌x4国标花牌x5国标花牌x6国标花牌x7国标花牌x8国标花龙国标边张国标连七对国标连六国标门前清国标门风刻国标面子组合_一般高国标面子组合_一般高_喜相逢国标面子组合_一般高_喜相逢_老少副国标面子组合_一般高_喜相逢_连六国标面子组合_一般高_喜相逢x2国标面子组合_一般高_老少副国标面子组合_一般高_连六国标面子组合_一般高_连六x2国标面子组合_一般高x2国标面子组合_一般高x2_喜相逢国标面子组合_一般高x2_老少副国标面子组合_一般高x2_连六国标面子组合_一色三同顺国标面子组合_一色三同顺_喜相逢国标面子组合_一色三同顺_老少副国标面子组合_一色三同顺_连六国标面子组合_一色三步高国标面子组合_一色三步高_一般高国标面子组合_一色三步高_喜相逢国标面子组合_一色三步高_老少副国标面子组合_一色三步高_连六国标面子组合_一色三节高国标面子组合_一色双龙会国标面子组合_一色四同顺国标面子组合_一色四步高国标面子组合_一色四节高国标面子组合_三色三同顺国标面子组合_三色三同顺_一般高国标面子组合_三色三同顺_老少副国标面子组合_三色三同顺_连六国标面子组合_三色三步高国标面子组合_三色三步高_一般高国标面子组合_三色三步高_喜相逢国标面子组合_三色三步高_老少副国标面子组合_三色三步高_连六国标面子组合_三色双龙会国标面子组合_喜相逢国标面子组合_喜相逢_老少副国标面子组合_喜相逢_连六国标面子组合_喜相逢_连六_老少副国标面子组合_喜相逢_连六x2国标面子组合_喜相逢x2国标面子组合_喜相逢x2_老少副国标面子组合_喜相逢x2_连六国标面子组合_清龙国标面子组合_清龙_一般高国标面子组合_清龙_喜相逢国标面子组合_清龙_老少副国标面子组合_老少副国标面子组合_花龙国标面子组合_花龙_一般高国标面子组合_花龙_喜相逢国标面子组合_花龙_老少副国标面子组合_花龙_连六国标面子组合_连六国标面子组合_连六_老少副国标面子组合_连六x2立直 65
立直一发立直一杯口立直一气通贯立直一百一十符立直一百三十符立直一百二十符立直一百五十符立直一百六十符立直一百四十符立直一百符立直七十符立直七对子立直三十符立直三暗刻立直三杠子立直三色同刻立直三色同顺立直中立直九十符立直九莲宝灯立直二十五符立直二十符立直二杯口立直五十符立直八十符立直六十符立直双立直立直发立直四十符立直四暗刻立直四暗刻单骑立直四杠子立直国士无双立直国士无双十三面立直地和立直场风立直大三元立直大四喜立直天和立直字一色立直宝牌立直对对和立直小三元立直小四喜立直岭上开花立直平和立直抢杠立直断幺九立直河底捞鱼立直海底摸月立直混一色立直混全带幺九立直混老头立直清一色立直清老头立直白立直立直立直纯全带幺九立直纯正九莲宝灯立直绿一色立直自风立直赤宝牌立直里宝牌立直门前清立直门前清自摸和钓牌麻雀 38
钓牌麻雀一杠钓牌麻雀三杠钓牌麻雀二杠钓牌麻雀和牌钓牌麻雀四杠钓牌麻雀杠数钓牌麻雀组合_三同露钓牌麻雀组合_三步露钓牌麻雀组合_三连露钓牌麻雀组合_三逢露钓牌麻雀组合_二同露钓牌麻雀组合_二同露_三同露钓牌麻雀组合_二同露_三步露钓牌麻雀组合_二同露_三连露钓牌麻雀组合_二同露_三逢露钓牌麻雀组合_二同露_二同露钓牌麻雀组合_二同露_二连露钓牌麻雀组合_二同露_二逢露钓牌麻雀组合_二连露钓牌麻雀组合_二连露_三同露钓牌麻雀组合_二连露_三步露钓牌麻雀组合_二连露_三连露钓牌麻雀组合_二连露_三逢露钓牌麻雀组合_二连露_二连露钓牌麻雀组合_二逢露钓牌麻雀组合_二逢露_三同露钓牌麻雀组合_二逢露_三步露钓牌麻雀组合_二逢露_三连露钓牌麻雀组合_二逢露_三逢露钓牌麻雀组合_二逢露_二连露钓牌麻雀组合_二逢露_二逢露钓牌麻雀组合_五步露钓牌麻雀组合_五连露钓牌麻雀组合_五逢露钓牌麻雀组合_四同露钓牌麻雀组合_四步露钓牌麻雀组合_四连露钓牌麻雀组合_四逢露五子棋 1
五子棋五连洁律 53
洁律一杠洁律三元洁律三同顺洁律三杠洁律三步刻洁律三步顺洁律三连刻洁律三连顺洁律三逢刻洁律三逢顺洁律三风洁律二杠洁律双同顺洁律双箭洁律双逢刻洁律双逢顺洁律双风洁律同顺洁律四同顺洁律四喜洁律四杠洁律四步刻洁律四步顺洁律四连刻洁律四连顺洁律四逢顺洁律天和洁律字一色洁律对对和洁律平和洁律杠上和洁律海底和洁律混一数洁律混一色洁律混三数洁律混二数洁律混四数洁律清一色洁律清三数洁律清二数洁律清二色洁律清五数洁律清四数洁律独钓洁律组合_同顺_逢刻洁律组合_同顺_逢顺洁律组合_逢刻_逢刻洁律组合_逢顺_逢刻洁律组合_逢顺_逢顺洁律自摸和洁律逢刻洁律逢顺洁律门清来源与适用版本
这是当前配置的使用说明,不是旧帮助页的原样副本。
原帮助页:Mahjonglab 配置使用指南。本页参考其快速使用、字段表、计分说明和错误示例的组织方式;配置格式与功能以当前 Mahjonglab2 本地源码为准,旧语法不再沿用。
整理日期:2026-10-28。当前 RoomConfig.version = 1;客户端软件版本与 WebSocket 协议版本不由此字段控制。预设引用读取服务器当前内容,版本号不自动选择历史预设。
新牌谱保存脱敏后的路径操作,并按内容哈希引用开局时的不可变预设快照。多个牌谱可以共享同一份规则,不会逐桌重复保存青雀大表;读取新牌谱时采用归档快照。离线 JSON 目前仍需要归档服务器提供这些快照,旧牌谱没有保存的历史规则不能补造。
本页为单文件 HTML,样式、目录搜索和复制功能均在文件内,不加载外部字体、脚本或图片。保存到本地后可离线阅读;只有打开原帮助页链接时才联网。
维护依据:config/types.py、config/load.py、config/validate.py、config/presets、engine/choice.py、engine/action.py、calculator 各策略与客户端配置编辑说明。文中可复制的配置示例在生成时经过当前配置加载器校验;配置示例校验不代替真实对局和设备验证;部署范围与验证结果见项目的 docs/FIRST_DEPLOYMENT.md。