A*寻路项目实战

公司的项目(有侵权私我,我立马删)

 

 分享个游戏算法网站 https://www.redblobgames.com/

A*原理:

1,用个close数组存储使用过的点。

2,用个open数组,存储下一次可以选择的点。

3,用个relationShip来记录某个点的父节点(父是唯一的,很多博客没有说明这个)。最终寻找到的最短路径就是从target节点找父节点,然后再找父节点的父节点,最终找到original节点,这条路径存储起来就是我们最终寻找到的节点。

各种情况

1.遍历到一个点,周围可达的点没有在openArray&&closeArray中:那么就将这些点加入到openArray中

2.遍历到一个点,发现周围可达到点已经在closeArray中,那么就无视该点。

3.遍历到一个点,发现周围可达到点已经在openArray中,那么分两种情况。

4.将遍历到的点添加到closeArray中

设该点为a,可达点为b

找b节点到父节点一直找到original节点,算该路线的长度(不能直接算该点到original节点的距离,必须算中间经过点的路径距离),然后计算original节点到a节点在到b节点的距离,两者距离进行比较。

刷新relationship数组或者map啥的。

1.经过a节点的距离小。那说明经过a节点的距离短,那么就将b节点的父节点设置为a。

2.经过a节点的距离大。那说明a绕了路,这不是最佳路径,不做修改。

至于权重,由于该游戏是六边形网格等等原因,我直接使用了两点之间的像素点距离来解决权重问题。

简述一下思考过程。

  1. 贪心+单点到单点。最开始思考的就是化简方法,从 堆到堆 -点到点 一开始还没考虑A*因为点到点不是很复杂,而是考虑比较无脑的贪心,直接根据距离来贪。可惜,出大问题了。理想情况为红色,但实际上为绿色一直左右徘徊不是我想要的效果。
  2.  A*算法+单点到单点。开始做A*(其实我是从贪心一点点改,加限制条件,最后发现差不多变成A*了)。写完A*。点到点的最短距离找到了,但需要实现多点到多点同时寻路到达。因此还需要做一点点优化。
  3. A*+将已存储的最短路径设置为障碍物+多点到多点。因为路径是找到,然后再开始移动。(egret用tween这个东西加await异步移动。)。所以一起移动的时候就存在互相之间撞到(2D就是互相遮挡了)。效果不是很好,于是算每条路的时候,把那条最短路径设置成为障碍物。可以解决这个问题。
  4. A*+等待寻路+多点到多点。互相将路径设置为障碍物是可以解决部分问题,但是遇到地图小,路径多,就会导致有些点找不到路径。于是每个点只算其最短路径,并将所有目标点设置为障碍(不设置为障碍点的话,假设某点到了目标点,然后不动了,但这是另外一个点的路径上的一步,就会无限等待。),然后每走一步便将当前位置设置为障碍,将上一个位置设置为可走的。(很理想,但是异步实现,技术不到位。),异步不好实现那就用排序,给他们排个序也好记录障碍点,但也有点小问题,那就是假设两个点互相要到对方当前的位置,那么就会互相等待形成死循环(当时想加个map之类的看看有没有形成死循环,后面发现有可能三个点互相阻塞,有可能四个点,实现起来太麻烦了)。
  5. A*+重新寻路+多点到多点。如上,从上面排序寻路(每次只走一步,所有点走一步),加个条件,发现前面障碍就重新寻路,这样就可以不阻塞一直在走,看起来也好很多。但是!!!有些路径越选越长。不是最短路径了!。
  6. A*+等待+重新寻路+多点到多点。到最后,将等待时间也记录一下(抽出来给策划调试),将重新寻路的路径长度,与先前的路径长度进行比较(这个比较数值也要抽出来给策划调试)。这样一个暂时没什么大问题的寻路已经完成了。(但是实现效果也不是很好。)

最后,其中很多思路是leader跟我说的,比如等待啥的,其实一开始就想到会死循环,但是得先实现一下,主程跟我说了下,A*适合单源寻路,多点用B*,以及那个图六边形我用的六叉树存储,代码给我敲麻了,然后跟我说了个临接表。学到了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值