私は、大学のコンピューター ゲーム プロジェクトのスター アルゴリズムのプログラミングに取り組んでいます。正直に言うと、大学について言及するとすぐに、レスポンダーが西に行くのではないかと心配しています。また、作業に使用しているノードの 2 次元配列のサイズが非常に大きく、幅が 800 であることも認めます。高さ = 800 最高の部分が機能するように管理しました。しかし、私は興味深いバグに来ました
if (!diagonalMovementAllowed) {
if ((x != 0) && (y != 0)) {
continue;
}
}
以下のコードがなくても、2次元配列の境界内にある限り、任意の座標からゴールを見つけることができますが、上記のコードを使用すると、アルゴリズムがゴールに到達できないようです。または目標は、例えばかなりの距離にあります。
ゴール 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 と yx = 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)