0

私は、大学のコンピューター ゲーム プロジェクトのスター アルゴリズムのプログラミングに取り組んでいます。正直に言うと、大学について言及するとすぐに、レスポンダーが西に行くのではないかと心配しています。また、作業に使用しているノードの 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)
4

3 に答える 3

1

コードスニペットは後継生成ロジックの一部であると想定しています。残念ながら、私は論理が正しいとは思いません:

if (!diagonalMovementAllowed) {
    if ((x != 0) && (y != 0)) {
        continue;
    }
}

斜めの移動が許可されていない場合、これにより、内部位置(x==0列またはy==0行にない位置)から後続が生成されるのを防ぐことができます。

コードに関する私の仮定が正しければ、開始位置がx = 690&y = 720のようなものである場合、解決策が見つからないのはこのためです。開始位置には後続がありません。

于 2012-11-21T00:54:00.190 に答える
0

サイズ制限に達するとエラーが発生してプログラムが停止すると思いますので、問題にはならないと思います。あなたのコード セグメントがよくわかりません: もう少しコンテキストを含めていただけますか (x、y は、斜めの動きが許可されているかどうかと何の関係がありますか?)

于 2012-11-21T00:28:48.547 に答える
0

800 というサイズは、それ自体が「大きい」というわけではなく、あなたにとって大きいだけです。800万になったら戻ってきてください:P.

それを処理するのに十分なメモリがある限り、ArrayList のサイズは問題になりません。アルゴリズムに問題があることをお勧めします。もっとコードを投稿できれば、誰かがアイデアを持っていると確信しています。

于 2012-11-21T00:29:18.610 に答える