多个角色在同一拍提出移动时,依次改坐标可能让先处理的角色获得不公平优势。先根据同一张起始棋盘检查全部提议,再统一决定哪些通过,可以避免顺序影响。
下面给出一组可以从头复算的练习数据。先按约定记录每一步,再比较最后的核对条件;遇到差异时,不急着修改答案,而是先找出从哪一步开始不同。本例描述的是明确限定的游戏规则模型,不代替某款作品自己的说明。
约定与输入
本例禁止进入起始时已被占用的格,即使该角色也打算离开。越界拒绝;多个有效提议争同一空格则全部停留。等待原地不参与争抢,也不允许交换位置。
先排除等待、越界和起始占用,再统计剩余提议的目标重复数;唯一目标通过,其余不动。
A至E起始位置[(1, 2), (3, 2), (1, 4), (3, 0), (4, 3)] N北S南E东W西,点为等待;每组从同一起点独立试算 [['W', '.', 'E', 'E', 'N'], ['N', 'E', 'S', 'N', '.'], ['N', '.', 'N', 'S', 'S'], ['E', 'W', 'W', 'N', '.'], ['W', 'E', 'E', '.', 'N'], ['S', 'E', 'W', 'E', 'S'], ['E', '.', 'W', 'N', 'N'], ['.', 'S', 'W', 'W', 'E']]
逐步观察
指令['W', '.', 'E', 'E', 'N'],通过的角色为['A', 'C', 'D', 'E'],结算后按A至E位置[[0, 2], [3, 2], [2, 4], [4, 0], [4, 4]]。
指令['N', 'E', 'S', 'N', '.'],通过的角色为['B', 'D'],结算后按A至E位置[[1, 2], [4, 2], [1, 4], [3, 1], [4, 3]]。
指令['N', '.', 'N', 'S', 'S'],通过的角色为['A', 'E'],结算后按A至E位置[[1, 3], [3, 2], [1, 4], [3, 0], [4, 2]]。
指令['E', 'W', 'W', 'N', '.'],通过的角色为['C', 'D'],结算后按A至E位置[[1, 2], [3, 2], [0, 4], [3, 1], [4, 3]]。
指令['W', 'E', 'E', '.', 'N'],通过的角色为['A', 'B', 'C', 'E'],结算后按A至E位置[[0, 2], [4, 2], [2, 4], [3, 0], [4, 4]]。
指令['S', 'E', 'W', 'E', 'S'],通过的角色为['A', 'C', 'D'],结算后按A至E位置[[1, 1], [3, 2], [0, 4], [4, 0], [4, 3]]。
指令['E', '.', 'W', 'N', 'N'],通过的角色为['A', 'C', 'D', 'E'],结算后按A至E位置[[2, 2], [3, 2], [0, 4], [3, 1], [4, 4]]。
指令['.', 'S', 'W', 'W', 'E'],通过的角色为['B', 'C', 'D'],结算后按A至E位置[[1, 2], [3, 1], [0, 4], [2, 0], [4, 3]]。
各组通过数量[4, 2, 2, 2, 4, 3, 4, 3]。
复核办法
每组结算后仍应保持角色数量和位置唯一。交换处理角色的顺序不应改变结果;可先按目标格收集申请,再逐格判断唯一申请者,而不是边走边改占用。
若改成允许跟随别人离开的格子,还需要处理依赖链和交换情况,规则会不同。本例先采用严格的起始占用判断,让冲突结果不依赖处理先后。
把边界、顺序与适用范围写进记录,比只记一个最后数字更有用。可以另外构造刚好在边界、完全没有变化和多个条件同时成立的情况,查看规则是否仍自洽;若要改变设定,保留原案例作为对照,再重新计算受影响的部分。
