一个篮球社团的学生在无代码编辑器里搭一个校内3v3小游戏。他先在“结束条件”里写了“比赛10分钟结束”,过了一会儿想起街头球场的习惯,又加了一条“先得21分才结束”。两条规则都保存成功,编辑器没有任何提示。试玩时他发现,有一局10分钟到了比分是15比12,游戏却还在继续;另一局一方拿到21分时才过了6分钟,游戏也结束了。他分不清这到底是哪条规则在起作用。
这不是程序出错,而是规则之间存在一个没有被说明的关系:时间到和分数到,哪个先判定?类似的矛盾在普通创作者搭建的规则里非常普遍,而且不止这一种形态。系统要做的,是在用户点击试玩之前,把这些矛盾分类找出来,并用用户能理解的方式说清楚。
三类冲突,处理方式不同
在无代码篮球规则里,冲突大致可以分成三类:
| 类型 | 典型例子 | 后果 | 系统处理 |
|---|---|---|---|
| 硬冲突 | 先得10分获胜,但每回合最多得1分、只有5回合 | 比赛永远无法按胜利条件结束 | 阻止发布,必须修改 |
| 优先级缺失 | 10分钟结束,同时先得21分结束 | 两个条件都可能触发,结果不确定 | 要求选择优先级,给出默认值 |
| 软冲突 | 3v3半场使用24秒进攻计时 | 能正常进行,但节奏明显偏慢 | 提醒,不阻止发布 |
分类的意义在于,三类问题对用户的打扰程度应该不同。把软冲突当成硬冲突拦下来,用户会觉得系统过度干预;把硬冲突当成软冲突放过去,发布出去的就是一个根本结束不了的游戏。
硬冲突:沿着计分链算出上限
“先得10分获胜”配上“每回合最多得1分、只有5回合”,是最典型的硬冲突。检测它不需要试玩,只需要沿着规则之间的依赖往下推:胜利条件依赖计分规则,计分规则依赖得分方式和回合数。每回合最多1分,一共5回合,一方理论上最多得到5分,而胜利条件要求10分。5小于10,目标不可达。
这种检测本质上是一种约束求解:把每条规则转成数值上的上下限,再检查目标是否落在可达区间内。类似的例子还有:
- 胜利条件是“三分球绝杀才算赢”,但场地设置里关闭了三分线。
- 要求“每名球员至少得2分比赛才能结束”,但替补规则允许有人全场不上场。
- 犯规满1次即罚下,但每队只有3人且没有替补,第一次犯规后就无法凑齐上场人数。
提示语要把推导过程说出来:“你设置了每回合最多得1分、一共5回合,一方最多只能拿到5分,但获胜需要10分,比赛将无法结束。可以把获胜分数改为5分以内,把回合数增加到10回合以上,或者允许每回合得2分。”三个方案都是能直接点选的按钮。
方案的排列顺序也有讲究。系统会参考用户的修改记录:如果“每回合最多1分”是刚刚才改的,而“先得10分获胜”从项目创建时就在,那么更可能是新改动打破了原有平衡,方案里会把“恢复每回合得分上限”排在前面;反过来,如果用户一直在调胜利分数,就优先建议调整分数。在乐鱼体育的设计里,这个排序只是建议,所有方案都保持可选,系统不会因为猜测用户意图而自动改掉任何一条规则。
还有一类硬冲突比较隐蔽:数学上可达,但被另一条规则间接封死。比如“先得21分获胜,且必须领先2分”,同时又规定“比分到20比20时直接进入突然死亡,先得1分者胜”。前一条要求领先2分,后一条却在20平时用1分决胜,两条对同一局面给出了不同结论。检测这类问题需要把几条规则放到同一个局面里推演一遍,而不只是比较上限。
优先级缺失:两条都对,但没说谁先
开头那个学生的情况属于优先级缺失。“10分钟结束”和“先得21分结束”单独看都合法,也都可以达成,问题是它们谁都可能先发生,而用户没说明发生冲突时听谁的。检测方法很直接:当同一个结果(比赛结束)有两个以上的触发来源,并且没有明确优先级时,就标记出来。
系统给出的选项通常是这三种:
- 先到者生效:任一方先到21分立即获胜;10分钟到时比分领先者获胜。这也是常见三人篮球玩法采用的逻辑,适合作为默认值。
- 以分数为准:必须有人到21分才结束,10分钟只作为提醒,不结束比赛。
- 以时间为准:10分钟到才结束,21分只作为提前结束的奖励开关,可以关闭。
选定之后,系统还要继续往下追一步:如果选了“先到者生效”,那么10分钟到时恰好平分怎么办?这是由上一个选择派生出来的新缺口,需要补一条加时规则,比如“平分时进入加时,先得2分者获胜”。用户做出第一个决定之后,第二个问题才会出现,这种顺序比一开始就抛出所有问题更容易理解。
软冲突:能跑,但值得提醒
软冲突不会让游戏坏掉,只会让它不太像用户想要的样子。3v3半场用24秒进攻计时是一个例子:半场空间小、人少,24秒会让每次进攻拖得很长,常见三人篮球玩法用的是12秒。再比如全场比赛每队只有2人,球员大部分时间在折返跑;或者犯规上限设得很低,导致比赛后半段频繁出现罚下。
对这类问题,系统只在相关字段旁边显示提醒,说明原因和常见取值,不阻止发布。用户可能就是想要一个节奏慢、强调组织进攻的版本,这是合理的设计选择,平台不该替他改掉。
什么时候检查,检查到什么程度
在乐鱼体育的无代码编辑流程里,规则检查分成三个时机:用户修改某条规则时,只检查和它直接相关的规则,并用轻量标记提示;用户点击试玩时,完整检查所有硬冲突和优先级缺失;用户点击发布时,再加上一轮模拟对局,看比赛实际上以什么方式结束。第三步能发现静态检查看不出的问题,比如理论上21分可达,但在当前电脑对手难度下,绝大多数比赛都在10分钟时以十几分结束,“先得21分”几乎从不生效。这类问题更偏向可玩性,可以参考发布前的可玩性检查。
冲突检测背后依赖的是一张记录规则之间关系的依赖图,它为什么对普通创作者这么重要,在无代码体育游戏平台的规则关系一文里有更完整的讨论。对那个社团学生来说,他不需要知道依赖图是什么,他只需要在第二次保存时看到一句话:“你同时设置了10分钟结束和先得21分结束,哪个先算?”