同时验证2D网格上多个棋子的运动

时间:2019-08-18 18:08:01

标签: algorithm optimization logic

假设我们有一个2D网格,上面放着一个棋子,就像游戏板一样。

-典当可以一次朝任一方向移动一个单元格。

-典当不能占据相同的空间,也不能彼此穿过(交换位置)。

如果一次只移动一个棋子,那将很简单。 但是,我希望所有棋子都同时移动,因此在提交任何内容之前都需要检查所有移动,因为某些移动依赖于其他移动。

例如: 典当A想要移入由典当B占据的单元中 我们需要检查棋子B是否移动。 A只能在B要释放其单元格时移动。

我正在尝试找出如何以合理的方式处理此类问题。

到目前为止,我提出的所有建议都不可避免地导致无限循环或无法解决所有棋子。

到目前为止,我最好的方法是列出所有所需的动作并对其进行迭代。 如果一个动作需要解决另一个动作,我会创建一个链,直到遇到一个可以解决的动作,并相应地解决所有动作,然后再回到链中。 但是,如果将棋子围成一圈,则会导致问题。

2 个答案:

答案 0 :(得分:0)

由于这个问题,只有棋子的末端位置才有意义。他们来自哪里都无所谓。因此,您唯一需要检查的是这些棋子的最终位置是否彼此冲突。

在这种情况下,您可能会遇到2个或更多棋子要占据相同位置的情况。如果是这样,您可以做两件事: 1.通过让他们选择移动到其他位置(尚未被任何典当占据)来解决典当问题。 2.撤消所有动作。

对我来说,您说的是时光倒流:一个人无法移动,因此需要后退,但现在此位置已被占用,因此典当需要后退,依此类推。如果是这样,您实际上是说你的棋子不能同时移动。

希望这对您有帮助

答案 1 :(得分:0)

  1. 具有所有棋子的网格(二维数组)
  2. 为每个棋子创建一个包含所有可能运动的数组(运动)(在这种情况下,假设棋子必须移动,则每个棋子8个棋子)
  3. 通过有效性从移动数组中随机选择一种动作来移动所有在移动数组中具有多个移动选项的棋子,无论其有效性如何。
  4. 对于所有终止于有效地点的棋子,请从其移动数组中删除除其所占据位置以外的所有条目。
  5. 对于无效的棋子,从移动数组中删除无效的位置
  6. 再次循环至第3步,直到移动数组中的每个条目只有一个移动选项为止。

如果典当的运动数组为空,则它会卡住而不能运动。在第6步完成后,再次检查这些棋子的移动可能是明智的。

我认为这种算法可以解决几乎所有情况,并且相对有效。

有趣的是,您可以轻松集成其他部件,只需给它们另一个运动选项阵列即可。