この方法を使用してプログラミングしているゲームにパスファインディングを実装しようとしています。再帰を使用して実装していますが、プレーヤーの周りのタイルの円の直後の値の一部がかなりずれています。何らかの理由で、問題が見つかりません。これは問題のスクリーン キャプです。パスファインディングの値は、すべてのタイルの中央に表示されます。赤い円は、最初に間違った値です。以下のコードは再帰的な方法です。編集: ああ、スクリーン キャップで、クリップされたブロックは数字ではなく c として表示されることを忘れていました。数字が大きすぎるため、次のタイル番号が隠れてしまうからです。
//tileX is the coordinates of the current tile, val is the current pathfinding value, used[][] is a boolean
//array to keep track of which tiles' values have already been assigned
public void pathFind(int tileX, int tileY, int val, boolean[][] used)
{
//increment pathfinding value
int curVal = val + 1;
//set current tile to true if it hasn't been already
used[tileX][tileY] = true;
//booleans to know which tiles the recursive call needs to be used on
boolean topLeftUsed = false, topUsed = false, topRightUsed = false, leftUsed = false, rightUsed = false, botomLeftUsed = false, botomUsed = false, botomRightUsed = false;
//set value of top left tile if necessary
if(tileX - 1 >= 0 && tileY - 1 >= 0)
{
//isClipped(int x, int y) returns true if the coordinates givin are in a tile that can't be walked through (IE walls)
//occupied[][] is an array that keeps track of which tiles have an enemy in them
//
//if the tile is not clipped and not occupied set the pathfinding value
if(isClipped((tileX - 1) * 50 + 25, (tileY - 1) * 50 + 25) == false && occupied[tileX - 1][tileY - 1] == false && !(used[tileX - 1][tileY - 1]))
{
pathFindingValues[tileX - 1][tileY - 1] = curVal;
topLeftUsed = true;
used[tileX - 1][tileY - 1] = true;
}
//if it is occupied set it to an arbitrary high number so enemies find alternate routes if the best is clogged
if(occupied[tileX - 1][tileY - 1] == true)
pathFindingValues[tileX - 1][tileY - 1] = 1000000000;
//if it is clipped set it to an arbitrary higher number so enemies don't travel through walls
if(isClipped((tileX - 1) * 50 + 25, (tileY - 1) * 50 + 25) == true)
pathFindingValues[tileX - 1][tileY - 1] = 2000000000;
}
//top middle
if(tileY - 1 >= 0 )
{
if(isClipped(tileX * 50 + 25, (tileY - 1) * 50 + 25) == false && occupied[tileX][tileY - 1] == false && !(used[tileX][tileY - 1]))
{
pathFindingValues[tileX][tileY - 1] = curVal;
topUsed = true;
used[tileX][tileY - 1] = true;
}
if(occupied[tileX][tileY - 1] == true)
pathFindingValues[tileX][tileY - 1] = 1000000000;
if(isClipped(tileX * 50 + 25, (tileY - 1) * 50 + 25) == true)
pathFindingValues[tileX][tileY - 1] = 2000000000;
}
//top right
if(tileX + 1 <= used.length && tileY - 1 >= 0)
{
if(isClipped((tileX + 1) * 50 + 25, (tileY - 1) * 50 + 25) == false && occupied[tileX + 1][tileY - 1] == false && !(used[tileX + 1][tileY - 1]))
{
pathFindingValues[tileX + 1][tileY - 1] = curVal;
topRightUsed = true;
used[tileX + 1][tileY - 1] = true;
}
if(occupied[tileX + 1][tileY - 1] == true)
pathFindingValues[tileX + 1][tileY - 1] = 1000000000;
if(isClipped((tileX + 1) * 50 + 25, (tileY - 1) * 50 + 25) == true)
pathFindingValues[tileX + 1][tileY - 1] = 2000000000;
}
//left
if(tileX - 1 >= 0)
{
if(isClipped((tileX - 1) * 50 + 25, (tileY) * 50 + 25) == false && occupied[tileX - 1][tileY] == false && !(used[tileX - 1][tileY]))
{
pathFindingValues[tileX - 1][tileY] = curVal;
leftUsed = true;
used[tileX - 1][tileY] = true;
}
if(occupied[tileX - 1][tileY] == true)
pathFindingValues[tileX - 1][tileY] = 1000000000;
if(isClipped((tileX - 1) * 50 + 25, (tileY) * 50 + 25) == true)
pathFindingValues[tileX - 1][tileY] = 2000000000;
}
//right
if(tileX + 1 <= used.length)
{
if(isClipped((tileX + 1) * 50 + 25, (tileY) * 50 + 25) == false && occupied[tileX + 1][tileY] == false && !(used[tileX + 1][tileY]))
{
pathFindingValues[tileX + 1][tileY] = curVal;
rightUsed = true;
used[tileX + 1][tileY] = true;
}
if(occupied[tileX + 1][tileY] == true)
pathFindingValues[tileX + 1][tileY] = 1000000000;
if(isClipped((tileX + 1) * 50 + 25, (tileY) * 50 + 25) == true)
pathFindingValues[tileX + 1][tileY] = 2000000000;
}
//botom left
if(tileX - 1 >= 0 && tileY + 1 <= used[0].length)
{
if(isClipped((tileX - 1) * 50 + 25, (tileY + 1) * 50 + 25) == false && occupied[tileX - 1][tileY + 1] == false && !(used[tileX - 1][tileY + 1]))
{
pathFindingValues[tileX - 1][tileY + 1] = curVal;
botomLeftUsed = true;
used[tileX - 1][tileY + 1] = true;
}
if(occupied[tileX - 1][tileY + 1] == true)
pathFindingValues[tileX - 1][tileY + 1] = 1000000000;
if(isClipped((tileX - 1) * 50 + 25, (tileY + 1) * 50 + 25) == true)
pathFindingValues[tileX - 1][tileY + 1] = 2000000000;
}
//botom middle
if(tileY + 1 <= used[0].length)
{
if(isClipped((tileX) * 50 + 25, (tileY + 1) * 50 + 25) == false && occupied[tileX][tileY + 1] == false && !(used[tileX][tileY + 1]))
{
pathFindingValues[tileX][tileY + 1] = curVal;
botomUsed = true;
used[tileX][tileY + 1] = true;
}
if(occupied[tileX][tileY + 1] == true)
pathFindingValues[tileX][tileY + 1] = 1000000000;
if(isClipped((tileX) * 50 + 25, (tileY + 1) * 50 + 25) == true)
pathFindingValues[tileX][tileY + 1] = 2000000000;
}
//botom right
if(tileX + 1 <= used.length && tileY + 1 <= used[0].length)
{
if(isClipped((tileX + 1) * 50 + 25, (tileY + 1) * 50 + 25) == false && occupied[tileX + 1][tileY + 1] == false && !(used[tileX + 1][tileY + 1]))
{
pathFindingValues[tileX + 1][tileY + 1] = curVal;
botomRightUsed = true;
used[tileX + 1][tileY + 1] = true;
}
if(occupied[tileX + 1][tileY + 1] == true)
pathFindingValues[tileX + 1][tileY + 1] = 1000000000;
if(isClipped((tileX + 1) * 50 + 25, (tileY + 1) * 50 + 25) == true)
pathFindingValues[tileX + 1][tileY + 1] = 2000000000;
}
//call the method on the tiles that need it
if(tileX - 1 >= 0 && tileY - 1 >= 0 && topLeftUsed)
pathFind(tileX - 1, tileY - 1, curVal, used);
if(tileY - 1 >= 0 && topUsed)
pathFind(tileX , tileY - 1, curVal, used);
if(tileX + 1 <= used.length && tileY - 1 >= 0 && topRightUsed)
pathFind(tileX + 1, tileY - 1, curVal, used);
if(tileX - 1 >= 0 && leftUsed)
pathFind(tileX - 1, tileY, curVal, used);
if(tileX + 1 <= used.length && rightUsed)
pathFind(tileX + 1, tileY, curVal, used);
if(tileX - 1 >= 0 && tileY + 1 <= used[0].length && botomLeftUsed)
pathFind(tileX - 1, tileY + 1, curVal, used);
if(tileY + 1 <= used[0].length && botomUsed)
pathFind(tileX, tileY + 1, curVal, used);
if(tileX + 1 <= used.length && tileY + 1 <= used[0].length && botomRightUsed)
pathFind(tileX + 1, tileY + 1, curVal, used);
}