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

很多游戏特别是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb6 方法‘ ’作用于对象 失败_JS基础入门-对象的使用

今日背诵小纸条对象是一组属性方法的组合,其中可包含基本值、对象和函数对象的定义1 对象字面量var hero{name: ‘产品小姐姐’,age: 16,weapon: [ ‘头盔’, ‘靴子’, ‘盔甲 ],sayHi: function ( ) {console.log( this.name ’…

java接口中方法声明_java – 使用实现中声明的接口中未定义的方法

我有一个由接口定义的类public interface Test {void testMethod();}Test test new TestImpl();public class TestImpl implements Test {Overridepublic void testMethod() {//Nothing to do here}public void anotherMethod() {//I am adding this method in the implementa…

无法从套接字读取更多的数据 oracle_小伙面试时被追问数据库优化,面试前如何埋点反杀?

前言周五的早高峰, 各地软件园地铁站里中出现了不少穿着长袖加绒格子衫, 背双肩电脑包的年轻码农, 现在节气正值 [ 小雪 ] , 11月的全国性突然降温 , 让经历过996摧残的猿们一出地铁站就冻的打了个激灵 , 很庆幸的告诉大家距离放年假还剩不到 37 个工作日, 要买火车票的赶紧预约…

java随机数生成三位数_Java随机数总结

先放一道面试真题以下关于随机数的描述,正确的是:A. Matn.random() 可以生成 [ 0 , 1 ] 内的任意小数B. Random.next( 10 ) 可以生成 [ 0 , 10 ] 内的任意整数C. new java.util.Random().nextInt( 11 ) 可以生成 [ 0 , 10 ] 内的任意整数D. new java.uti…

python锁机制_python基础(锁机制,守护线程,线程队列,线程池)

一、 互斥锁(Lock)与递归锁(RLock)机制1.1 由互斥锁(Lock)产生的死锁现象:#互斥锁(死锁现象):#死锁现象:from threading importLocklockLock()lock.acquire()print(123)lock.acquire()#等待获取锁(死锁状态)print(456)lock.release()#等待释放…

java包图标是文件_关于更换.jar文件默认图标

最近写了个java程序,导出.jar文件后觉得默认图标太寒酸,想换一个自个儿喜欢的。eclipse导出.jar文件网上提供了很多很正确的方法,我也不必赘述。至于更改默认图标,网上提供的一些方法真是让人不敢恭维。部分人提供的方法是“右击-…

qlineedit限制输入数字_Excel单元格限制录入,实用小技巧

在填写资料表格的时候,为了不防止出错,会在单元格中设置一些技巧,限制对方输入内容,这样可以更好的预防输入错误。那么单元格限制输入技巧是如何实现的呢?1、限制只能录入数字比如单元格是我们要用来填写年龄数据等数字…

java二维数组 内存分配_java中二维数组内存分配

区分三种初始化方式:格式一:数据类型[][] 数组名 new 数据类型[m][n];m:表示这个二维数组有多少个一维数组。n:表示每一个一维数组的元素有多少个。//例:int arr[][]new int[3][2];如下图格式二:数据类型[][] 数组名 new 数据类…

如何在python官网下载pip_[Python]Pip的安装以及简单的使用

Pip的安装安装python以后(我的python版本是32位,版本号2.7.10),如果需要安装一些其他的库,一般有两种办法,一种是自己手动去各个库的官网下载,自己安装;另一种方法是安装pip,使用pip可以方便安装…

java造型_java造型_java向上造型有什么作用为什么要造型有什么效果_彩妆阁

1、java中造型与转型都什么意思,怎么用?我知道我知道 造型就是款式比如新款 爆款 秒杀款卖爆了等等这就是造型至于转型比如你之前写Java然后写.net 就叫转型了啦2、java中上溯造型是什么原理Upcasting,上溯造型,有的书译作“向上转…

word公式插件_如何快速输入复杂的数学公式?这里有 3 个实用技巧

不管你是不是科研狗,都可能遇到过在文章中插入公式。而我们最常用的就是使用 Word 自带的公式编辑器输入,Word 公式可以很好地匹配文章的格式,自然地插入文中。有时候处理一个公式简单,但如果你要输入大量公式,键盘、鼠…

java动作监听退出程序_监听获取程序退出事件(Linux、Windows、Java、C++)

监听程序退出事件,主要是用于程序的优雅退出。下面针对Java、C在Windows、Linux下的处理分别进行介绍.1.Java监听程序退出事件Java本身是跨平台的,不必关系Windows还是Linux。具体做法如下:通过Runtime.getRuntime().addShutdownHook(Thread …

python创建access表_Access创建表

有了数据库管理系统,在输入数据之前,您需要创建表。 Microsoft Access创建表非常容易。 事实上,当你创建一个数据库,Access创建你的第一个表(称为Table1)。通常情况下,当你需要创建一个新的表,选择CREATE &…

java观察者模式本质_6.[研磨设计模式笔记]观察者模式

1.定义定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。2.解决问题——订阅报纸看起来订阅者是直接根有据打交道,但实际上,订阅者的订阅数据是被邮寄传递到报社&#xff0…

python r语言 作图_生物医学绘图,Python 并不比R语言差

做过基因测序和生物信息学分析,尤其是做过RNAseq分析的同学都知道,R语言中有一款数据可视化神器ggplot2,其绘图功能强大,但它的缺陷是不能直接绘制3D图形,需要加载扩展包,很麻烦。如果用Python语言&#xf…

粒子群算法tsp java_粒子群算法解决TSP问题

1. 粒子群算法简介粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,属于进化算法的一种,是通过对模拟鸟群扑食行为设计的。基本思想:从随机解出发,通过迭代寻找最优解,通过适…

python 3.5.2页面_Python 3.5.2实现websocket服务端

最近由于一个项目需要,写了一个简易的websocket服务端程序,其间也参考了网上的很多资料,我将用接下来的几个篇幅说明是怎么实现的,及遇到的一系列埂。参考 (包括且不限于如下地址)涉及到的模块socket:socket通讯如侦听…

java连接sqlserver 的sqlhelper类_SQLserver数据库操作帮助类SqlHelper

using System;using System.Data;using System.Xml;using System.Data.SqlClient;using System.Collections;namespace SQL.Access{/// /// SqlServer数据访问帮助类/// public sealed class SqlHelper{#region 私有构造函数和方法private SqlHelper() {}/// /// 将SqlParamete…

python编写抢座位软件_程序员硬核Python抢票教程”,帮你抢回家车票

盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票。据悉,今年春运期间,全国铁路发送旅客人次同比将增长8.0%,达到4.4亿人次&#xff0c…

java io 缓存读取_Java 文件IO写入读取四种方法

第一种:字节流 FileInputStream FileOutputStream1.1 读取操作//先创建一个和硬盘连接的流(打通硬盘和内存的通道)FileInputStream fis new FileInputStream("D:\\Demo.txt");//创建缓存区大小是1kbyte[] bytes new byte[1024];int data 0; //存储有效…