如何快速进行A* 寻路

下班了,没有事情作,之前一个人作游戏的时候,因为压力很大,所以特别喜欢写博客,但自从上班之后,再写博客的动力几乎就没有了。这就是为什么,原来在手机游戏这一块有很多的高手,现在都不怎么在网上活动了的原因。

今天来说一下我们作游戏时最常用的一种游戏地图中绕过障碍物的自动寻路算法吧。这个其实之前已经有很多的高人写过了,我只是把他们的文章进行了一下整理和总结罢了。

仿函数,所以要对结构体或者对象根据属性值来排序列就必须要对比较操作符">"或者"<"进行重载。

好了,先说A*寻路,我就懒得写了

A*寻路的大体思路是,从起始点开始,一点一点的将要寻找的可能节点加入寻路开放数组中,而这个开放数组就要用到我们说的二叉堆排序。当然,也可以用快速排序。这样我们可以每一次都取出花费最少的节点,再最后,将找到的关闭节点,反向回来,就可以得到我们的A*寻路路径了。

真的是懒得复制了,大家还是看别人讲的一个有关二叉堆排序列的博文吧:

这个博文真的写的非常好。简单明了。我也就不多说了。

然后就是关于使用STL中的二叉堆排序方法的四个函数了。参考下这个博文:

make_heap():建立二叉堆。

push_heap(): 给二叉堆中添加数据。

pop_heap(): 删除二叉堆顶数据。

sort_heap(): 排序列二叉堆。

大家参考一下,文作者也讲的很明白,只是关于比较操作符的重载写的太少了:

关于C++中的操作符重载,大家可以参考下下边的这个博客:

​​http://blog.sina.com.cn/s/blog_4b3c1f950100kker.html​​

总的来说,A*寻路也就这样了。没有什么新的东西了。写一个模块可以终身受用了。这两天在弄一个关于六边形的瓦片地图的A*寻路,有很多的坐标变换,还是要下一翻功夫的。这可能就是为什么使用六边形的瓦片地图编辑器会比较少的原因吧。等下次我来分享一下六边形坐标变换上想的一些算法吧。