我尝试使用DFS-Algorithm
在Java中编写迷宫生成器。
但是我遇到了一个问题。每当我运行这个程序时,我得到Nullpointerexception
,因为Stack.pop
调用在某个时刻返回null(因为它变空)。我无法找到我的错误,但也许我太累了:P
代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Stack;
public class FieldGenerator {
public static Cell[][] getField(int width, int height){
Random rand = new Random(System.currentTimeMillis());
int total = width * height;
Cell[][] retField = new Cell[height][width];
for(int y = 0; y < height; y++){
for(int x = 0; x < width; x++){
retField[y][x] = new Cell(cellstate.UNWALKABLE, x, y);
}
}
int xStart = rand.nextInt(width);
int yStart = rand.nextInt(height);
Cell currentCell = retField[yStart][xStart];
currentCell.setCell_state(cellstate.STARTINGPOINT);
Stack<Cell> stack = new Stack<Cell>();
stack.setSize(total);
int visited = 1;
while(visited < total){
List<Cell> neighbourList = getNeighbours(currentCell, retField, width, height);
if(neighbourList.size() > 0){ //1 or more neighbours with walls intact
Cell randNeighbour = neighbourList.get(rand.nextInt(neighbourList.size()));
clearWallBetween(currentCell, randNeighbour, retField);
stack.push(currentCell);
currentCell = randNeighbour;
visited++;
if(visited >= total)
currentCell.setCell_state(cellstate.ENDINGPOINT);
}else{
currentCell = stack.pop();
}
}
return retField;
}
private static List<Cell> getNeighbours(Cell searchCell, Cell[][] searchField, int width, int height){
List<Cell> retList = new ArrayList<Cell>();
int x = searchCell.getx();
int y = searchCell.gety();
if(findCellByCoordinates(x, y-2, width, height, searchField) != null && findCellByCoordinates(x, y-2, width, height, searchField).getCell_state() == cellstate.UNWALKABLE){ //Top
retList.add(findCellByCoordinates(x, y-2, width, height, searchField));
}
if(findCellByCoordinates(x-2, y, width, height, searchField) != null && findCellByCoordinates(x-2, y, width, height, searchField).getCell_state() == cellstate.UNWALKABLE) { //Left
retList.add(findCellByCoordinates(x-2, y, width, height, searchField));
}
if(findCellByCoordinates(x+2, y, width, height, searchField) != null && findCellByCoordinates(x+2, y, width, height, searchField).getCell_state() == cellstate.UNWALKABLE) { //Right
retList.add(findCellByCoordinates(x+2, y, width, height, searchField));
}
if(findCellByCoordinates(x, y+2, width, height, searchField) != null && findCellByCoordinates(x, y+2, width, height, searchField).getCell_state() == cellstate.UNWALKABLE) { //Bottom
retList.add(findCellByCoordinates(x, y+2, width, height, searchField));
}
return retList;
}
private static Cell findCellByCoordinates(int xcoord, int ycoord, int width, int height, Cell[][] field){
if(xcoord >= width || xcoord < 0 || ycoord >= height || ycoord < 0) {
return null;
}else{
return field[ycoord][xcoord];
}
}
private static void clearWallBetween(Cell cell1, Cell cell2, Cell[][] field){
cell2.setCell_state(cellstate.WALKABLE);
int x = ((cell1.getx() + cell2.getx()) / 2);
int y = ((cell1.gety() + cell2.gety()) / 2);
field[y][x].setCell_state(cellstate.WALKABLE);
}
}
答案 0 :(得分:0)
确定。感谢Kenney的帮助。 我添加了一个“死胡同”的条件,现在它就像一个魅力! 这是工人阶级的完整来源:
{{1}}