障碍图的矩阵编辑搞定了,编辑起来非常方便,发个图鉴赏鉴赏。
下午写了A*算法的实现,原以为很复杂,其实也还算有点复杂
不过基本上很顺利,一下午就封装出来了
只是其效率还很不满意,特别是要不停的创建释放内存Open列表和Close列表操作太频繁
我选择了MuiltSet编制了评估路径损耗的排序规则,set的内部树结构,用来做这些恰到好处。
但就是对不停的创建和释放对象这方面感觉很不满意,或许考虑用Memory pool来解决这个问题
下面是A*算法的实现,也发出来如果你需要的话,可以拿来用用,尽管网上的例子已经有很多实现了
每个人都有自己的风格,这么经典的算法不自己写一遍似乎说不过去,再说将来还要改进和扩展呢
明天把写好的算法加入到地形编辑器中去,角色就能自己去找路径移动了。
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 9 9 9 9 9 9 0 0 0 0 0 0
0 0 0 0 9 1 1 1 1 0 9 0 0 0 0 0
0 0 0 0 9 1 0 0 0 1 0 9 9 0 0 0
0 0 0 0 9 1 0 0 0 0 1 1 9 0 0 0
0 0 0 0 9 1 0 0 0 0 0 1 9 0 0 0
0 0 0 9 0 1 0 0 0 0 0 1 9 0 0 0
0 0 9 0 1 0 0 0 0 0 0 1 9 0 0 0
0 9 0 1 0 0 9 9 0 0 1 0 9 0 0 0
0 9 1 0 0 0 9 1 1 0 1 9 0 0 0 0
0 9 1 0 0 0 9 9 0 1 1 9 0 0 0 0
0 9 1 0 0 0 0 0 9 0 1 9 0 0 0 0
9 0 1 0 0 0 0 0 0 9 9 9 0 0 0 0
AStar astar;
vector<PathPoint> path;
//astar.FindPath(buf8x8, 8, 8, PathPoint(7, 0), PathPoint(7, 7), path, true);
astar.FindPath(buf16x16, 16, 16, PathPoint(15, 0), PathPoint(11, 7), path, true);
for(DWORD i = 0; i < path.size(); i ++)
{
printf("%d %d \r\n", path[i].i, path[i].j);
}
算法实现源码