完整工程下载在最后,先上效果:
红色方块为怪物体积大小为2x2个数1。
黄色为目标个数3。
白色点为障碍物。
怪物攻击范围2x2(自身大小)。
(这里为了方便观看,对算法每一步都进行了延时)
怪物大小1x1,怪物攻击范围1x1(自身大小)。
搜索过程中出现的红色路线就是路径,最后重新绘制的红色路径为对允许斜方向行走的路径。
周围位置是一个抽象的概念,如果加入为 上下左右,4个方向,那么每次就只会在4个方向进行挑选最优路径。
扩展一下:
Q:如果我需要进行任意角度斜着走呢?如果我需要45度角走呢?
A:那么只需要改变周围位置的定义即可。
其实就是对BFS进行了优先级排序,每次选取目标都从我们计算出的最优值进行搜索。(这样搜索就是有目的性的)
即:BFS + 优先队列 = A*,(这差不多就是A*的核心思想了,优先队列只是一种选最优的方法)
可以先假设我们已经找到了最优路径,那么最优路径有哪些性质?
对于每一个点我总是能到达,只是到达方式不同,导致到达使用的步数不同。因此我们可以在地图中记录到达这个点当前点使用的最小步数。如果有更小的步数的走法,我们就覆盖掉它。
通过记录最小步数来源的方向我们可以还原整条路径。(当然对于任意方向,如8方向同理)。
实现体积的需要处理的其实只有两个部分。
顶部的演示图就是使用这种方法。切换到多目标同时搜索很容易。
下面是使用同时搜索多个目标,并且只找最近目标的路径。
演示时使用的配置信息:
项目完整演示包:
https://download.csdn.net/download/qq_41709801/86911269