matlab 邻近度 离群点_MATLAB自制迷宫游戏,快来试试吧!
- 隨機生成迷宮地圖
- 通過鍵盤手動求解生成的迷宮
- MATLAB自動求解生成的迷宮
一、深度優先搜索算法
首先來看一下維基百科上對深度優先搜索算法的介紹:深度優先搜索算法(Depth-First-Search,DFS)[1]是一種用于遍歷或搜索樹或圖的算法。這個算法會盡可能深的搜索樹的分支。當節點v的所在邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中一個作為源節點并重復以上過程,整個進程反復進行直到所有節點都被訪問為止。通俗的說,深度優先搜索算法的基本思想就是:從起點開始隨機走,走不通了就返回上一步,然后從下一個能走的地方再開始隨機走。深度優先搜索算法的算法框架如下:Step 1.設置一個起點。將起點作為當前迷宮單元,并標記為已訪問Step 2.當還存在未標記的迷宮單元時,進行循環(1)如果當前迷宮單元有未被訪問過的相鄰的迷宮單元①?隨機選擇一個未訪問的相鄰迷宮單元②?將當前迷宮單元入棧③?移除當前迷宮單元與相鄰迷宮單元的墻④?標記相鄰迷宮單元已訪問,并用它作為當前迷宮單元(2)如果當前迷宮單元不存在未訪問的相鄰迷宮單元,并且棧不空①?棧頂的迷宮單元出棧②?令其成為當前迷宮單元
下面我們通過一個簡單的栗子,來理解一下深度優先搜索算法。如下圖所示,從圖中的V0(頂點)出發,是否存在一條路徑長度為4的搜索路徑。顯然,可以直觀地看出來,所求的搜索路徑即:V0->V3->V5->V6。下面我們使用深度優先搜索算法來求解該問題。(1)從頂點V0開始,此時路徑長度為1<4,繼續搜索。由圖可知V0的相鄰節點中有V1和V3兩個可選節點,這里不妨取V1作為下一個搜索節點。(2)從V0的相鄰節點V1開始,此時路徑長度為2<4,繼續搜索。由圖可知V1只有V2一個相鄰的節點可供選擇。(3)從V1的相鄰節點V2開始,此時路徑長度為3<4,繼續搜索。由圖可知V2已經沒有未訪問的節點了(V0為起始節點,已經訪問過),因此退回上一節點V1繼續搜索。(4)由圖可知 V1的相鄰節點中,除V2外已經沒有未訪問的節點,因此退回上一節點V0繼續搜索。(5)從頂點V0重新開始,選擇V0的相鄰節點V3作為下一個搜索節點。(6)從V0的相鄰節點V3開始,此時路徑長度為2<4,繼續搜索。這里不妨去V3的相鄰節點V4作為下一個搜索節點。(7)從V3的相鄰節點V4開始,此時路徑長度為3<4,繼續搜索。由圖可知V4已經沒有未訪問的節點了,因此退回上一節點V3繼續搜索。(8)從節點V3重新開始,選擇V3的相鄰節點V5作為下一個搜索點。(9)從V3的相鄰節點V5開始,此時路徑長度為3<4,繼續搜索。由圖可知V5只有V6一個未訪問的相鄰節點,因此選擇V6作為一下搜索點。此時,路徑長度為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可以看到如下說明:由幫助文件可以看出來line函數適用于繪制線條的。看到這可能有很多小伙伴有疑問,plot也是用來畫圖的,為什么不用plot函數呢?為了回答這個問題,同樣的,在MATLAB的命令窗口中輸入help plot可以看到如下說明:通過幫助文件還是可以看到這兩個函數是有一些區別的,下面我們詳細對比一下這兩個函數:line函數與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的迷宮地圖,來看一下效果如何,并對生成的迷宮圖做一些說明。隨機生成的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自動求解所生成的迷宮游戲地圖,一款豪華的私人定制迷宮游戲基本就完成了。Matlab自動求解迷宮游戲效果圖下面一部分我們來給這款游戲提升一下“逼格”,通過gui設置實現手動求解迷宮游戲,即能夠通過鍵盤在迷宮地圖上移動棋子,完全實現單機版迷宮游戲。
四、手動求解迷宮游戲
話不多說,直接上代碼。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);
后臺回復關鍵詞【迷宮】獲得完整代碼接下來一起看一下游戲效果。手動求解迷宮游戲效果圖五、迷宮游戲封裝
通過前幾部分,我們實現了實現了這款豪華私人訂制版“迷宮游戲的”三大功能,即:隨機生成迷宮地圖、手動求解生成的迷宮、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即可暢玩這款迷宮游戲。私人定制版迷宮游戲整體運行效果圖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總結
以上是生活随笔為你收集整理的matlab 邻近度 离群点_MATLAB自制迷宫游戏,快来试试吧!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年各个银行宽限期一览表,各银行信
- 下一篇: xcopy复制文件夹及其子文件_嗨学习: