迷宫寻路,二维数组
Maze pathfinding, Array 2-D
我正在尝试使用堆栈在迷宫中找到出路。
在我担心堆栈之前,我试图让它先进入死胡同。
然而,当我 运行 我的代码时,我得到 java.lang.ArrayIndexOutofBoundsException: -1
。这没有意义,因为我不断更新行和列。
这是我卡住的部分代码:
Maze myMaze = new Maze (rows, columns);
MazeDisplay myDisplay = new MazeDisplay (myMaze);
myMaze.buildMaze(10);
myMaze.setSolveAnimationDelay(75);
boolean [][] mazeArray = new boolean [rows][columns];
for (int row=0; row<mazeArray.length; row++)
for (int col=0; col<mazeArray[row].length; col++)
mazeArray[row][col] = false;
mazeArray [myMaze.getCurrentRow()][myMaze.getCurrentCol()] = true;
for (int i = 0; i < 9999999 ; i++) //Temporary for now
{
int arrayRows = myMaze.getCurrentRow();
int arrayCols = myMaze.getCurrentCol();
if (myMaze.isOpen(Maze.Direction.RIGHT) && mazeArray [arrayRows][1 + arrayCols] == false)
{
myMaze.move(Maze.Direction.RIGHT);
//mazeStack.push(Maze.Direction.RIGHT);
mazeArray[arrayRows][arrayCols] = true;
}
else if (myMaze.isOpen(Maze.Direction.UP) && mazeArray [1 + arrayRows][arrayCols] == false)
{
myMaze.move(Maze.Direction.UP);
//mazeStack.push(Maze.Direction.UP);
mazeArray[arrayRows][arrayCols] = true;
}
else if (myMaze.isOpen(Maze.Direction.LEFT) && mazeArray [arrayRows][arrayCols - 1] == false) // <---Getting an error here.
{
myMaze.move(Maze.Direction.LEFT);
//mazeStack.push(Maze.Direction.LEFT);
mazeArray[arrayRows][arrayCols] = true;
}
else if (myMaze.isOpen(Maze.Direction.DOWN) && mazeArray [arrayRows - 1][arrayCols] == false) // <---Getting an error here.
{
myMaze.move(Maze.Direction.DOWN);
//mazeStack.push(Maze.Direction.DOWN);
mazeArray[arrayRows][arrayCols] = true;
}
有办法解决这个问题吗?我想要的是访问当前位置下方或左侧的 ArrayList 位置。
下面是迷宫的一些方法class:
//-------- isOpen - returns true if there is no wall in the direction that is passed in
public boolean isOpen(Direction direction)
{
boolean result = false;
if (direction == Direction.UP && mazeArray[currentArrayRow-1][currentArrayCol]==0)
result = true;
else if (direction == Direction.DOWN && mazeArray[currentArrayRow+1][currentArrayCol]==0)
result = true;
else if (direction == Direction.LEFT && mazeArray[currentArrayRow][currentArrayCol-1]==0)
result = true;
else if (direction == Direction.RIGHT && mazeArray[currentArrayRow][currentArrayCol+1]==0)
result = true;
return result;
}
//-------- getCurrentRow - returns the current (real) row
public int getCurrentRow()
{
return currentArrayRow/2;
}
//-------- getCurrentCol - returns the current (real) col
public int getCurrentCol()
{
return currentArrayCol/2;
}
// -------- move - receives a Direction and moves there if OK. Calls the other
// arrayMove to do this
public boolean move(Direction direction)
{
boolean success = false;
if (direction == Direction.UP)
success = arrayMove(currentArrayRow-2, currentArrayCol);
else if (direction == Direction.DOWN)
success = arrayMove(currentArrayRow+2, currentArrayCol);
else if (direction == Direction.LEFT)
success = arrayMove(currentArrayRow, currentArrayCol-2);
else if (direction == Direction.RIGHT)
success = arrayMove(currentArrayRow, currentArrayCol+2);
return success;
}
//This is Maze's enumerated data type: moves can be UP, DOWN, LEFT, RIGHT
public enum Direction
{
UP, DOWN, LEFT, RIGHT
}
//-------- getMazeArray - returns the mazeArray
public int[][] getMazeArray()
{
return mazeArray;
}
在检查左侧单元格之前,您应该检查您是否不位于左侧边缘。否则 mazeArray [arrayRows][arrayCols - 1]
将抛出异常,因为 arrayCols - 1 = -1
.
如果我正确理解了您的代码,那么您的算法并不完美。它陷入死胡同。我认为 shortest path 算法是最容易实现的算法。
我正在尝试使用堆栈在迷宫中找到出路。
在我担心堆栈之前,我试图让它先进入死胡同。
然而,当我 运行 我的代码时,我得到 java.lang.ArrayIndexOutofBoundsException: -1
。这没有意义,因为我不断更新行和列。
这是我卡住的部分代码:
Maze myMaze = new Maze (rows, columns);
MazeDisplay myDisplay = new MazeDisplay (myMaze);
myMaze.buildMaze(10);
myMaze.setSolveAnimationDelay(75);
boolean [][] mazeArray = new boolean [rows][columns];
for (int row=0; row<mazeArray.length; row++)
for (int col=0; col<mazeArray[row].length; col++)
mazeArray[row][col] = false;
mazeArray [myMaze.getCurrentRow()][myMaze.getCurrentCol()] = true;
for (int i = 0; i < 9999999 ; i++) //Temporary for now
{
int arrayRows = myMaze.getCurrentRow();
int arrayCols = myMaze.getCurrentCol();
if (myMaze.isOpen(Maze.Direction.RIGHT) && mazeArray [arrayRows][1 + arrayCols] == false)
{
myMaze.move(Maze.Direction.RIGHT);
//mazeStack.push(Maze.Direction.RIGHT);
mazeArray[arrayRows][arrayCols] = true;
}
else if (myMaze.isOpen(Maze.Direction.UP) && mazeArray [1 + arrayRows][arrayCols] == false)
{
myMaze.move(Maze.Direction.UP);
//mazeStack.push(Maze.Direction.UP);
mazeArray[arrayRows][arrayCols] = true;
}
else if (myMaze.isOpen(Maze.Direction.LEFT) && mazeArray [arrayRows][arrayCols - 1] == false) // <---Getting an error here.
{
myMaze.move(Maze.Direction.LEFT);
//mazeStack.push(Maze.Direction.LEFT);
mazeArray[arrayRows][arrayCols] = true;
}
else if (myMaze.isOpen(Maze.Direction.DOWN) && mazeArray [arrayRows - 1][arrayCols] == false) // <---Getting an error here.
{
myMaze.move(Maze.Direction.DOWN);
//mazeStack.push(Maze.Direction.DOWN);
mazeArray[arrayRows][arrayCols] = true;
}
有办法解决这个问题吗?我想要的是访问当前位置下方或左侧的 ArrayList 位置。
下面是迷宫的一些方法class:
//-------- isOpen - returns true if there is no wall in the direction that is passed in
public boolean isOpen(Direction direction)
{
boolean result = false;
if (direction == Direction.UP && mazeArray[currentArrayRow-1][currentArrayCol]==0)
result = true;
else if (direction == Direction.DOWN && mazeArray[currentArrayRow+1][currentArrayCol]==0)
result = true;
else if (direction == Direction.LEFT && mazeArray[currentArrayRow][currentArrayCol-1]==0)
result = true;
else if (direction == Direction.RIGHT && mazeArray[currentArrayRow][currentArrayCol+1]==0)
result = true;
return result;
}
//-------- getCurrentRow - returns the current (real) row
public int getCurrentRow()
{
return currentArrayRow/2;
}
//-------- getCurrentCol - returns the current (real) col
public int getCurrentCol()
{
return currentArrayCol/2;
}
// -------- move - receives a Direction and moves there if OK. Calls the other
// arrayMove to do this
public boolean move(Direction direction)
{
boolean success = false;
if (direction == Direction.UP)
success = arrayMove(currentArrayRow-2, currentArrayCol);
else if (direction == Direction.DOWN)
success = arrayMove(currentArrayRow+2, currentArrayCol);
else if (direction == Direction.LEFT)
success = arrayMove(currentArrayRow, currentArrayCol-2);
else if (direction == Direction.RIGHT)
success = arrayMove(currentArrayRow, currentArrayCol+2);
return success;
}
//This is Maze's enumerated data type: moves can be UP, DOWN, LEFT, RIGHT
public enum Direction
{
UP, DOWN, LEFT, RIGHT
}
//-------- getMazeArray - returns the mazeArray
public int[][] getMazeArray()
{
return mazeArray;
}
在检查左侧单元格之前,您应该检查您是否不位于左侧边缘。否则 mazeArray [arrayRows][arrayCols - 1]
将抛出异常,因为 arrayCols - 1 = -1
.
如果我正确理解了您的代码,那么您的算法并不完美。它陷入死胡同。我认为 shortest path 算法是最容易实现的算法。