matlab 邻近度 离群点_MATLAB自制迷宫游戏,快来试试吧!

5976cd1bcd1795ad294053f22dc3063f.png

前几天给大家介绍了“一行matlab代码可以做哪些匪夷所思的事情”,今天小编带给大家一款酷炫的私人订制版迷宫游戏。这款迷宫游戏包含以下功能:
  • 随机生成迷宫地图
  • 通过键盘手动求解生成的迷宫
  • MATLAB自动求解生成的迷宫
717843ad11c54bdcea58b3cb5196c991.gif目前主流的生成迷宫的算法有:深度优先搜索算法(也称递归回溯算法)、Prim算法、递归分割算法,和Wilson算法(Loop-erased random walk)。今天只给大家介绍递归回溯算法生成迷宫。首先,我们来看一下深度优先算法的基本内容。

一、深度优先搜索算法

首先来看一下维基百科上对深度优先搜索算法的介绍:深度优先搜索算法(Depth-First-Search,DFS)[1]是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。15f2ec90a0d09264b880f9a7d617bb3c.png通俗的说,深度优先搜索算法的基本思想就是:从起点开始随机走,走不通了就返回上一步,然后从下一个能走的地方再开始随机走。深度优先搜索算法的算法框架如下:
Step 1.设置一个起点。将起点作为当前迷宫单元,并标记为已访问Step 2.当还存在未标记的迷宫单元时,进行循环(1)如果当前迷宫单元有未被访问过的相邻的迷宫单元① 随机选择一个未访问的相邻迷宫单元② 将当前迷宫单元入栈③ 移除当前迷宫单元与相邻迷宫单元的墙④ 标记相邻迷宫单元已访问,并用它作为当前迷宫单元(2)如果当前迷宫单元不存在未访问的相邻迷宫单元,并且栈不空① 栈顶的迷宫单元出栈② 令其成为当前迷宫单元
下面我们通过一个简单的栗子,来理解一下深度优先搜索算法。如下图所示,从图中的V0(顶点)出发,是否存在一条路径长度为4的搜索路径。0a329f53763a28c2fc85ca222d1ec7ca.png显然,可以直观地看出来,所求的搜索路径即:V0->V3->V5->V6。下面我们使用深度优先搜索算法来求解该问题。(1)从顶点V0开始,此时路径长度为1<4,继续搜索。8262df3f37bf1b28c58fb6d7fd1f4061.png由图可知V0的相邻节点中有V1和V3两个可选节点,这里不妨取V1作为下一个搜索节点。30493493787b9b9ead8cefa1a8ad5ab6.png(2)从V0的相邻节点V1开始,此时路径长度为2<4,继续搜索。由图可知V1只有V2一个相邻的节点可供选择。ecf60eda5d66615eac82e68384be1fd9.png(3)从V1的相邻节点V2开始,此时路径长度为3<4,继续搜索。由图可知V2已经没有未访问的节点了(V0为起始节点,已经访问过),因此退回上一节点V1继续搜索。30493493787b9b9ead8cefa1a8ad5ab6.png(4)由图可知 V1的相邻节点中,除V2外已经没有未访问的节点,因此退回上一节点V0继续搜索。8262df3f37bf1b28c58fb6d7fd1f4061.png(5)从顶点V0重新开始,选择V0的相邻节点V3作为下一个搜索节点。bc9fc180e2e5dc48b3412f7977b12029.png(6)从V0的相邻节点V3开始,此时路径长度为2<4,继续搜索。这里不妨去V3的相邻节点V4作为下一个搜索节点。394ee9dc61e86a543abdddf2e4d09810.png(7)从V3的相邻节点V4开始,此时路径长度为3<4,继续搜索。由图可知V4已经没有未访问的节点了,因此退回上一节点V3继续搜索。bc9fc180e2e5dc48b3412f7977b12029.png(8)从节点V3重新开始,选择V3的相邻节点V5作为下一个搜索点。859e4a7f181c94a36d196b4f52f0de16.png(9)从V3的相邻节点V5开始,此时路径长度为3<4,继续搜索。由图可知V5只有V6一个未访问的相邻节点,因此选择V6作为一下搜索点。c9b299cbe30a64c4e7efabe1674080a9.png此时,路径长度为4,且V6已经没有未访问的节点,因此已找到解,结束搜索。以上即为深度优先搜索算法求解该简单图的详细步骤,相信大家通过这个简单的栗子对深度优先搜索算法有了一定的认识,下面我们就进入正题——使用MATLAB制作迷宫游戏。

二、生成迷宫游戏的地图

借助前面介绍的深度优先搜索算法可以生成迷宫游戏的地图。深度优先搜索算法构建迷宫的思想就是,每次把新找到的未访问迷宫单元作为起始点,寻找与其相邻的未访问过的迷宫单元,直到所有的单元都被访问到。也就是从起点开始随机走,走不通了就返回上一步,从下一个能走的地方再开始随机走。首先,我们生成迷宫游戏的地图的数据矩阵,MATLAB代码如下:

function map=maze(a,b)

map=zeros(a,b);

map(2,1)=1;

map(a-1,b)=1;

p=zeros(1,4);

q=zeros(1,a*b);

i=2;j=2;

x=0;

while ~isempty(find(map(2:2:a,2:2:b)==0,1))

    t=0;

    map(i,j)=1;

    if i>2

        if map(i-2,j)==0

            t=t+1;p(t)=1;

        end

    end

    if i

        if map(i+2,j)==0

            t=t+1;p(t)=4;

        end

    end

    if j>2

        if map(i,j-2)==0

            t=t+1;p(t)=2;

        end

    end

    if j

        if map(i,j+2)==0

            t=t+1;p(t)=3;

        end

    end

    if t==0

        q(x)=5-q(x);

    else

        x=x+1;

        q(x)=p(randi(t));

    end

    switch q(x)

        case 1

            i=i-2;map(i+1,j)=1;

        case 4

            i=i+2;map(i-1,j)=1;

        case 2

            j=j-2;map(i,j+1)=1;

        case 3

            j=j+2;map(i,j-1)=1;

    end

    if t==0

        x=x-1;

    end

后台回复关键词【迷宫】获得完整代码说明:map矩阵中的0元素代表未打通的墙壁,其余元素代表可行域(即通道)。通过运行上述代码,可以生成迷宫游戏的地图数据矩阵,下面我们来看一下如何进行数据可视化,即绘制迷宫游戏的地图。MATLAB绘制迷宫游戏主要借助line函数,因此,先来看一下line函数的主要功能,在MATLAB的命令窗口中输入help line可以看到如下说明:2a387b4d07d06a0b6a91bacac19a15ef.png由帮助文件可以看出来line函数适用于绘制线条的。看到这可能有很多小伙伴有疑问,plot也是用来画图的,为什么不用plot函数呢?ef0b008ce25413bd240f15fb7da27dff.png为了回答这个问题,同样的,在MATLAB的命令窗口中输入help plot可以看到如下说明:97197e6227512bb2fa2c98db9219f6b1.png通过帮助文件还是可以看到这两个函数是有一些区别的,下面我们详细对比一下这两个函数:d67c4d3e459db345e33c274d8f9e4973.pngline函数与plot函数绘图对比图大家还可以根据帮助文件仔细对比一下两个函数的区别。下面回归正题,使用MATLAB绘制迷宫地图,MATLAB代码如下:function time=map_draw(map,str) global nar FIGURE;[e,f]=size(map);set(FIGURE,'position',get(0,'ScreenSize'));axis offset(gca,'YDir','reverse')if nar<1 map(map==2)=3;endfor i=1:e for j=1:f if map(i,j)==0 if nar<1 if(mod(i,2)>mod(j,2)) line([max(j-1,1),min(j+1,f)],[i,i]); elseif(mod(i,2) line([j,j],[max(i-1,1),min(i+1,e)]); end else if map(i,max(j-1,1))==0&&j>1 line([max(j-1,1),j],[i,i]); end if map(i,min(j+1,f))==0&&j line([j,min(j+1,f)],[i,i]); end if map(max(i-1,1),j)==0&&i>1 line([j,j],[max(i-1,1),i]); end if map(min(i+1,e),j)==0&&i line([j,j],[i,min(i+1,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 endendg=gcf;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的迷宫地图,来看一下效果如何,并对生成的迷宫图做一些说明。ff362eeba0299a424ff2418aa703cc8c.png随机生成的10×10的迷宫地图如上图所示,这款迷宫游戏中有如下默认设置:左上角为迷宫入口,右下角为迷宫出口,黑色实线为迷宫的墙壁,白色空白区域为迷宫通道。

三、求解迷宫游戏

这里我们使用普通的搜索路径方法求解迷宫游戏,大概思路如下:从起点开始随机走,如果走不通了,则保存当前路径;然后逐步后退,直到能继续随机走;最终走完所有格点,则停止程序。MATLAB代码如下:
function [map,dist]=maze_sove(map)
[a,b]=size(map);model=map;h=zeros(3);h([2,4,6,8])=1;t=0;while 1 sample=conv2(model,h,'same'); sample(sample==1)=0; sample([2,a*b-1])=1; sample=sample>0; model(sample~=model)=0; if t==length(find(model>0)) break; else t=length(find(model>0)); endendmap=model+map;dist=length(find(map==2))-1;后台回复关键词【迷宫】获得完整代码到这里我们已经完成了迷宫游戏地图的生成、MATLAB自动求解所生成的迷宫游戏地图,一款豪华的私人定制迷宫游戏基本就完成了。7bded61e54e7ddf27db07ac77f7c125b.gifMatlab自动求解迷宫游戏效果图下面一部分我们来给这款游戏提升一下“逼格”,通过gui设置实现手动求解迷宫游戏,即能够通过键盘在迷宫地图上移动棋子,完全实现单机版迷宫游戏。

四、手动求解迷宫游戏

话不多说,直接上代码。6dbc45c19ba37803d18144b21516467e.png

function move(map)clf;map_draw(map, '迷宫游戏');[e,f]=size(map);curpos=[2,1];H=text(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))>0&&curpos(1)>1 set(H,'string',[]); curpos(1)=curpos(1)-1; H=text(curpos(2),curpos(1),'\bullet','HorizontalAlignment','Center','FontSize',45,'color','r'); end case 100 if map(min(curpos(1)+1,e),curpos(2))>0&&curpos(1) set(H,'string',[]); curpos(1)=curpos(1)+1; H=text(curpos(2),curpos(1),'\bullet','HorizontalAlignment','Center','FontSize',45,'color','r'); end case 108 if map(curpos(1),max(curpos(2)-1,1))>0&&curpos(2)>1 set(H,'string',[]); curpos(2)=curpos(2)-1; H=text(curpos(2),curpos(1),'\bullet','HorizontalAlignment','Center','FontSize',45,'color','r'); end case 114 if map(curpos(1),min(curpos(2)+1,f))>0&&curpos(2) set(H,'string',[]); curpos(2)=curpos(2)+1; H=text(curpos(2),curpos(1),'\bullet','HorizontalAlignment','Center','FontSize',45,'color','r'); end otherwise endendtime=toc;str=num2str(['Your Last Time is: ' num2str(time) '秒']);text(0.8*f,-1,str);

后台回复关键词【迷宫】获得完整代码接下来一起看一下游戏效果。8538942b871f56151f3ee04f741f1d0b.gif手动求解迷宫游戏效果图

五、迷宫游戏封装

通过前几部分,我们实现了实现了这款豪华私人订制版“迷宫游戏的”三大功能,即:随机生成迷宫地图、手动求解生成的迷宫、MATLAB自动求解生成的迷宫,下面我们将以上功能封装起来,完成这款迷宫游戏。

function maze_mainglobal nar FIGURE;close all;clc;nar=nargin;if nar<1 a=input('请输入迷宫的行数:'); b=input('请输入迷宫的列数:'); a=2*a+1; b=2*b+1; map=maze(a,b); str='迷宫游戏';endFIGURE=figure('KeyPressFcn',@move_spot);map_draw(map,str);num=3;while num==3||num==1 num=input('请在以下操作中选择一项:\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; endendnum=input('是否继续:\n1,继续\n2,退出\n');switch num case 1 maze_main; case 2 return;endfunction move_spot(~,evnt)assignin('caller','key',evnt.Key)return

后台回复关键词【迷宫】获得完整代码至此,我们彻底完成了这款迷宫游戏的制作,在命名窗口输入maze_main即可畅玩这款迷宫游戏。717843ad11c54bdcea58b3cb5196c991.gif私人定制版迷宫游戏整体运行效果图MATLAB迷宫游戏的完整代码大家可以关注微信公众号【数学建模andMATLAB】,后台回复关键词【迷宫】就可以得到啦~427fe4607f5807cf95eacdfcda6a022f.png参考来源[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/104172146f06b39bd64a057b10139fe37c8003ecf.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab中m文件的作用,M文件主要包含()_matlab中m文件的好处

M文件主要包含()答&#xff1a;M函数文件\n\nM命令文件(脚本文件)" src"" style"max-width: 100%; display: inline;">中国大学MOOC: 在缓冲区分析中二次模型的表示的主体对象对临近对象的影响随距离的增大呈线性衰减。答&#xff1a;错巡航速度是…

xcopy复制文件夹及其子文件_嗨学习:如何给电脑中文件夹设置密码

文件夹怎么设置密码,如何给文件夹设置密码?有些重要的文件或比较隐私的文件存放在电脑上&#xff0c;这些文件我们只希望自己能看到并使用&#xff0c;不希望别人访问。那么&#xff0c;最好的办法就是去对这些文件进行加密。 才不怕别人看到自己的隐私&#xff0c;设置密码&a…

php的修改数据库语句怎么写,php的数据库修改语句是什么

php的数据库修改语句是UPDATE&#xff0c;用于更新数据库表中已存在的记录&#xff0c;语法为【UPDATE table_name SET column1value, column2value2,...WHERE some_columnsome 】。本教程操作环境&#xff1a;windows7系统、PHP5.6版&#xff0c;DELL G3电脑。UPDATE 语句用于…

ubuntu20.04中安装划词翻译_教你轻松玩转免安装的网页翻译插件“有道网页翻译2.0”...

大家在日常网页浏览中肯定多多少少都会碰到英文网站&#xff0c;这时候往往需要花费非常多的时候去自行理解&#xff0c;效率低下&#xff0c;又或者借助浏览器自带的翻译功能进行翻译&#xff0c;但又可能遇到翻译不准的情况。现在这个问题可以解决啦&#xff01;“有道网页翻…

python 主要内容,介绍一些有关python的重要内容

Python的参数传递方式是&#xff1a;位置&#xff0c;默认值&#xff0c;变量参数&#xff0c;关键词参数。传值究竟是函数的值传递还是引用传递&#xff0c;要分情况&#xff1a;不变参数用值传递&#xff1a;像整型和string这样的不变对象是通过拷贝来传递的&#xff0c;因为…

系统业务逻辑书籍_「樊登读书会强推:免费送10本绝密书」彻底改变你的逻辑思维能力...

哈喽~你好我是JS-冰冰今天在星巴克喝咖啡整理了一些巨大价值的绝密资料&#xff0c;从过往在樊登读书会整理的10本彻底改变《逻辑思维能力》的绝密电子书。非常实用&#xff0c;对我的改变和提升非常有帮助&#xff0c;所以想把这份改变命运的绝密大礼包也送给需要的小伙伴~(怎…

饿了么风神登录_海底捞首度登陆第三方外卖!联手饿了么全国配送“小火锅”...

近日&#xff0c;“海底捞”正式联手饿了么推出第三方外卖配送服务。据悉&#xff0c;这是海底捞首次与本地生活服务平台合作推出第三方外卖业务。包括上海、济南、福州、郑州等多个城市的用户登录饿了么平台&#xff0c;下单购买海底捞“小火锅”外送等产品后&#xff0c;便可…

数据相关的在职研究生_南方医科大学2020年招收在职博士研究生导师名单及复试考生名单!...

南方医科大学2020年在职博士研究生入围复试考生名单各位考生&#xff1a;根据我校招收2020年在职博士研究生相关工作规定&#xff0c;现就进入复试考生名单予以公示&#xff0c;请入围复试考生密切关注我校相关复试公告&#xff0c;做好复试准备。南方医科大学招收2020年在职博…

富文本++php+源码,自己实现富文本编辑器

【实例简介】网页中经常需要输入多种资料&#xff0c;自带的TextBox不够用【实例截图】【核心代码】//************************************************************************************//将texttemp内容移入iframeiframeDocument.body.innerHTML parent.document.getE…

gridlayoutmanager 设置间距_不设置主灯的客厅应当如何保证较好的灯光分布?

如果没有从事照明设计的专业人士或者是比较有经验的室内设计师协助业主做决策&#xff0c;个人不太建议普通业主自行设置“无主灯客厅”的灯光分布。在日常设计工作中&#xff0c;如果委托人确已考虑放弃主灯&#xff0c;通常我也会建议业主保留已有的客厅主灯的灯控线路及开关…

Oracle filter 函数,Oracle数据库之SQL单行函数---字符函数续

前一篇博客练习了一些字符函数,之后自己又去下查阅了相关的资料&#xff0c;上一篇博客中还有很多的字符函数没有练习到&#xff0c;这次主要是对上次的一些未用到的字符函数进行一些补充练习。ascii()返回与指定的字符对应的十进制数&#xff0c;若为字符串则返回字符串首字母…

怎么画单极交流放大电路波形图_珠海放大IC怎么样

容抗XC1/2πf c (f表示交流信号的频率&#xff0c;C表示电容容量)电话机中常用电容的种类有电解电容、瓷片电容、贴片电容、独石电容、钽电容和涤纶电容等。集成电路更着重电路的设计和布局布线&#xff0c;芯片更强调电路的集成、生产和封装。而广义的集成电路&#xff0c;当涉…

图片识别不了小程序怎么办_图片转文字【微信小程序】

文字识别小程序在文章的底部直接拉到文章底部就可使用↓↓↓↓↓↓工作中&#xff0c;很多时间需要把纸质文稿上的大段文字变成可编辑文字&#xff0c;有时我们会一个一个文字录入&#xff0c;有时我们可以采用扫描仪&#xff0c;我们也用过扫描全能王APP。这里给大家介绍一种方…

切片器可以设置日期格式?_Power BI 中的切片器

何时使用切片器在要完成以下操作时&#xff0c;切片器非常有用&#xff1a;在报表画布上显示常用或重要的筛选器&#xff0c;用以简化访问。更轻松地查看当前筛选的状态&#xff0c;而无需打开下拉列表。按数据表中不需要的和隐藏的列进行筛选。通过将切片器放置在重要的视觉对…

linux打印jvm内存堆栈_5款强大的JVM 性能调优监控工具

原文链接&#xff1a;www.iteye.com/blog/josh-persistence-2161848现实企业级Java应用开发、维护中&#xff0c;有时候我们会碰到下面这些问题&#xff1a;OutOfMemoryError&#xff0c;内存不足内存泄露线程死锁锁争用(Lock Contention)Java进程消耗CPU过高......这些问题在日…

eclipse的tomcat如何运行自动弹网页_4个国外网页设计网站案例欣赏

原标题&#xff1a;4个国外网页设计网站案例欣赏要想把自己的网站制作得更加美观、吸引人&#xff0c;你需要多参考一些高质量的网站设计案例。今天就给大家看几个比较好的国外网页设计网站&#xff0c;你可以从中学习这些国外网页设计的思路。1.礼盒电商网站如何让自己的网站更…

参数调优为什么要采样_3年Java外包,内推阿里过关斩将,最后却倒在调优经验上! - Java架构师追风...

前言在当下的时代&#xff0c;懂高并发性能调优&#xff0c;一定是你在技术进阶赛道变得牛逼的加分项。不论&#xff0c;你是开发&#xff0c;架构还是管理岗&#xff0c;亦或者是其他互联网相关岗位。 因为毫不夸张的说&#xff0c;在现在动辄过千万级的并发流量环境下&#x…

ai算子是什么_隐私AI框架中的数据流动与工程实现

在上一篇文章中&#xff0c;我们介绍了&#xff0c;对于安全技术开发者&#xff0c;如何快速的基于 Rosetta 等隐私 AI 框架所提供的一系列接口&#xff0c;将自己的安全协议集成落地到上层的 AI 应用中来。在这一篇文章中&#xff0c;我们将介绍为了保护用户的隐私数据&#x…

从零开始学电脑_带你从零开始学装机 打造自己的专属电脑之固态和机械硬盘搭配篇...

前几天我们分别讲了自己装配一台电脑&#xff0c;如何选择CPU、主板、内存和显卡。电脑的硬盘是安装操作系统和存储数据的地方&#xff0c;就好像我们现实中的仓库。一般电脑磁盘常见的组合方式有以下三种&#xff1a;1.纯机械硬盘(一般是1T或者2T)2.双硬盘(固态机械&#xff0…

java程序里繁体字显示为方块_网页 俄罗斯方块

游戏地址&#xff1a;俄罗斯方块 | Tetris​zhangxiaoleiwk.gitee.io看着眼熟&#xff1f;没错&#xff0c;UI 模仿了tetr.js&#xff0c;但代码是自己写的。只支持电脑端&#xff0c;不知道键位可以点击设置查看。游戏用纯 JavaScript、HTML、CSS 实现&#xff0c;图形用 canv…