我正在为大学的计算机游戏项目编程A star算法。我会很坦白地说,我很担心我一旦提到大学,就会有任何响应者向西走,我也承认我要使用的二维节点数组的大小非常大,宽度为800&高度= 800
我已经尽力做到最好。但是我遇到了一个有趣的错误
if (!diagonalMovementAllowed) {
if ((x != 0) && (y != 0)) {
continue;
}
}
没有下面的代码,只要它在2d数组的范围内,我就可以从任何坐标中找到目标,但是,如果我确实使用上面的代码,则算法似乎无法达到目标(如果从头开始)或目标距离有些可观,例如
如果目标x = 700&y = 700
如果开始x = 0&y = 700,就没问题
但是,如果目标x = 700和目标y = 700
如果开始x = 690&y = 720
似乎找不到路径
我的问题是
arrayList(open或closedList)是否可以到达一个点,即它根本无法找到目标,并且达到了如此之高的大小,以至于它简单地退出了,并且有一种方法可以找出导致此问题的原因,而无需遍历每个x和y坐标使用调试器?
我确实觉得这是一个比较模糊的问题,但是我希望我能得到一个一般性的答案,因为我认为很多人都不会太乐意向我介绍整个解释,尤其是因为我确实提到了它的一个项目我的讲师似乎什么都知道。我希望我能得到一些建议和答案,并在此先感谢。
编辑:
要回答以下2个问题(感谢快速响应)
for(int x = -1; x < 2; x++){
for(int y = -1; y < 2; y++){
if (!diagonalMovementAllowed) {
if ((x != 0) && (y != 0)) {
continue;
}
}
int neighborX = x + current.x;
int neighborY = y + current.y;
}
}
上面的代码是其中的一部分,我显然不想将其全部发布,因为我的讲师可能会因获得太多帮助而开枪射击我(或失败)
但要解释以上内容
当openList不为空时,遍历x和y的邻居
x = x -1或x = x +1
y = y -1或y = y +1
0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2
如果您位于1,1(起点)并且不希望对角线运动,则应允许以下项(0,0)(2,0)(2,2)或(0,2),这可以通过阻止x和y都不等于0
例如
neighborX = x + current.x
1 = 0 + 1
neighborY = y + current.y
2 1 + 1
(1,2)
neighborX = x + current.x
1 = 0 + 1
neighborY = y + current.y
0 -1 + 1
(1,0)
neighborX = x + current.x
2 = 1 + 1
neighborY = y + current.y
0 -1 + 1
(2,0)
neighborX = x + current.x
0 = -1 + 1
neighborY = y + current.y
0 -1 + 1
(0,0)
我假设您的代码段是后继生成逻辑的一部分。不幸的是,我认为逻辑不正确:
if (!diagonalMovementAllowed) {
if ((x != 0) && (y != 0)) {
continue;
}
}
当不允许对角线移动时,这将防止内部位置(不在x == 0列或y == 0行中的位置)生成任何后继。
如果我对您的代码的假设是正确的,这就是为什么当起始位置类似x = 690和y = 720时,找不到解决方案的原因,起始位置没有后继!
我要说实话,我不完全理解你对继任者的意思。 你认为如果你不介意的话你可以更详细地讲吗
@tommyknocker-对不起; 我想自从我研究了这个术语以来,术语已经改变了。 它与"邻居"相同。
800的大小本身并不是"大"的,对您而言只是个大。当它的800万:P回来时。
只要您有足够的内存来处理它,ArrayList的大小就不会成为问题。我建议您的算法有问题。如果您可以发布更多代码,我相信有人会有想法。
我相信达到大小限制将导致错误并停止程序,因此我认为这不是问题。我不太了解您的代码段:您可以添加更多上下文吗(x,y与是否允许对角线移动有什么关系?)