Мои ячейки имеют координаты. Моя проблема в том, что когда моя текущая ячейка является граничной, а мой случайно выбранный сосед находится за пределами границы, я получаю исключение. Как мне помешать этому методу смотреть за границы? Я попытался добавить x и y, а затем проверить, что сумма x и y меньше нуля, затем вырваться из случая переключения и начать все заново, ища соседнюю ячейку, которая существует.
public void generate(Maze mz) {
Random rand = new Random();
// generate a x * y grid of cells
StdDraw.setXscale(0, 10);
StdDraw.setYscale(0, 10);
// start at initial cell and push it to the stack
Coord currentCell = new Coord(0,0);
stack.push(currentCell);
int remaining = 1;
while(remaining <= mz.getCols() * mz.getRows()) {
// check if currentCell's neighbors have been visited
loop: if(!stack.contains(currentCell.getNeighbor(Direction.NORTH)) || !stack.contains(currentCell.getNeighbor(Direction.WEST)) || !stack.contains(currentCell.getNeighbor(Direction.SOUTH)) || !stack.contains(currentCell.getNeighbor(Direction.EAST))) {
// choose a random neighbor
// TODO: special case when cell is on the border
int randomDirection = rand.nextInt(4);
switch(randomDirection) {
case 0:
int x0 = currentCell.getNeighbor(Direction.NORTH).getCol();
int y0 = currentCell.getNeighbor(Direction.NORTH).getRow();
int sum0 = x0 - y0;
if(sum0 < 0) {
break loop;
}
mz.setExit(currentCell, Direction.NORTH, true);
currentCell = currentCell.getNeighbor(Direction.NORTH);
stack.push(currentCell);
remaining++;
break;
case 1:
int x1 = currentCell.getNeighbor(Direction.WEST).getCol();
int y1 = currentCell.getNeighbor(Direction.WEST).getRow();
int sum1 = x1 - y1;
if(sum1 < 0) {
break loop;
}
mz.setExit(currentCell, Direction.WEST, true);
currentCell = currentCell.getNeighbor(Direction.WEST);
stack.push(currentCell);
remaining++;
break;
case 2:
int x2 = currentCell.getNeighbor(Direction.SOUTH).getCol();
int y2 = currentCell.getNeighbor(Direction.SOUTH).getRow();
int sum2 = x2 - y2;
if(sum2 < 0) {
break loop;
}
mz.setExit(currentCell, Direction.SOUTH, true);
currentCell = currentCell.getNeighbor(Direction.SOUTH);
stack.push(currentCell);
remaining++;
break;
case 3:
int x3 = currentCell.getNeighbor(Direction.EAST).getCol();
int y3 = currentCell.getNeighbor(Direction.EAST).getRow();
int sum3 = x3 - y3;
if(sum3 < 0) {
break loop;
}
mz.setExit(currentCell, Direction.EAST, true);
currentCell = currentCell.getNeighbor(Direction.EAST);
stack.push(currentCell);
remaining++;
break;
}
} else {
currentCell = stack.peek();
stack.pop();
}
}
}