常见错误¶
本页汇总规则创作中最常见的几类错误。规则跑起来行为不符合预期时,可对照本页快速定位。
| 错误 | 症状 | 处理 |
|---|---|---|
条件转移的 condition 槽未连接 |
流程稳定走「否」分支,易误判为引擎 bug | condition 槽必须接一个逻辑或比较组件 |
| 枚举存放非整数值 | 后端拒绝或行为异常 | 枚举的实际值必须是整数;显示名仅供前端展示 |
| 试图构造动态大小的集合 | 流程无法执行 | 平台只支持预定义集合(玩家集、手牌、弃牌等),设计规则时绕开 |
| 开始节点未连接下一节点 | 流程未推进即结束 | 开始节点必须连一条出边 |
| 方法调用参数未填或顺序错误 | 方法行为不符合预期 | 参数按名匹配,在方法调用组件中填写参数名 |
| 跨牌型压制方向写反 | 「炸弹压不过单张」之类 | 压制关系从进攻方视角声明:在炸弹的「可压过」中加单张 |
属性访问 operator 选错 |
取出错误内容 | 0 取对象属性、1 取组件结果属性、2 取集合映射结果 |
比较返回值 0 被误解为 false |
同上 | 0 表示 A 胜,1 表示 B 胜 |
| 属性名使用中文 | 历史上遇到过乱码与兼容问题 | 优先使用 ASCII,如 point / suit / score |
同牌型缺少 compare_flow |
出牌被拒,提示无法比较 | 同牌型必须有 compare_flow,实在没有真实排序也要写兜底 |
| 结算流程未覆盖所有玩家 | 部分玩家结算结果缺失 | 结算流程会被平台对每个玩家执行一次,不要假设只跑一次 |
| 发牌前未洗牌 | 每局牌序完全相同 | 主流程开头加一个洗牌组件,平台不会自动洗 |
| 属性名与组件 ID 冲突 | 偶发取值错误 | 不要用纯数字或单字母给属性命名,使用描述性名字 |
枚举的 default 不在 config 列表中 |
启动时枚举初始化失败 | default 必须是 config[*].value 中的某个值 |
| 跨牌型压制 DAG 出现环 | 配置被平台拒绝 | 「可压过」关系必须无环 |
排查顺序建议¶
遇到规则行为异常时,按以下顺序排查通常最快。
- 顺着开始节点沿
next走一遍流程图,确认没有断点或空条件 - 检查每个属性访问组件的
operator是否正确(约九成的「取值不对」问题出在这里) - 检查牌型
build_flow在匹配分支是否真的放了匹配返回(result=1) - 检查跨牌型压制方向是否在进攻方上声明
- 导出 JSON 与
test2.json对比,确认整体结构无异常
仍无法定位时,在仓库提一个 issue,附上导出 JSON。