私は過去数時間、このトリッキーなバグに悩まされていました。
基本的に、私は再帰によって A* を実装しており、各ノード (コードではタイルと呼ばれます) に、それが通過した以前のノード数の整数値を格納したいと考えています。これは、アルゴリズムが出口を見つけたら、元に戻って最短ルートを返すことができるようにするためです。
ただし、ターン カウンターは関数をループするたびにリセットされます。ただし、次の行を削除すると:
map[y][x].setID(path);
正常にカウントされますが、もちろんスタック オーバーフロー エラーが発生しますが、これが問題を引き起こしている理由がよくわかりません。
主なコードは次のとおりです。
private static Tile[][] findSquares(IntVector v, Tile[][] map, int wall, int empty, int end, int start, int path, int turns)
{
// System.out.println(turns);
if (!isHit)
{
for (int y = v.y - 1; y <= v.y + 1; y++)
{
for (int x = v.x - 1; x <= v.x + 1; x++)
{
if (map[y][x].id == end)
{
isHit = true;
}
else if (map[y][x].id != wall && map[y][x].id != path && map[y][x].id != end && !isHit && map[y][x].id != start)
{
map[y][x].turns++;
System.out.println(map[y][x].turns); //Always Results in 1
map[y][x].setID(path);
findSquares(new IntVector(x, y), map, wall, empty, end, start, path, turns);
break;
}
}
}
}
return map;
}
ノードを表すタイル。タイル クラスは次のとおりです。
static private class Tile
{
int id;
int turns = 0;
Tile(int id)
{
this.id = id;
}
public void addTurn()
{
turns++;
}
public void setID(int id)
{
this.id = id;
}
public int getTurns()
{
return turns;
}
public Tile setTurns(int turns)
{
this.turns = turns;
return this;
}
}
おそらく、タイルクラスが静的であることと関係がありますか?