java倒星_关于Java:星型算法,异常行为

我正在为大学的计算机游戏项目编程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与是否允许对角线移动有什么关系?)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值