很多游戏特别是rts,rpg类游戏,都需要用到寻路。寻路算法有深度优先搜索(DFS),广度优先搜索(BFS),A星算法等,而A星算法是一种具备启发性策略的算法,效率是几种算法中最高的,因此也成为游戏中最常用的寻路算法。

直入正题:

在游戏设计中,地图可以划分为若干大小相同的方块区域(方格),这些方格就是寻路的基本单元。

在确定了寻路的开始点,结束点的情况下,假定每个方块都有一个F值,该值代表了在当前路线下选择走该方块的代价。

而A星寻路的思路很简单:从开始点,每走一步都选择代价最小的格子走,直到达到结束点。

A星算法核心公式就是F值的计算:

F = G + H

F - 方块的总移动代价

G - 开始点到当前方块的移动代价

H - 当前方块到结束点的预估移动代价

以下详细解释这个公式,方便更好地理解它。

G值是怎么计算的?

假设现在我们在某一格子,邻近有8个格子可走,当我们往上、下、左、右这4个格子走时,移动代价为10;当往左上、左下、右上、右下这4个格子走时,移动代价为14;即走斜线的移动代价为走直线的1.4倍。

这就是G值最基本的计算方式,适用于大多数2.5Drpg页游。

基本公式:

G = 移动代价

根据游戏需要,G值的计算可以进行拓展。如加上地形因素对寻路的影响。格子地形不同,那么选择通过不同地形格子,移动代价肯定不同。同一段路,平地地形和丘陵地形,虽然都可以走,但平地地形显然更易走。

我们可以给不同地形赋予不同代价因子,来体现出G值的差异。如给平地地形设置代价因子为1,丘陵地形为2,在移动代价相同情况下,平地地形的G值更低,算法就会倾向选择G值更小的平地地形。

拓展公式:

G = 移动代价 * 代价因子

H值是如何预估出来的?

很显然,在只知道当前点,结束点,不知道这两者的路径情况下,我们无法精确地确定H值大小,所以只能进行预估。

有多种方式可以预估H值,如曼哈顿距离、欧式距离、对角线估价,最常用最简单的方法就是使用曼哈顿距离进行预估:

H = 当前方块到结束点的水平距离 + 当前方块到结束点的垂直距离

题外话:A星算法之所以被认为是具有启发策略的算法,在于其可通过预估H值,降低走弯路的可能性,更容易找到一条更短的路径。其他不具有启发策略的算法,没有做预估处理,只是穷举出所有可通行路径,然后从中挑选一条最短的路径。这也是A星算法效率更高的原因。

每个方块的G值、H值是怎么确定的呢?

G值 = 父节点的G值 + 父节点到当前点的移动代价

H值 = 当前点到结束点的曼哈顿距离

最后,A星算法还需要用到两个列表:

开放列表 - 用于记录所有可考虑选择的格子

封闭列表 - 用于记录所有不再考虑的格子

以上就是要完成A星算法所需要的东西,而算法的过程并不复杂。

A星算法伪码:

a、将开始点记录为当前点P

b、将当前点P放入封闭列表

c、搜寻点P所有邻近点,假如某邻近点既没有在开放列表或封闭列表里面,则计算出该邻近点的F值,并设父节点为P,然后将其放入开放列表

d、判断开放列表是否已经空了,如果没有说明在达到结束点前已经找完了所有可能的路径点,寻路失败,算法结束;否则继续。

e、从开放列表拿出一个F值最小的点,作为寻路路径的下一步。

f、判断该点是否为结束点,如果是,则寻路成功,算法结束;否则继续。

g、将该点设为当前点P,跳回步骤c。

后续优化

以上就是A星算法最基本的原理,明白了基本原理,用2,3百行代码写出一个可用的A星算法并不难。当然A星算法在实际应用中不仅于此,还可以对细节进行优化:

1、选择排序更快的二叉树来作为开放列表,帮助我们更快地从开放列表中取出F值最小的点;

2、对何种情况下可以走斜线路径加以判断;

3、采用布兰森汉姆算法预先判断两点是否可以直接通行,可通行就直接返回两点的直线路径,不可直接通行再采用A星算法寻路,提高寻路效率;

4、A星算法得出寻路路径后,可采用弗洛伊德算法对路径进行平滑处理,使人物走动更为自然

这里只是用语言讲解A星算法原理,并没有配图讲解整个寻路的过程,希望进一步直观理解整个过程的,推荐参考下面两个网友翻译过来的A星教程

http://www.raywenderlich.com/zh-hans/21503/a%E6%98%9F%E5%AF%BB%E8%B7%AF%E7%AE%97%E6%B3%95%E4%BB%8B%E7%BB%8D

http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx

java a星寻路算法_用简单直白的方式讲解A星寻路算法原理相关推荐

  1. 程序员面试算法_程序员的前20个搜索和排序算法面试问题

    程序员面试算法 大家好,如果您正在准备编程工作面试或正在寻找新工作,那么您知道这不是一个容易的过程. 在您职业的任何阶段,您都必须幸运地接到电话并进行第一轮面试,但是在初学者方面,当您寻找第一份工作时 ...

  2. 快速近似最近邻算法_数据科学家指南,以选择最佳近似最近邻算法

    快速近似最近邻算法 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Will ...

  3. python 三次曲线拟合算法_这可能是史上最全的 Python 算法集(建议收藏)

    导读:本文是一些机器人算法(特别是自动导航算法)的Python代码合集. 其主要特点有以下三点: 选择了在实践中广泛应用的算法: 依赖最少: 容易阅读,容易理解每个算法的基本思想. 希望阅读本文后能对 ...

  4. hash算法_阿里面试官:讲一下Hashmap中hash算法!

    注:本文内容全部基于jdk8讲述. 相信很多人都知道,在JDK8中,HashMap的容量总是2的n次幂,那么这么设计的目的究竟是什么呢?我可不可以将默认的初始容量从16改成20呢,扩容的时候我可不可以 ...

  5. std中稳定排序算法_敏哥:深挖亚马逊A9算法中的广告搜索排序

    大家好,我是敏哥.最近国外疫情肆虐,牵动着所有跨境电商人的心.今天美国的确诊人数已经突破了33万人,每天以3万左右的确诊数量在增加,就连老虎也未能幸免. 国外疫情肆虐,对于跨境电商人而言并不是一个很好 ...

  6. 差分进化算法_基于差分进化的水泥烧成系统动态优化算法

    基于差分进化的水泥烧成系统动态优化算法 郝晓辰, 冀亚坤, 郑立召, 史鑫, 赵彦涛 燕山大学电气工程学院,河北 秦皇岛 066004 [摘  要]针对水泥烧成过程的资源浪费以及难以建立有效数学机理模 ...

  7. 只腐蚀毛刺 腐蚀算法_去毛刺更省时省力的方式方法大全!

    金属加工平台 订单 | 技术 | 干货 | 社群 关注可加入机械行业群! 关注 去毛刺.倒角这些小工序往往在工作中不可小觑,今天小编总结了过去分享的一些资料,希望能给大家的工作带来帮助. 第一种:通快 ...

  8. javascript 设计模式_用英雄联盟的方式讲解JavaScript设计模式(二)

    前言 大家好,这是第三篇作者对于设计模式的分享了,前两篇可以参考: 手写一下JavaScript的几种设计模式 (工厂模式,单例模式,适配器模式,装饰者模式,建造者模式) 用英雄联盟的方式讲解Java ...

  9. 用通俗易懂的方式讲解:主成分分析(PCA)算法及案例(Python 代码)

    文章目录 知识汇总 加入方式 一.引入问题 二.数据降维 三.PCA基本数学原理 3.1 内积与投影 3.2 基 3.3 基变换的矩阵表示 3.4 协方差矩阵及优化目标 3.5 方差 3.6 协方差 ...

最新文章

  1. Python匿名函数:lamdba()函数
  2. 信通院2018人工智能发展白皮书技术篇重磅发布
  3. linux内核用什么调试,什么是开发/调试Linux内核最有效和最优雅的方式
  4. DB2数据库常用工具
  5. redhat 6.2安装telnet服务
  6. adb android源码分析,Android Adb 源码解析(base on Android 9.0)
  7. 原生JS封装ajax方法
  8. Web前端——JavaScript(dom文档对象模型)
  9. python进阶03UnboundLocalError和NameError错误
  10. 我们奋斗着并将持续奋斗 ----暨清华D-Lab创新基地揭牌仪式
  11. C++ BigEndian::FromLocal(uint_16)
  12. Maven项目的pom.xml配置文件格式初识
  13. ajax在success方法中打点不能调用
  14. jsp银行排队叫号系统
  15. javascript连接数据库
  16. 关于嵌入式工程师需要知道的网站
  17. 复变函数知识点整理1-3
  18. Mac Pro下终端配置Zsh(iterm2 3.3.0 + oh-my-zsh + solarized配色)
  19. 怎么拍照识别植物?手把手教你识别
  20. influxdb连续查询

热门文章

  1. [转] TOUGH 的系列平面广告
  2. 2021-07-23 小记
  3. Windows坐标系统
  4. js与c语言效率_JavaScript比c语言的性能差了多少?
  5. python怎么发送微信给自己_Python新手教程:Python微信定时自动给【女朋友】发送天气预报...
  6. mac怎么合并两个容器_Mac怎么合并文件夹?macz不容错过的苹果mac教程分享
  7. Halcon算子学习:get_sheet_of_light_result
  8. duilib中的添加自定义控件
  9. C++学习之路 | PTA乙级—— 1071 小赌怡情 (15 分)(精简)
  10. C++学习之路 | PTA乙级—— 1030 完美数列 (25 分)(精简)