假设我们有一个2D网格,上面放着一个棋子,就像游戏板一样。
-典当可以一次朝任一方向移动一个单元格。
-典当不能占据相同的空间,也不能彼此穿过(交换位置)。
如果一次只移动一个棋子,那将很简单。 但是,我希望所有棋子都同时移动,因此在提交任何内容之前都需要检查所有移动,因为某些移动依赖于其他移动。
例如: 典当A想要移入由典当B占据的单元中 我们需要检查棋子B是否移动。 A只能在B要释放其单元格时移动。
我正在尝试找出如何以合理的方式处理此类问题。
到目前为止,我提出的所有建议都不可避免地导致无限循环或无法解决所有棋子。
到目前为止,我最好的方法是列出所有所需的动作并对其进行迭代。 如果一个动作需要解决另一个动作,我会创建一个链,直到遇到一个可以解决的动作,并相应地解决所有动作,然后再回到链中。 但是,如果将棋子围成一圈,则会导致问题。
答案 0 :(得分:0)
由于这个问题,只有棋子的末端位置才有意义。他们来自哪里都无所谓。因此,您唯一需要检查的是这些棋子的最终位置是否彼此冲突。
在这种情况下,您可能会遇到2个或更多棋子要占据相同位置的情况。如果是这样,您可以做两件事: 1.通过让他们选择移动到其他位置(尚未被任何典当占据)来解决典当问题。 2.撤消所有动作。
对我来说,您说的是时光倒流:一个人无法移动,因此需要后退,但现在此位置已被占用,因此典当需要后退,依此类推。如果是这样,您实际上是说你的棋子不能同时移动。
希望这对您有帮助
答案 1 :(得分:0)
如果典当的运动数组为空,则它会卡住而不能运动。在第6步完成后,再次检查这些棋子的移动可能是明智的。
我认为这种算法可以解决几乎所有情况,并且相对有效。
有趣的是,您可以轻松集成其他部件,只需给它们另一个运动选项阵列即可。