二维数组随机生成地图迷宫_Java基于深度优先遍历的随机迷宫生成算法
时间: 2023-07-24 10:08:27 浏览: 119
生成迷宫的一种常见算法是基于深度优先遍历的随机迷宫生成算法。该算法的基本思路是从一个起始点出发,随机选择一个相邻的未被访问过的点,将其标记为已访问,并将两点之间的墙壁打通。然后以新访问的点为起点继续随机选择未访问过的点,直到所有的点都被访问过。
在Java中,可以使用二维数组表示迷宫地图。数组中的每个元素表示一个格子,可以包含四面墙壁状态的信息(例如用0表示墙壁存在,用1表示墙壁不存在),以及是否被访问过的信息(例如用0表示未被访问过,用1表示已被访问过)。以下是一个基于深度优先遍历的随机迷宫生成算法示例代码:
``` java
import java.util.Random;
public class MazeGenerator {
private int width; // 迷宫宽度
private int height; // 迷宫高度
private int[][] maze; // 迷宫地图
private Random random; // 随机数生成器
// 构造函数
public MazeGenerator(int width, int height) {
this.width = width;
this.height = height;
maze = new int[height][width];
random = new Random();
generateMaze(0, 0); // 从左上角的格子开始生成迷宫
}
// 生成迷宫
private void generateMaze(int row, int col) {
maze[row][col] = 1; // 标记当前格子已访问过
// 随机顺序访问邻居格子
int[] directions = {0, 1, 2, 3}; // 上、右、下、左
shuffle(directions); // 随机打乱顺序
for (int direction : directions) {
int newRow = row;
int newCol = col;
switch (direction) {
case 0: // 上
newRow--;
break;
case 1: // 右
newCol++;
break;
case 2: // 下
newRow++;
break;
case 3: // 左
newCol--;
break;
}
// 判断新格子是否在迷宫范围内且未被访问过
if (newRow >= 0 && newRow < height && newCol >= 0 && newCol < width && maze[newRow][newCol] == 0) {
// 打通两格之间的墙壁
if (direction == 0) { // 上
maze[row][col] &= ~1; // 当前格子的上墙壁打通
maze[newRow][newCol] &= ~4; // 新格子的下墙壁打通
} else if (direction == 1) { // 右
maze[row][col] &= ~2; // 当前格子的右墙壁打通
maze[newRow][newCol] &= ~8; // 新格子的左墙壁打通
} else if (direction == 2) { // 下
maze[row][col] &= ~4; // 当前格子的下墙壁打通
maze[newRow][newCol] &= ~1; // 新格子的上墙壁打通
} else if (direction == 3) { // 左
maze[row][col] &= ~8; // 当前格子的左墙壁打通
maze[newRow][newCol] &= ~2; // 新格子的右墙壁打通
}
generateMaze(newRow, newCol); // 递归访问新格子
}
}
}
// 随机打乱数组元素的顺序
private void shuffle(int[] array) {
for (int i = array.length - 1; i > 0; i--) {
int j = random.nextInt(i + 1);
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
// 打印迷宫地图
public void printMaze() {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
System.out.print(maze[i][j] + " ");
}
System.out.println();
}
}
// 测试代码
public static void main(String[] args) {
MazeGenerator generator = new MazeGenerator(10, 10);
generator.printMaze();
}
}
```
运行上述代码,可以生成一个10x10的迷宫地图,并打印出来。你可以根据自己的需要修改迷宫大小,或者将迷宫地图保存为图片等。
阅读全文