Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 星形算法、异常行为_Java_Algorithm_A Star - Fatal编程技术网

Java 星形算法、异常行为

Java 星形算法、异常行为,java,algorithm,a-star,Java,Algorithm,A Star,我正在为大学的一个电脑游戏项目编写一个星形算法。老实说,我担心一旦我提到大学,我会有人去西部,我也承认我使用的2d节点数组的大小非常大,宽度=800,高度=800 我已经成功地使它发挥了最大的作用。然而,我遇到了一个有趣的错误 if (!diagonalMovementAllowed) { if ((x != 0) && (y != 0)) { continue

我正在为大学的一个电脑游戏项目编写一个星形算法。老实说,我担心一旦我提到大学,我会有人去西部,我也承认我使用的2d节点数组的大小非常大,宽度=800,高度=800 我已经成功地使它发挥了最大的作用。然而,我遇到了一个有趣的错误

if (!diagonalMovementAllowed) {
                            if ((x != 0) && (y != 0)) {
                                continue;
                            }
                        }
如果没有下面的代码,我可以从任何坐标找到目标,只要它在2d数组的范围内,但是如果我使用上面的代码,例如,如果起点或目标的距离有点余弦,那么算法似乎无法达到目标

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)
如果目标x=700&y=700 如果起点x=0&y=700,则没有问题

但是如果目标x=700,目标y=700 如果起点x=690,y=720 它似乎找不到一条路

我的问题是 arrayList(open或closedList)是否可以达到一个无法找到目标的点,并且达到了一个非常高的大小,以至于它可以简单地退出,并且有没有一种方法可以在不使用调试器循环通过每个x和y坐标的情况下识别导致这一点的原因

我有一种感觉,这是一个相当模糊的问题,但我希望我能得到一个大致的答案,因为我不觉得很多人会太倾向于引导我完成一个完整的解释,特别是因为我确实提到了这是一个项目,我的讲师似乎知道任何事情和一切。我希望我能提前得到一些建议、答案和感谢

编辑: 回答以下两个问题(感谢您的快速回复)


我相信达到大小限制会导致错误并停止程序,所以我认为这不是问题所在。我真的不太理解你的代码段:你能再加一点上下文吗(x,y与是否允许对角线移动有什么关系?

800的大小本身并不“大”,它对你来说只是大而已。当它是800万点的时候回来


只要您有足够的内存来处理它,ArrayList的大小就不应该是一个问题。我认为这是你的算法有问题。如果您可以发布更多的代码,我相信有人会有想法。

我假设您的代码片段是后续生成逻辑的一部分。不幸的是,我认为逻辑不正确:

if (!diagonalMovementAllowed) {
    if ((x != 0) && (y != 0)) {
        continue;
    }
}
当不允许对角移动时,这将阻止从内部位置(不在x==0列或y==0行中的位置)生成任何后续位置


如果我对您的代码的假设是正确的,这就是为什么当起始位置类似于x=690&y=720时找不到解决方案的原因。起始位置没有后续位置

老实说,我不完全明白你说的接班人是什么意思。如果你不知道的话,你认为你可以更详细地说吗mind@tommyknocker-对不起;我想自从我研究这个之后,术语已经改变了。这和“邻居”是一样的。
if (!diagonalMovementAllowed) {
    if ((x != 0) && (y != 0)) {
        continue;
    }
}