我正在制作2D,基于网格的游戏,由于具有挑战性的代码而陷入僵局。如果可能,我需要从网格中的一个单元格导航到另一个单元格,但最多只能旋转2圈。
红色的球是目标,绿色的路径是有效的,“转弯”用蓝色圆圈突出显示。
没有暴力手段强迫问题并检查每条可能的路径怎么办?我已经尝试了一些想法以及a *实现,但到目前为止还没有运气。任何使用unity API或其他方法的想法都将受到高度赞赏。
答案 0 :(得分:2)
这可以通过使用普通A *通过从原始网格创建经过特殊设计的有向加权图来解决。
诀窍是创建带有多个“图层”的图形。到目前为止,第0层代表已完成0匝,第1层代表已完成1匝,而第2层代表2匝。如果可以不转弯而到达节点,则该节点在同一层与其相邻节点连接;如果需要转弯,则其节点在下一层与之相邻。
希望这对您来说足以创建图形,但是,否则,显式步骤将是:
Layer_0_Horizontal
,Layer_0_Vertical
,Layer_1_Horizontal
,Layer_1_Vertical
,Layer_2_Horizontal
,Layer_2_Vertical
。Horizontal
层中的每个节点,将其边缘移到垂直邻居,并用例如下一层的边缘替换为下一层中节点的边缘。 Layer_1_Vertical
低于Layer_0_Horizontal
。 Layer_2
中的边不会被替换。对Vertical
层/水平边缘执行相同的操作。Layer_0
节点,这两个节点表示权重为0的相同网格正方形。如果您的A *实现仅支持一个目标节点,请对目标执行相同的操作。如果您想使用匝数较少的较长路径而不是匝数较多的较短路径(即使只有两匝,这也是可能的吗?? ),请给层之间的边缘赋予极大的权重。 / p>