java迷宫

学完java,需要做一个迷宫设计,我想着好不容易写出来了,也得记录一下。
一、迷宫生成
采用递归分割法随机生成迷宫地图,我们需要先确定迷宫的大小,高度和宽度必须是奇数。为了保证一行墙壁一行通路,大小只能是奇数。最外层墙壁不属于迷宫,是在给定高和宽基础上添加的两行两列。根据给定的高和宽生成一个初始迷宫,初始迷宫只是在没有任何阻碍的迷宫外侧添加一圈墙壁
在初始迷宫的基础上,随机选择一行和一列,将其置成墙壁,将迷宫分成独立的四部分。这里需要注意一点,为了满足一行墙壁一行通路的条件,我们需要在偶数行置墙壁(忽略外部墙壁,下标从1开始)。
为了保持迷宫的连通性,我们需要在上一步生成的四堵墙壁上开几个洞。可以看出,开一个洞和两个洞都不能保证迷宫的连通性,而开四个洞又使迷宫通路过多,所以我们随机选择三堵墙开洞。和生成墙壁相反,开洞的位置在奇数行。
在完成上面三步之后,我们就生成了四个小迷宫,然后对小迷宫执行上面的两步直到迷宫高度或宽度为1为止。最终就会生成图一所示的迷宫。
特别说明:为了生成的迷宫不止一条路,我在每一面墙上随机开了三个洞。

/*
	* 迷宫生成算法,采用递归方式实现,随机画横竖两条线,然后在线上随机开三扇门
    *  x:迷宫起点的x坐标
    *  y:迷宫起点的y坐标
    *  height:迷宫的高度
    *  width:迷宫的宽度
    */
	private void getdoor(int x1, int y1, int x2, int y2) {
        if (x1 == x2) {
          int  pos = y1 +r.nextInt((y2 - y1 )/2+1)*2;//在奇数位置开门
            m[x1][pos] =0;
        } 
        else if (y1 == y2) {
           int pos =x1 +r.nextInt((x2 - x1 )/2+1)*2;
            m[pos][y1] =0;
        } 
    }
   private void getMaze(int x, int y, int col, int row) {
       int x1, y1;
       
       if (col<=2||row<=2)
           return;

       //横着画线,在偶数位置画线
       x1=x+(int)(Math.random()*(col/2))*2+1;
       for (int i = y; i < y +row;i++) {
           m[x1][i] = 1;
       }

       //竖着画一条线,在偶数位置画线
       y1=y+(int)(Math.random()*(row/2))*2+1;
       for (int i = x; i < x +col; i++) {
           m[i][y1] =1;
       }

       //随机开三扇门,左侧墙壁为1,逆时针旋转
       int d =(int)(Math.random()*4) + 1;//随机产生四个数;
       //为了防止出现死路,随机在一道墙上开两个洞
       switch (d) 
       {
       case 1:
    	   getdoor(x1+1, y1, x + col - 1, y1);// 在第2道墙上开洞
    	   getdoor(x1, y1+1, x1, y +row-1);// 在第三个墙上开洞
    	   getdoor(x, y1, x1-1, y1);// 在第四个墙上开洞
    	   getdoor(x1+1, y1, x+col-1, y1);//  在第2道墙上开洞
    	   getdoor(x1, y1+1, x1, y +row - 1);//  在第3道墙上开洞
    	   getdoor(x, y1, x1-1, y1);//  在第4道墙上开洞
           break;
       case 2:
    	   getdoor(x1, y1 + 1, x1, y + row - 1);//  在第三道墙上开洞
    	   getdoor(x, y1, x1-1, y1);//  在第四道墙上开洞
    	   getdoor(x1, y, x1, y1-1);//  在第1道墙上开洞
    	   getdoor(x1, y1+ 1, x1, y + row - 1);//  在第3道墙上开洞
    	   getdoor(x, y1, x1 - 1, y1);//  在第4道墙上开洞
    	   getdoor(x1, y, x1, y1 - 1);//  在第1道墙上开洞
           break;
       case 3:
    	   getdoor(x, y1, x1 - 1, y1);//  在第4道墙上开洞
    	   getdoor(x1, y, x1, y1 - 1);//  在第1道墙上开洞
    	   getdoor(x1 + 1, y1, x + col - 1, y1);//  在第2道墙上开洞
    	   getdoor(x, y1, x1 - 1, y1);//  在第四道墙上开洞
    	   getdoor(x1, y, x1, y1 - 1);//  在第一道墙上开洞
    	   getdoor(x1 + 1, y1, x + col - 1, y1);//  在第2道墙上开洞
           break;
       case 4:
    	   getdoor(x1, y, x1, y1 - 1);//  在第一道墙上开洞
    	   getdoor(x1 + 1, y1, x + col - 1, y1);// 在第2道墙上开洞
    	   getdoor(x1, y1 + 1, x1, y +row - 1);//  在第三道墙上开洞
    	   getdoor(x1, y, x1, y1 - 1);//  在第一道墙上开洞
    	   getdoor(x1 + 1, y1, x + col- 1, y1);//  在第2道墙上开洞
    	   getdoor(x1, y1 + 1, x1, y + row - 1);//  在第三道墙上开洞
           break;
       default:
           break;
       }
       // 左上角的方框
       getMaze(x, y, x1-x, y1-y);
       // 右上角的方框
       getMaze(x, y1+1,x1-x,row-y1+y-1);
       // 左下角的方框
       getMaze(x1+1,y,col-x1+ x-1,y1-y);
       // 右下角方框
       getMaze(x1+1, y1+1, col-x1+x-1, row-y1+y-1);
   }

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成迷宫的算法有很多种,其中比较常见的是深度优先搜索(DFS)和广度优先搜索(BFS)。 下面是使用DFS算法生成迷宫Java代码示例: ```java import java.util.*; public class MazeGenerator { private int width; private int height; private int[][] maze; private boolean[][] visited; public MazeGenerator(int width, int height) { this.width = width; this.height = height; this.maze = new int[2 * width + 1][2 * height + 1]; this.visited = new boolean[width][height]; } public void generate() { // 初始化迷宫,所有格子都是墙壁 for (int i = 0; i < 2 * width + 1; i++) { for (int j = 0; j < 2 * height + 1; j++) { maze[i][j] = 1; } } // 从起点开始生成迷宫 dfs(0, 0); // 将迷宫的外围设置为墙壁 for (int i = 0; i < 2 * width + 1; i++) { maze[i][0] = maze[i][2 * height] = 1; } for (int i = 0; i < 2 * height + 1; i++) { maze[0][i] = maze[2 * width][i] = 1; } } public int[][] getMaze() { return maze; } private void dfs(int x, int y) { visited[x][y] = true; // 随机打乱四个方向的顺序 List<Integer> directions = Arrays.asList(0, 1, 2, 3); Collections.shuffle(directions); for (int direction : directions) { int dx = 0, dy = 0; switch (direction) { case 0: // 上 if (y == 0 || visited[x][y - 1]) { continue; } dy = -1; break; case 1: // 右 if (x == width - 1 || visited[x + 1][y]) { continue; } dx = 1; break; case 2: // 下 if (y == height - 1 || visited[x][y + 1]) { continue; } dy = 1; break; case 3: // 左 if (x == 0 || visited[x - 1][y]) { continue; } dx = -1; break; } // 将当前格子和相邻格子之间的墙壁打通 maze[2 * x + 1 + dx][2 * y + 1 + dy] = 0; dfs(x + dx, y + dy); } } } ``` 使用方法: ```java MazeGenerator generator = new MazeGenerator(10, 10); generator.generate(); int[][] maze = generator.getMaze(); ``` 其中,`width`和`height`表示迷宫的宽度和高度,`maze`是一个二维数组,表示生成的迷宫,其中`0`表示通路,`1`表示墙壁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值