cocos2d x遊戲例項(5) A星演算法(1)

2021-07-03 20:41:18 字數 813 閱讀 2394

下面我們就介紹一下a星演算法,他就是一種啟發性的演算法,根據現在到達這個位置的步數及之後的「估計步數」,即f=g+h,f是整個從起點到終點的代價,g是從起點到我們目前位置的步數,h是從目前位置到終點的估計值,注意這裡是估計值,所以我們得到解並不一定是最好的解,具體解「好」到什麼程度呢?就是要根據h的估計的好壞,因此只是乙個較優解。(以上的部分只能說是我對a星演算法較為淺的理解,只能算是初探吧,有不足之處歡迎指正,這裡只是為了更好的解釋我的程式。)

我的程式的流程可以分為如下幾步,有乙個open表,有乙個close表,open表首先儲存我們的起點,然後由此出發,首先把起點放入close列表,並檢測這點周圍點的f值(g+h,h我們通過本點到終點的橫縱索引差估計而來),把剩下的點放入open列表中,並根據f值進行堆排序,然後把f值最小的點放入close列表中,然後繼續上面的迴圈,繼續處理,直到找到終點為止。當然我們還要根據我們的遊戲做一些處理即是處理地圖中的碰撞等,我們要讓我們的人物繞過碰撞。

首先看一下我們的程式結構

首先我們的mapscene

得到了保留,然後

astar是a

星演算法的核心演算法類,

astaritem是a

星列表中的列表項,首先看

astaritem

。我們為了讓此類更好的和cocos2d-x

結合,也使用同樣的記憶體管理機制,我們讓此類繼承與

ccnode

類,而其中有六個變數,分別是行列,

g函式,

h函式,

f函式,和在堆排序中的父節點。我們採取set/get的方法來管理這六個值

如有錯誤之處,希望大家多多指正

星演算法遊戲例項

cocos2d x遊戲例項(9) A星演算法(5)

我們這是乙個 指哪打哪 的例子,也就是說,使用者點到哪個位置,我們的主角就會移動到哪個位置,我們首先用我們之前已經講過的convertto2d把我們的點轉換為45度角地圖中的索引值,然後檢測我們的索引是否在地圖範圍內 之後就該a星演算法出場了,我們把主角位置索引,目標位置索引,以及地圖都傳入到fin...

cocos2d x遊戲例項(6) A星演算法(2)

首先函式從findpath函式開始,初始化的內容如下 首先是把當前位置和目標位置賦給我們這個類的成員變數,然後把我們的地圖變數傳入到成員變數map 中,然後分別初始化 open close path 列表,其中 path 和close 列表先為空,open 列表中為了進行堆排序時方便 堆排序時從索引...

cocos2d x遊戲例項(8) A星演算法(4)

繼續a星演算法,我們在經歷了地圖的檢測,並且檢測 open 列表和close 列表之後。如果還沒有被加入到 open 和close 列表中,我們就把他加入到我們的 open 列表中,方法如下 很簡單,就是設定我們之前已經提到過的引數,然後使用堆排序排列如下 堆排序之前已經介紹過,就是保證樹形結構的父...