Cocos2d-x 寻路算法解析(二): 离目的地的距离优先
看這個圖,我們發(fā)現(xiàn)這個尋路算法有點傻,明明終點在右側(cè)卻每個方向都找。難道沒有其他辦法了嗎?從現(xiàn)實生活中我們知道東西如果在東邊,當然是往東邊搜索才是最好的辦法。
?
計算機中如何表示離目標近呢? 用圖來解釋就是這樣的,目標在右上角,我們往右走,從X軸的角度來說離目標又近了一步,同理往上走是在Y軸上里目標近一步。最好的一步應(yīng)該是圖中-2的點,X軸和Y軸同時離目標近了一步。簡單地轉(zhuǎn)換成代碼就是下面的這樣:
000
扔到heap的比較條件中我們輕易地就實現(xiàn)了按照離目標距離優(yōu)先的尋路算法,startPathFinding整個方法都不要改,只需要傳進去上面提到的比較方法就行了。
-000
離目的地的距離優(yōu)先效果圖:
?
我們驚奇地發(fā)現(xiàn)似乎我們成功了,就用了9步就找到了目的地!
算法改進
從圖2中我們用的是X軸和Y軸上的相對距離,并不是真正的物理距離,手機號轉(zhuǎn)讓平臺意識到這個問題我們馬上修改了比較函數(shù)。物理距離當然容易算了,公式如下:
換成C++函數(shù)就是下面的樣子:
000
演示了下發(fā)現(xiàn)沒有什么變化。但我們知道我們變的更好了。
該算法存在的問題
1.很容易想到的一個問題是,它沒有考慮權(quán)重!如果目標在右側(cè),而右側(cè)是一條非常難走的路,那么這個算法將毫無顧慮地走過去,絲毫不考慮就在不遠處有條非常輕松的路。下面這個圖就可以說明這個問題。
?
2.還有個問題,即使沒有權(quán)重Cell的存在,只有可通過和不可通過Cell的存在,這個算法也有問題,我們可以人為地制造一個陷阱,雖然目標在起點的下方,但是上面有條更近的路,這個算法應(yīng)該會愚蠢地在往下找吧,這個就跟人一樣,有時候目光短淺。下圖是演示結(jié)果。
?
對比之前的算法發(fā)現(xiàn)其實上面的這條路更好的,雖然它查詢了大量的Cell才發(fā)現(xiàn)這點(人家很努力的好不好)。
?
看看還有什么更好的辦法沒有?期待下篇的尋路算法吧。
總結(jié)
以上是生活随笔為你收集整理的Cocos2d-x 寻路算法解析(二): 离目的地的距离优先的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动平台游戏网络重连方案
- 下一篇: Unity新手教程:Roll-a-Bal