A*寻路算法

在之前的贪吃蛇游戏比赛里,计算蛇吃食物路径时要用到寻路算法,于是就去了解了一下,以下是我的算法演化过程。

1、简单寻路–按图索骥

我一开始想到的方法就是最简单的:目标在哪个方位就往哪个方位走,就和平时看地图寻路一样。这时候算法的基本思想为:

即以起点终点连线方向为正方向,与正方向越接近的方法给予更小的权值,当搜索路径时总以总权值和最小为目的进行搜索,直到搜索到终点。

但在地图上有障碍物时会发生:

所以要对地图上的点做一些处理,即把障碍物从可以搜索的地图点集合中去除。

以下是此算法的搜索结果,蓝色点为搜索过的地图点,黑色为障碍物:

可以看见在简单情况下此算法可以很好的工作并找到一条最短路径,耗费的资源也不多。

但在复杂情况下可能会发生:

为了解决这种复杂情况下可能出现的找不到最短路径的问题,我又想了一种解决办法。

2、简单寻路–投石问路

这种算法的基本思想和蝙蝠的超声波导航类似:

即一圈一圈向外查找,直到找到终点。

这种方法能很好地解决复杂情况下找到最短路径的问题:

但也正如图中显示的,蓝色的格点(查找点)太多,对于资源的消耗太大,尤其在地图很大很复杂或对实时性要求较高的情况下用此算法基本不可能。

于是为了弥补以上两者的缺点并取其优点就产生了A*寻路算法。

3、A*寻路–融汇贯通

以上两种算法中,第一种算法以终点为导向,追求起点到终点的最近,但可能舍近求远;第二种算法以起点为导向,最求终点到起点的位置最近,但因为无法确定终点位置导致了资源消耗过大。于是A*算法同时考虑起点和终点,它的基本思想如下:

其中蓝色为起点,黄色为中继点,黑色为障碍,X为终点。

即选取要检查的地图点,以此地图点为中继点,分别计算距离起点和终点的位置,并把二者加和作为这一点的权值,寻路的路径就是总权值和最小的点的集合。

由于贪吃蛇游戏中只有水平和垂直两个方向,于是上图也可以演变成下图:

可以得出距离F = G’+ H’。

下面分步骤说明A*寻路的具体流程:

1 – 将当前节点(蓝色节点)的周围节点加入待检测集合openList(黄色节点)中,并计算F值;将障碍节点加入abandonList。

2 – 选取一个在openList中F值最小的节点,放入检测完毕集合closeList(绿色节点)中。若此节点为终点,算法结束。

3 – 计算当前节点(绿色节点)周围节点,并进行处理:

​ 3.1 如果节点在closeList中则丢弃节点(加入abandonList)。

​ 3.2 如果节点在openList中则重新计算这一点的F值。

​ 3.3 如果节点不在openList中,重复步骤2。

n – 重复步骤2、3

下图是复杂情况下A*寻路的结果:

既找到了最短路径,也没有搜索很多格子,是一种比较优秀的算法。

当然其实A star寻路在众多寻路算法中也算比较基础的寻路算法。如今比较常用的算法有D star算法(主要用于动态未知环境下的寻路,用于机器人寻路)和JPS(Jump Point Search)算法(用于格子地图的寻路,速度快且资源消耗少)等A star算法的优化算法以及Dijkstra算法(上述简单寻路的优化,主要用于静态地图下的寻路,最优可达线性时间复杂度)。

还有更进一步的寻路就是通过神经网络训练AI,但这种方法的缺点就在于算法不受控,开发人员不知道寻路的实现规则。一般而言很少会用这种方式做寻路。

在寻路算法背后也有地图的优化算法,常用的是划分navigation mesh(导航网格),其中的mesh为一个个凸多边形,划分完成后能大大减少地图点的数目。当然这就是另外一个故事了。

贪吃蛇AI算法中的A star寻路算法相关推荐

  1. 寻路算法实例解析:贪吃蛇AI的实现

    本文是寻路算法的实际应用篇,以贪吃蛇的实现为例子. 1.首先看下这个在微博上很火的贪吃蛇gif 这次我们尝试用代码来模拟下,说不定上面这个图就是计算机搞的. 2.讲贪吃蛇snake AI之前,我们先看 ...

  2. 贪吃蛇博弈算法python_算法应用实践:如何用Python写一个贪吃蛇AI

    原标题:算法应用实践:如何用Python写一个贪吃蛇AI 前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势 ...

  3. ai可以用c 语言编程,C语言手把手教你实现贪吃蛇AI(上)

    本文实例为大家分享了手把手教你实现贪吃蛇AI的具体步骤,供大家参考,具体内容如下 1. 目标 编写一个贪吃蛇AI,也就是自动绕过障碍,去寻找最优路径吃食物. 2. 问题分析 为了达到这一目的,其实很容 ...

  4. 自己动手写贪吃蛇AI——附源码和程序

    从第一次构想写贪吃蛇AI,到现在两个学期才落实下来.其实之前用手机C4droid控制台写过一次,不是很理想,这次把这个坑填了吧,非要问有什么意义的话,自娱自乐罢了. 再来回顾一下这张动图,非常的流畅, ...

  5. 贪吃蛇大作战中的“马太效应”

    贪吃蛇大作战中的"马太效应"     贪吃蛇大作战是这段时间很火的一款手机游戏,这个游戏的乐趣在于简单粗暴,对的,当下为工作生活而忙忙碌碌的我们是很难为一个手机游戏而牺牲太多的脑细 ...

  6. c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例

    本文实例讲述了JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法.分享给大家供大家参考,具体如下: 完整实例代码如下: A*寻路算法 #stage { border: 1px solid lig ...

  7. python贪吃蛇控制台_如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  8. python设计贪吃蛇游戏论文_用Python写一个贪吃蛇AI,让程序自己玩游戏

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  9. 如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

最新文章

  1. c语言输入姓名比较是否同性,C语言基础--选择题
  2. 谈谈“个人电子信息”的保护
  3. C#全局键盘监听(Hook)的使用(转载)
  4. 基于IPSec的×××配置实验
  5. python基础学习1-内置函数
  6. python + selenium - selenium常用元素定位
  7. 2018级C语言大作业 - 坦克动荡
  8. centos7.3二进制安装mariadb10.2.8
  9. [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]
  10. Centos/Linux 源码安装wireshark与tshark任意版本
  11. 基于穿戴式智能化步态分析仪的步态分析
  12. 项目实战(一)HTML5+CSS3+JS完成前端网站的制作
  13. Ackerman函数 非递归 java_ackerman(ackerman是谁)
  14. iOS超级签名系统源码及分析
  15. linux中dns服务故障,Linux DNS服务器故障解决
  16. 复杂电路简化经典例题_复杂电路的简化策略
  17. AI技术是什么?AI对生活的影响有哪些?
  18. Adobe Illustrator Mac使用教程
  19. Unity VR切换场景闪退
  20. godaddy plesk mysql 连接 2014_GoDaddy Plesk主机安装Discuz论坛需要注意的问题 | Godaddy美国主机中文指南...

热门文章

  1. 项目管理 | 如何进行项目收益管理?
  2. Android点赞效果的实现
  3. warframe怒焚者结合目标_Warframe中文维基:403
  4. win10 22H2t通过powershell无法启动卓越性能模式
  5. java社招是什么_java社招怎么准备
  6. 推荐系统之LFM模型
  7. 量化交易入门阶段——炒作中小盘换手率可不低
  8. python is not recognized_'python' is not recognized as an internal or external command
  9. Origin 绘制生存曲线图
  10. 【Java】DateUtils.truncate不应该再被使用