集美区建设局网站,网站开发的方案,中国企业500强都有哪些企业,做下载网站用阿里云的什么产品前几天给大家介绍了“一行matlab代码可以做哪些匪夷所思的事情”#xff0c;今天小编带给大家一款酷炫的私人订制版迷宫游戏。这款迷宫游戏包含以下功能#xff1a;随机生成迷宫地图通过键盘手动求解生成的迷宫MATLAB自动求解生成的迷宫目前主流的生成迷宫的算法有#xff1… 前几天给大家介绍了“一行matlab代码可以做哪些匪夷所思的事情”今天小编带给大家一款酷炫的私人订制版迷宫游戏。这款迷宫游戏包含以下功能随机生成迷宫地图通过键盘手动求解生成的迷宫MATLAB自动求解生成的迷宫目前主流的生成迷宫的算法有深度优先搜索算法(也称递归回溯算法)、Prim算法、递归分割算法和Wilson算法(Loop-erased random walk)。今天只给大家介绍递归回溯算法生成迷宫。首先我们来看一下深度优先算法的基本内容。一、深度优先搜索算法首先来看一下维基百科上对深度优先搜索算法的介绍深度优先搜索算法(Depth-First-SearchDFS)[1]是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点则选择其中一个作为源节点并重复以上过程整个进程反复进行直到所有节点都被访问为止。通俗的说深度优先搜索算法的基本思想就是从起点开始随机走走不通了就返回上一步然后从下一个能走的地方再开始随机走。深度优先搜索算法的算法框架如下Step 1.设置一个起点。将起点作为当前迷宫单元并标记为已访问Step 2.当还存在未标记的迷宫单元时进行循环(1)如果当前迷宫单元有未被访问过的相邻的迷宫单元① 随机选择一个未访问的相邻迷宫单元② 将当前迷宫单元入栈③ 移除当前迷宫单元与相邻迷宫单元的墙④ 标记相邻迷宫单元已访问并用它作为当前迷宫单元(2)如果当前迷宫单元不存在未访问的相邻迷宫单元并且栈不空① 栈顶的迷宫单元出栈② 令其成为当前迷宫单元下面我们通过一个简单的栗子来理解一下深度优先搜索算法。如下图所示从图中的V0(顶点)出发是否存在一条路径长度为4的搜索路径。显然可以直观地看出来所求的搜索路径即V0-V3-V5-V6。下面我们使用深度优先搜索算法来求解该问题。(1)从顶点V0开始此时路径长度为14继续搜索。由图可知V0的相邻节点中有V1和V3两个可选节点这里不妨取V1作为下一个搜索节点。(2)从V0的相邻节点V1开始此时路径长度为24继续搜索。由图可知V1只有V2一个相邻的节点可供选择。(3)从V1的相邻节点V2开始此时路径长度为34继续搜索。由图可知V2已经没有未访问的节点了(V0为起始节点已经访问过)因此退回上一节点V1继续搜索。(4)由图可知 V1的相邻节点中除V2外已经没有未访问的节点因此退回上一节点V0继续搜索。(5)从顶点V0重新开始选择V0的相邻节点V3作为下一个搜索节点。(6)从V0的相邻节点V3开始此时路径长度为24继续搜索。这里不妨去V3的相邻节点V4作为下一个搜索节点。(7)从V3的相邻节点V4开始此时路径长度为34继续搜索。由图可知V4已经没有未访问的节点了因此退回上一节点V3继续搜索。(8)从节点V3重新开始选择V3的相邻节点V5作为下一个搜索点。(9)从V3的相邻节点V5开始此时路径长度为34继续搜索。由图可知V5只有V6一个未访问的相邻节点因此选择V6作为一下搜索点。此时路径长度为4且V6已经没有未访问的节点因此已找到解结束搜索。以上即为深度优先搜索算法求解该简单图的详细步骤相信大家通过这个简单的栗子对深度优先搜索算法有了一定的认识下面我们就进入正题——使用MATLAB制作迷宫游戏。二、生成迷宫游戏的地图借助前面介绍的深度优先搜索算法可以生成迷宫游戏的地图。深度优先搜索算法构建迷宫的思想就是每次把新找到的未访问迷宫单元作为起始点寻找与其相邻的未访问过的迷宫单元直到所有的单元都被访问到。也就是从起点开始随机走走不通了就返回上一步从下一个能走的地方再开始随机走。首先我们生成迷宫游戏的地图的数据矩阵MATLAB代码如下function mapmaze(a,b)mapzeros(a,b);map(2,1)1;map(a-1,b)1;pzeros(1,4);qzeros(1,a*b);i2;j2;x0;while ~isempty(find(map(2:2:a,2:2:b)0,1)) t0; map(i,j)1; if i2 if map(i-2,j)0 tt1;p(t)1; end end if i if map(i2,j)0 tt1;p(t)4; end end if j2 if map(i,j-2)0 tt1;p(t)2; end end if j if map(i,j2)0 tt1;p(t)3; end end if t0 q(x)5-q(x); else xx1; q(x)p(randi(t)); end switch q(x) case 1 ii-2;map(i1,j)1; case 4 ii2;map(i-1,j)1; case 2 jj-2;map(i,j1)1; case 3 jj2;map(i,j-1)1; end if t0 xx-1; end后台回复关键词【迷宫】获得完整代码说明map矩阵中的0元素代表未打通的墙壁其余元素代表可行域(即通道)。通过运行上述代码可以生成迷宫游戏的地图数据矩阵下面我们来看一下如何进行数据可视化即绘制迷宫游戏的地图。MATLAB绘制迷宫游戏主要借助line函数因此先来看一下line函数的主要功能在MATLAB的命令窗口中输入help line可以看到如下说明由帮助文件可以看出来line函数适用于绘制线条的。看到这可能有很多小伙伴有疑问plot也是用来画图的为什么不用plot函数呢为了回答这个问题同样的在MATLAB的命令窗口中输入help plot可以看到如下说明通过帮助文件还是可以看到这两个函数是有一些区别的下面我们详细对比一下这两个函数line函数与plot函数绘图对比图大家还可以根据帮助文件仔细对比一下两个函数的区别。下面回归正题使用MATLAB绘制迷宫地图MATLAB代码如下function timemap_draw(map,str) global nar FIGURE;[e,f]size(map);set(FIGURE,position,get(0,ScreenSize));axis offset(gca,YDir,reverse)if nar1 map(map2)3;endfor i1:e for j1:f if map(i,j)0 if nar1 if(mod(i,2)mod(j,2)) line([max(j-1,1),min(j1,f)],[i,i]); elseif(mod(i,2) line([j,j],[max(i-1,1),min(i1,e)]); end else if map(i,max(j-1,1))0j1 line([max(j-1,1),j],[i,i]); end if map(i,min(j1,f))0j line([j,min(j1,f)],[i,i]); end if map(max(i-1,1),j)0i1 line([j,j],[max(i-1,1),i]); end if map(min(i1,e),j)0i line([j,j],[i,min(i1,e)]); end end elseif map(i,j)2 || map(i,j)3 imagesc(map) colormap([0,0,0;1,1,1;0,1,0;1,0,0]) axis off end endendggcf;set(g.Children,position,[0.1 0.1 0.8 0.8])set(g,position,get(0,ScreenSize));text(0.4*f,-1,str);后台回复关键词【迷宫】获得完整代码下面使用上述函数绘制10×10的迷宫地图来看一下效果如何并对生成的迷宫图做一些说明。随机生成的10×10的迷宫地图如上图所示这款迷宫游戏中有如下默认设置左上角为迷宫入口右下角为迷宫出口黑色实线为迷宫的墙壁白色空白区域为迷宫通道。三、求解迷宫游戏这里我们使用普通的搜索路径方法求解迷宫游戏大概思路如下从起点开始随机走如果走不通了则保存当前路径然后逐步后退直到能继续随机走最终走完所有格点则停止程序。MATLAB代码如下function [map,dist]maze_sove(map)[a,b]size(map);modelmap;hzeros(3);h([2,4,6,8])1;t0;while 1 sampleconv2(model,h,same); sample(sample1)0; sample([2,a*b-1])1; samplesample0; model(sample~model)0; if tlength(find(model0)) break; else tlength(find(model0)); endendmapmodelmap;distlength(find(map2))-1;后台回复关键词【迷宫】获得完整代码到这里我们已经完成了迷宫游戏地图的生成、MATLAB自动求解所生成的迷宫游戏地图一款豪华的私人定制迷宫游戏基本就完成了。Matlab自动求解迷宫游戏效果图下面一部分我们来给这款游戏提升一下“逼格”通过gui设置实现手动求解迷宫游戏即能够通过键盘在迷宫地图上移动棋子完全实现单机版迷宫游戏。四、手动求解迷宫游戏话不多说直接上代码。function move(map)clf;map_draw(map, 迷宫游戏);[e,f]size(map);curpos[2,1];Htext(curpos(2),curpos(1),\bullet,HorizontalAlignment,Center,FontSize,45,color,r);tic;while ~all(curpos [e-1,f]) waitfor(gcf,CurrentCharacter); set(gcf,CurrentCharacter,~); switch double(key(1)) case 117 if map(max(curpos(1)-1,1),curpos(2))0curpos(1)1 set(H,string,[]); curpos(1)curpos(1)-1; Htext(curpos(2),curpos(1),\bullet,HorizontalAlignment,Center,FontSize,45,color,r); end case 100 if map(min(curpos(1)1,e),curpos(2))0curpos(1) set(H,string,[]); curpos(1)curpos(1)1; Htext(curpos(2),curpos(1),\bullet,HorizontalAlignment,Center,FontSize,45,color,r); end case 108 if map(curpos(1),max(curpos(2)-1,1))0curpos(2)1 set(H,string,[]); curpos(2)curpos(2)-1; Htext(curpos(2),curpos(1),\bullet,HorizontalAlignment,Center,FontSize,45,color,r); end case 114 if map(curpos(1),min(curpos(2)1,f))0curpos(2) set(H,string,[]); curpos(2)curpos(2)1; Htext(curpos(2),curpos(1),\bullet,HorizontalAlignment,Center,FontSize,45,color,r); end otherwise endendtimetoc;strnum2str([Your Last Time is: num2str(time) 秒]);text(0.8*f,-1,str);后台回复关键词【迷宫】获得完整代码接下来一起看一下游戏效果。手动求解迷宫游戏效果图五、迷宫游戏封装通过前几部分我们实现了实现了这款豪华私人订制版“迷宫游戏的”三大功能即随机生成迷宫地图、手动求解生成的迷宫、MATLAB自动求解生成的迷宫下面我们将以上功能封装起来完成这款迷宫游戏。function maze_mainglobal nar FIGURE;close all;clc;narnargin;if nar1 ainput(请输入迷宫的行数:); binput(请输入迷宫的列数:); a2*a1; b2*b1; mapmaze(a,b); str迷宫游戏;endFIGUREfigure(KeyPressFcn,move_spot);map_draw(map,str);num3;while num3||num1 numinput(请在以下操作中选择一项:\n1,运行迷宫游戏\n2,求解该迷宫\n3,重新选择迷宫\n4,退出\n); switch num case 1 figure(FIGURE); move(map); case 2 clf; figure(FIGURE); tic; [map,~]maze_sove(map); map_draw(map,str); case 3 maze_main; case 4 return; endendnuminput(是否继续:\n1,继续\n2,退出\n);switch num case 1 maze_main; case 2 return;endfunction move_spot(~,evnt)assignin(caller,key,evnt.Key)return后台回复关键词【迷宫】获得完整代码至此我们彻底完成了这款迷宫游戏的制作在命名窗口输入maze_main即可畅玩这款迷宫游戏。私人定制版迷宫游戏整体运行效果图MATLAB迷宫游戏的完整代码大家可以关注微信公众号【数学建模andMATLAB】后台回复关键词【迷宫】就可以得到啦~参考来源[1] 维基百科_深度优先搜索https://zh.wikipedia.org/wiki/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2[2] 利用matlab创建与解决迷宫[深度优先、Prim、递归分割、Wilson]https://blog.csdn.net/weixin_42943114/article/details/104172146