迷宫生成算法

随便聊点

关于迷宫算法其实我之前写过两三篇文章,不过这两天突然需要用到了,看了两分钟自己的博客居然一时没怎么看懂。不过毕竟我之前研究过,花了点时间还是给重新写了出来,相比之下反而觉得以前写的代码有点累赘了,鉴于之前那篇文章点击率也蛮高的,删掉重写又怪可惜的,想想就顺便再水一篇吧。希望这次能用更加通俗的方式来表达算法的思路。

设计思路

先来张效果图:
在这里插入图片描述
我们可以把一个N*N的迷宫建立的过程想象成挖地道。我们定义初始状态时,迷宫的每个格子都为墙壁(WALL),墙壁挖掉后就变成道路(ROUTE),我们需要把墙壁一块块挖掉,才能挖出迷宫中的一条条通道。这里我用了C++,没学过的朋友看个大概就行了,看下代码:

int N = 20;
int WALL = 0;
int ROUTE = 1;
vector<vector<int>> maze(N,vector<int>(N,WALL));//一个二维数组maze[N][N]

首先,我们可以随机选择一个位置开始,假设当前所在位置是(x,y),此时我们可以挖的方向分别是上下左右四个方向:

               上(x-1,y)
 左(x,y-1)     我(x,y)     右(x,y+1)
               下(x+1,y)

然后随机选择一个方向前进(当然是选择有墙的方向)。把墙挖掉后,我们此时的位置为(x’,y’)。重新使当前的位置为(x,y),不断重复上面挖墙的这个过程。

写成函数也很简单,一个简单的递归过程(如果你不懂递归,那啥我也没办法了):

//挖函数
void dig(vector<vector<int>> &maze,int x,int y){
   
	if(maze[x][y] == WALL){
   //如果为ROUTE 就不需要挖了
		//把该位置的墙挖掉
	    maze[x][y] = ROUTE;
	    
	    //随机选择一个方向继续挖
		switch (rand()%4) {
   
				case 0:
					dig(maze, x - 1, y);
					break;
				case 1:
					dig(maze, x + 1, y);
					break;
				case 2:
					dig(maze, x, y - 1);
					break;
				case 3:
					dig(maze, x, y + 1);
					break;
				default:
					break;
		}
	}
}

那么问题来了,这么挖不就可以无限的挖下去了吗。而我们的数值是有长度限制的,万一数组越界就GG了。因此我们需要给迷宫加个保护套,根据上面的函数可知,递归的终止条件是:maze[x][y]==ROUTE,那么一个很简单的办法就是让迷宫的最外面一圈的格子都为ROUTE,这么一来不管怎么挖,都不会挖穿了。代码如下:

for (int i = 0; i < N; ++i) {
   
		maze[i][N - 1] = ROUTE;
		maze[N - 1][i] = ROUTE;
		maze[i][0] = ROUTE;
		maze[0][i] = ROUTE;
}
<
  • 23
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值