天天看點

A*尋路算法及在遊戲中的應用 

翻出了一個文檔,很久以前學習A*時做的一個小遊戲,基于幀程式設計,沒用OOP

遊戲位址:http://www.3366.com/game/77446.shtml

簡介:

A*尋路算法及在遊戲中的應用 
A*尋路算法及在遊戲中的應用 
A*尋路算法及在遊戲中的應用 
A*尋路算法及在遊戲中的應用 
A*尋路算法及在遊戲中的應用 

開發環境:adobeflash cs 6

開發語言為as3.0

使用幀轉跳技術開發。

A*尋路算法及在遊戲中的應用 

所有類繼承自MovieClip類

實體對象類

Star類        星星障礙對象類。

Charecter類   角色方塊對象類。

Tile類        地形對象類。

界面相關類

LevelChoice類  關卡選擇對象類。

ScoreBoard類   得分界面類。

遊戲使用時間驅動

ENTER_FRAME   事件 每過一幀時間間隔,自動觸發一個回調函數。

MouseEvent.CLICK 事件 響應滑鼠點選,觸發回調函數。

主要功能函數子產品:

地圖子產品:

建立遊戲地圖

A*子產品:

A*尋路算法實作尋路

行走子產品:

通過A*子產品傳回的路徑,驅動對象行走

界面子產品:

處理界面的顯示和幀的轉跳

核心算法:

A*尋路算法:

A*是一種啟發式的算法,所謂的"啟發式",就是對每一個搜尋的位置進行評估,也就是把找的位置離目标的距離當成找點的一個依據,然後猜測這個點是否最佳。

決定哪些方格會形成路徑的關鍵是下面這個等式:

 F = G + H

G=從起點A沿着已生成的路徑到一個給定方格的移動開銷。

H=從給定方格到目的方格的估計移動開銷。這種方式常叫做試探。

1.

将開始節點放入開放清單(開始節點的F和G值都視為0);

2.

重複一下步驟:

i.

在開放清單中查找具有最小F值的節點,并把查找到的節點作為目前節點;

ii.

把目前節點從開放清單删除, 加入到封閉清單;

iii.

對目前節點相鄰的每一個節點依次執行以下步驟:

1.

如果該相鄰節點不可通行或者該相鄰節點已經在封閉清單中,則什麼操作也不執行,繼續檢驗下一個節點;

2.

如果該相鄰節點不在開放清單中,則将該節點添加到開放清單中,并将該相鄰節點的父節點設為目前節點,同時儲存該相鄰節點的G和F值;

3.

如果該相鄰節點在開放清單中, 則判斷若經由目前節點到達該相鄰節點的G值是否小于原來儲存的G值,若小于,則将該相鄰節點的父節點設為目前節點,并重新設定該相鄰節點的G和F值.

iv.

循環結束條件:

當終點節點被加入到開放清單作為待檢驗節點時,表示路徑被找到,此時應終止循環;

或者當開放清單為空,表明已無可以添加的新節點,而已檢驗的節點中沒有終點節點則意味着路徑無法被找到,此時也結束循環;

3.

從終點節點開始沿父節點周遊, 并儲存整個周遊到的節點坐标,周遊所得的節點就是最後得到的路徑;

注:以上關于A*算法的描述來源于來源于: GameDev.net作者: Patrick Lester翻譯:孫璨

A*尋路算法及在遊戲中的應用