[as2,
演算法視覺化
]人走迷宮演算法的視覺化實現
.
by emilmtthtew
05/10/11
小人在迷宮中尋路是乙個非常經典而有趣的演算法問題,主要用到的堆疊方面的知識還有乙個深度優先搜尋。演算法的細節可以參考我的日誌上的文章
:只顯示最正確的搜一條路線的版本
顯示出全部搜尋過程的版本
這裡主要談一下視覺化的實現
:其實是相當簡單的,我們用堆疊作為儲存中間結果的儲存體,當然,越在頂上的表示的是越靠近終點的結點。
在本來只是平白的用列印進行輸出的地方採用三個陣列進行儲存結果的轉換
(依次存放
x方向路徑,
y 方向路徑
和移動的方向
),然後從陣列從後往前進行解析,再對應的載入相應的動畫,即可。
我們請來了
qq堂裡非常
q的狸貓
mm來為我們演示這個效果,大家掌聲歡迎
.(聽說叫小倩,不我我還是喜歡叫她狸貓
mm,真的很可愛,很
pp的樣子
~~~)
另外,由於這裡是採用
flash
進行實現,外部檔案採用了
xml
檔案的方式來表示地圖,1
表示為牆,
0表示為路
.具體的例子如下
:<?xml version="1.0" encoding="gb2312"?>
startx='1' starty='1' endx='6' endy='6'>
1,1,1,1,1,1,1,1,1,1,1
1,0,1,0,0,1,1,1,0,0,1
1,0,0,0,0,0,1,0,0,1,1
1,0,1,1,1,0,0,0,1,1,1
1,0,0,0,1,0,1,1,0,1,1
1,1,0,0,1,0,1,1,0,0,1
1,1,1,0,0,0,0,0,0,0,1
1,1,1,1,1,1,1,1,1,1,1
如果你了解
xml檔案的話,相信對我上面所表達的資訊可以說是一目了然
.你可以通過變換地圖的形式及起終點來**不同條件下的演算法效果
.該說明的部分就到這裡了,下面是這個程式的具體實現:
1首先,定義乙個結點類
: 其實就是對
c語言的源程式進行了乙個**轉換的工作
,你可以在注釋中清楚的看到這一點
.class searchnode
;struct searchnode;*/
public static var unsearched:number=0;
public static var east:number=1;
public static var south:number=2;
public static var west:number=3;
public static var north:number=4;
public static var searched:number=5;
public var mdir:number;
public var visited:number
public function searchnode()}2
接下來,就是實現主程式段的時候了
:2.1
先談一下顯示最正確的搜一條路線的版本:
function coreresolve():void
else}}
可以看到
:setglobalvar(transxml),
parsemapinfo(transxml),
datainit(),
showmap();
這幾步,都是演算法實現及演示前的準備工作,在這裡不做過多介紹,比較簡單,具體的可以檢視我在最後附上的原始碼
.下面要實現的,是本程式最為核心的地方,當然,前半部分搜尋的過程也就是我
blog上c
語言實現版本的
as2重寫而已,對我而言工作量不算大。
最後用紅色筆標出的部分,實現了演算法儲存體與演示效果所需要的儲存體
---陣列間的轉換,也是很
easy
的,最後用乙個
setinterval
來實現演示效果,對於我這個還能算得上是
as的熟手而言,這樣的工作可謂駕輕就熟,呵呵
~~~,
就是這麼簡單
.function pathsearch():void
else
if(_root.gmaparr[curx+tmpx][cury+tmpy]==walkable&&!_root.gsearchnodearr[curx+tmpx][cury+tmpy].visited)
}if(flag&&curx==_root.gendx&&cury==_root.gendy)
if(flag==0&&!(curx==_root.gstartx&&cury==_root.gstarty))}}
if(flag)
_root.gansarr[_root.gendx][_root.gendy]=1;//because the target node was not push into the stacks.
for(var i:number=0;i<_root.grownum;i++)
else
trace3("/n");
trace(tmpstr);}}
else
_root.gindex=arrlen-1;
_root.attachmovie("mm","newmm",_root.getnexthighestdepth());
_root.newmm._x=-80;
_root.newmm._y=-80;
_root.gintervalid=setinterval(showanimator,_root.gfps,arrx,arry,arrdir);
}function showanimator(inarrx:array,inarry:array,inarrdir:array):void
_root.gindex--;}}
2.2接下來,為了能全面反映演算法的具體執行過程,我又做了能顯示出全部搜尋過程的版本
.其實這個版本在思路上反而要比上面的好作,因為只需要準備三個佇列,分別在需要記錄走過結點的地方進行入隊的操作就可以了。
在實現的時候,發現,如果完全按照演算法來,在返回先前結點的時候,會出現「倒」走的現象,這很顯然不合量,因此在程式在做了相應的調整
.另外,這個版本的
fps亦可通過
xml檔案中的引數
fps進行調節
.這個版本的**:(
注意紅筆部分
//歡迎提出批評與指正意見!
深度優先搜尋走迷宮 SDL視覺化
走迷宮問題是指在給定地圖中,從尋找一條從起點 設為左上角 到終點 設為右下角 的路徑的問題。假設迷宮形狀如下 其中乙個方格表示乙個位置,從乙個位置有上下左右四種走法,但每個位置的四個方向上可能會有牆壁存在,牆壁用黑線表示,無法通過,要求尋找一條從左上角到右下角的路線。深度優先搜尋可以很好地解決迷宮問...
演算法 A 尋路 視覺化
如下圖 尋路圖a 使用a 演算法,需要將地圖抽象成乙個個方塊,藍色代表不可以動 牆 黃色為起始點,紅色為目標點。其地圖的二維座標如圖所示,每乙個單位為1公尺 a 的基本公式為 f n g n h n f 初始狀態到目標狀態n的代價估計 起始點到n的代價估計 g 狀態空間中初始狀態到n的實際代價 n為...
A 演算法視覺化詳解與實現
在電腦科學中,a 演算法廣泛應用於尋路和圖的遍歷。最早是於1968年,由peter hart nils nilsson 和bertram raphael3人在斯坦福研究院描述了 該演算法。是對dijkstra演算法的一種擴充套件。是一種高效的搜尋演算法。這是個比較常用的演算法,遊戲中的尋路通常會使用...