很早以前就在Gameres上学习过了A*的原理,但那时候也仅仅是看了遍原理,稍微了理解了下,当时虽然感觉A*并不复杂,但还是有几个关键点没能弄得清楚,比如更小G值的重新计算,趁着这几天工作清闲,正好把最原始的A*算法给写了一便
写A*原理的代码,自然最好得有一个直观的演示,A*走的是方格阵,GDI 的Setpixel函数正好可以满足我画方格的要求,利用最基本的VC8创建的一个小小的窗口,然后利用Setpixel在上面画障碍画寻找出来的路线,倒也是很合适
创建的绘制区大小为400 * 400,也就是说一共有160000个象素点,其实仅仅演示初级的A*根本不需要这么大的区域,但是为了以后的优化代码能够显示出速度上的差异,我便故意用了这么大的绘制区
基本的思想也相当简单,利用一个vector管理这160000个象素,也就是利用一维数组模拟二维数组的道理,然后单个vector元素里保存如下:win32的POINT结构变量一个,用来存储绘制的点位置信息,枚举类型一个,用来表示当前的结构处于什么状态,指向本身结构的指针一个,用于指向父象素,整型index值,保存当前结构在16000个象素点的下标,G,H,F3个整型,(这3个整型用来干什么,我想知道A*的都一眼就看出了)
具体怎么写的我也不多说了,相信大家不会比我陌生,大概花了2天多一点的上班时间(断断续续写的,期间还要处理其他工作上的事情),终于把最基本的A*算法给完成,利用最后找出来的路线点,能成功在客户区绘制出绕过障碍的A-B之间的最短路径了
最基本的东西算是完成了,但是这也只是最基本的第一步,最重要的一点是什么呢?当然是优化,A*搜索对于非常多的方格的时候,时间上的消耗是非常大的,所以算法就这一个,而针对这个算法而产生的优化算法,网上真是数不胜数了,所以下面要做的一步重要工作,就是优化算法,提高搜索速度了,我事先准备好的160000个象素点,终于能够派上他的用场了
从点POINT(2,2)搜寻到POINT(398,398)
如果对A*寻路基础算法原理不清楚并且有兴趣的朋友,可以去gameres上看一下这篇文章
http://data.gameres.com/message.asp?TopicID=25439
posted on 2008-03-06 23:13
火夜风舞 阅读(763)
评论(4) 编辑 收藏 引用