我正在尝试在使用this方法编程的游戏中实现路径查找。我正在使用递归来实现它,但在播放器周围的直接圆形块之后的一些值是远离的。出于某种原因,我找不到它的问题。 This是问题的屏幕上限。寻路值显示在每个磁贴的中心。红色圆圈是第一个不正确的值。下面的代码是递归方法。编辑:哦,我忘了提到屏幕上限,任何剪切块显示为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);
}