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