游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5631|回复: 0

Cocos2d-x 寻路算法解析(二): 离目的地的距离优先

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2015-11-6 13:39:11 | 显示全部楼层 |阅读模式
05958PICvxY_1024.jpg

  GameRes游资网授权发布 文 / 易水寒

  接上一篇《Cocos2d-x 寻路算法解析(一): 距离优先》

1.jpg

  看这个图,我们发现这个寻路算法有点傻,明明终点在右侧却每个方向都找。难道没有其他办法了吗?从现实生活中我们知道东西如果在东边,当然是往东边搜索才是最好的办法。

2.jpg
Figure 2

  计算机中如何表示离目标近呢? 用图来解释就是这样的,目标在右上角,我们往右走,从X轴的角度来说离目标又近了一步,同理往上走是在Y轴上里目标近一步。最好的一步应该是图中-2的点,X轴和Y轴同时离目标近了一步。简单地转换成代码就是下面的这样:

000

  扔到heap的比较条件中我们轻易地就实现了按照离目标距离优先的寻路算法,startPathFinding整个方法都不要改,只需要传进去上面提到的比较方法就行了。

-000

  离目的地的距离优先效果图:

3.jpg
Figure3

  我们惊奇地发现似乎我们成功了,就用了9步就找到了目的地!

  算法改进

  从图2中我们用的是X轴和Y轴上的相对距离,并不是真正的物理距离,意识到这个问题我们马上修改了比较函数。物理距离当然容易算了,公式如下:

20131203105231609.jpg

  换成C++函数就是下面的样子:

000

  演示了下发现没有什么变化。但我们知道我们变的更好了。

  该算法存在的问题

  1.很容易想到的一个问题是,它没有考虑权重!如果目标在右侧,而右侧是一条非常难走的路,那么这个算法将毫无顾虑地走过去,丝毫不考虑就在不远处有条非常轻松的路。下面这个图就可以说明这个问题。

4.jpg

  2.还有个问题,即使没有权重Cell的存在,只有可通过和不可通过Cell的存在,这个算法也有问题,我们可以人为地制造一个陷阱,虽然目标在起点的下方,但是上面有条更近的路,这个算法应该会愚蠢地在往下找吧,这个就跟人一样,有时候目光短浅。下图是演示结果。

5.jpg

  对比之前的算法发现其实上面的这条路更好的,虽然它查询了大量的Cell才发现这点(人家很努力的好不好)。

6.jpg

  看看还有什么更好的办法没有?期待下篇的寻路算法吧。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-5 16:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表