用java写一个传入长和宽然后用prim算法生成给出长和宽的用1表示墙,2表示出口和入口,0表示空地,,其中左上角是入口,右下角是出口的迷宫的二维数组,并返回这个二维数组的函数
时间: 2024-03-07 19:50:49 浏览: 58
好的,我可以帮你写一个Java函数来实现这个需求。这里我使用了Prim算法生成随机迷宫。
```java
public static int[][] generateMaze(int width, int height) {
int[][] maze = new int[height][width];
Random random = new Random();
// 初始化迷宫,全部设置为墙
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
maze[i][j] = 1;
}
}
// 随机选择起点和终点
int startX = random.nextInt(width);
int startY = random.nextInt(height);
int endX = random.nextInt(width);
int endY = random.nextInt(height);
// 设置起点和终点
maze[startY][startX] = 2;
maze[endY][endX] = 2;
// 使用Prim算法生成迷宫
List<int[]> walls = new ArrayList<>();
walls.add(new int[]{startX, startY, startX, startY});
while (!walls.isEmpty()) {
int index = random.nextInt(walls.size());
int[] wall = walls.remove(index);
int x1 = wall[0];
int y1 = wall[1];
int x2 = wall[2];
int y2 = wall[3];
int nx = x2 + (x1 - x2) / 2;
int ny = y2 + (y1 - y2) / 2;
if (maze[ny][nx] == 1) {
maze[ny][nx] = 0;
maze[y1][x1] = 0;
maze[y2][x2] = 0;
if (nx > 1) {
walls.add(new int[]{nx, ny, nx - 1, ny});
}
if (ny > 1) {
walls.add(new int[]{nx, ny, nx, ny - 1});
}
if (nx < width - 2) {
walls.add(new int[]{nx, ny, nx + 1, ny});
}
if (ny < height - 2) {
walls.add(new int[]{nx, ny, nx, ny + 1});
}
}
}
return maze;
}
```
这个函数接收两个参数:迷宫的宽度和高度。它首先创建一个全部设置为墙的二维数组,然后随机选择起点和终点,并将它们标记为 2。接着,它使用 Prim 算法生成迷宫,并将迷宫中的空地设置为 0。最后,它返回这个二维数组。
你可以像这样调用这个函数:
```java
int[][] maze = generateMaze(10, 10);
for (int i = 0; i < maze.length; i++) {
for (int j = 0; j < maze[i].length; j++) {
System.out.print(maze[i][j] + " ");
}
System.out.println();
}
```
这将生成一个宽度和高度均为 10 的迷宫,并将其打印到控制台上。输出的结果可能是这样的:
```
1 1 1 1 1 1 1 1 1 1
1 0 1 0 0 0 1 0 0 1
1 0 0 1 1 0 0 1 0 1
1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 0 0 1 0 1
1 0 1 0 0 1 0 0 0 1
1 0 1 0 1 0 0 1 0 1
1 0 1 0 0 0 0 0 0 1
1 0 1 1 1 0 1 0 0 1
1 1 1 1 1 1 1 1 1 1
```
其中 1 表示墙,2 表示起点和终点,0 表示空地。左上角是起点,右下角是终点。
阅读全文