
正文
《C++游戏开发》十六 游戏中的寻路算法(二):迷宫&A*算法基础
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
本系列文章由七十一雾央编写,转载请注明出处。
http://blog.csdn.net/u011371356/article/details/10289253
作者:七十一雾央 新浪微博: http://weibo.com/1689160943/profile?rightmod=1&wvr=5&mod=personinfo
因为前段时间在学习Cocos2d-X引擎,然后自己最近就练手写了个小游戏练习,花了自己不少时间,所以这个系列没怎么更新,不过以后雾央会继续更新的,分享自己学到的新东西。
上一节本来雾央说要先讲迷宫,但是至少在现在,雾央觉得迷宫用处不是太大,所以就不打算详细写了,这里只是简略的介绍一下吧。
在以前的游戏中,由于硬件性能的原因导致不能负担起丰富的画面,同时也为了减轻美术人员的工作量,如何利用少数的资源创造出不同的游戏是一个很值得探讨的问题,前辈游戏程序员们给出的答案就是迷宫。使用迷宫,一方面可以利用几面墙就可以采用算法随机生成无穷无尽的地图,使玩家得到不同的体验,另一方面,也可以大大延长游戏的时长,毕竟,大家不希望自己画几十块钱买来的游戏一会就通关了吧。
对于迷宫,涉及到的一个问题就是随机生成算法。
大家可以首先将迷宫看成一个个方格,比如下图
我们可以规定一个入口和一个出口,比如左上角的格子和右下角的格子
现在我们需要的就是有一条路连接入口和出口,一般情况下都是要求路线是唯一的。
如果我们把每个格子都看作一个点,那么它实际上就是一个图。问题也就是等价于找到这张图的生成树。那么涉及到生成树的算法我们都可以拿来用了,比如BFS,DFS,Prim,Kruskal等等
对这些感兴趣的朋友,可以看这篇文章
各种迷宫随机生成算法
讲解的非常好
它里面还提到一种巧妙的方法,递归分割,感觉很巧,大家可以看看。
另外,在学数据结构的时候,我们学习过并查集,也叫不相交集,利用并查集也可以得到一种不错的算法。一开始每个格子都是一个集合,然后随机的选择一面墙将它拆掉,将墙两边的格子连接起来,合并它们俩所在的集合,判断出口和入口格子是不是在同一个集合中,如果不在则重复拆墙合并过程。
迷宫的另外一个问题就是寻路算法
高端的算法当然都是适用的,但是一般迷宫只是为了寻找一条通路而已,常用的DFS,BFS的就可以了,容易理解,也容易实现。
今天主要是想说一下雾央最近学习的A*算法,雾央也是个算法渣,但是最近迫切的感觉到了寻路算法的重要性,所以还是要认真学习下,网上有很多人写的A*算法,都很不错,下面写的都是雾央的理解,希望可以尽可能通俗。
最近雾央写了一个小游戏,其中的普通地图如下:
大家看到是采用摇杆来控制运动的,雾央是把这个游戏移植到Android上了,所以大家肯定是会觉得很蛋疼,那么小的屏幕上怎么好控制!其实雾央也不想这样的,直接点哪人物走哪不是很好吗,可是那样就涉及到一个问题了:寻路问题!地图上是有障碍物的,点击了一个地方后,人物肯定要以最短路径走过去,这是雾央学习中的第一个Android游戏,就没想给自己找麻烦,所以采用了蛋疼的摇杆操作。
用安卓机的朋友们,如果感兴趣,可以感兴趣试玩一下,呵呵,详细请点击这篇文章 点我啊 。
扯上面这些其实是想说,寻路算法还是挺重要的,今天只说最基础的A*算法,没有任何变异的品种。
由于A*算法的重要性和基础性,网上对A*算法的研究比比皆是,有很多大神都会他们进行过各种讨论和延伸。但是很多对于我们初学者来说并不合适,下面这个链接是对A*算法最基础最明了的说明,英文好的朋友可以直接看这篇文章
最通俗易懂的A*算法
英文不好的朋友也可以看这篇中文版,翻译的还行,大家应该也可以看懂。
A*算法中文翻译版
大家看上面这两篇应该就可以了,下面的是雾央学习A*算法对它的理解,再叙述一遍加深自己对它的理解,希望可以更通俗一点,有兴趣的朋友可以参考下。
问题与目标
首先明确一下希望解决的问题,我们看一下下面这张图。
这张图就代表我们的地图,为了方便,我们用方格代替,当然它也可以是多边形神马的。
绿色方格代表起点,红色方格代表终点,蓝色方格代表障碍物。
我们的目标就是找到一条最短路径从绿色方格到达红色方格。
路径评估方案
我们在寻找路径的时候会遇到很多种选择,那么那一条是最好的呢?这需要我们做出判断,也就需要一个标准。我们采用的评判公式是
F=G+H
下面雾央来具体解释一下这个公式的含义
F代表这条路径的长度,我们就希望找到具有最小F值的那条路
我们在寻路时从起点A出发是要经过一系列方格到达终点的,比如我们中途到达了某一结点M点,那么从起点A到结点M的路径已知,就是这里的G值啦
但是从M点到终点B的过程又是这样的一个寻路问题,我们不知道它的长度,所以需要采用估算算法,它的估计值就是H了。
剩下的下次再写,等会要睡觉了。
另外要开学了,最近雾央也很忙,因为雾央也在尝试着做自己的游戏,也在不断的学习,所以更新的没有七月份那么及时了。这个博客系列主要就是分享雾央学习的东西,大家初学游戏也需要自己思考怎么实现一些东西,其实到现在这些东西,已经足够大家做出自己的小游戏了,建议大家可以尝试做一下了,看似很复杂的游戏逻辑可以一点点写,慢慢组装起来,等以后再考虑架构可维护性神马的问题。先实现功能,在考虑改进优化的问题。在微博上有好几位多朋友问雾央学习的过程,其实雾央到现在也是一个初学者,到现在雾央学习过的东西都写在这篇文章中了,有兴趣的朋友可以看看,希望对你有一些参考意义, 雾央学过的东东 ,其实更重要的是自己动手实践,写几个小游戏慢慢就会成长。
《C++游戏开发》十六 游戏中的寻路算法(二):迷宫&A*算法基础的更多相关文章
-
cocos2d-x游戏开发(十六)帧动画
欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11775745 本来想写一下帧动画的,搜了一下网上好像有一大把,就懒得写了,直接贴代码. // ...
-
cocos2d-x游戏开发(十五)游戏加载动画loading界面
个人原创,欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11478885 这个资源加载的loading界面demo是在玩客网做逆转三国的时候随 ...
-
cocos2d-x游戏开发(十五)游戏载入动画loading界面
这个资源载入的loading界面demo是在玩客网做逆转三国的时候随手写的,尽管我在那仅仅待了2个礼拜.可是也算參与了一个商业游戏项目了,学到不少东西.当时使用的cocos2d-x还是1.0版的,我用 ...
-
[Unity游戏开发]向量在游戏开发中的应用(二)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
-
Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
-
【转载】【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态
[游戏开发]在Lua中实现面向对象特性——模拟类.继承.多态 阅读目录 一.简介 二.前提知识 三.Lua中实现类.继承.多态 四.总结 回到顶部 一.简介 Lua是一门非常强大.非常灵活的脚本语 ...
-
java游戏开发杂谈 - 实现游戏主菜单
经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...
-
J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用
J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用 spring 中获得由spring所配置的hibernate的操作对象,然后利用此对象进行,保存,修 ...
-
Unity 2D游戏开发教程之游戏精灵的开火状态
Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...
-
[Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)
---------------------------------------------------------------------------------------------------- ...
随机推荐
-
Ubntu 14.04 下 开源骨架跟踪-skeltrack
Skeltrack是个不错的开源骨架跟踪软件.跟踪起来还相对的稳定速度还不错.能满足基本的体感功能.下面来介绍下怎么安装. 1.运行环境配置 #need clutter 1.8 or greater ...
-
HDU 3436 Queue-jumpers (splay tree)
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
-
LM358资料及引脚图
LM358里面包括有两个高增益.独立的.内部频率补偿的双运放,适用于电压范围很宽的单电源,而且也适用于双电源工作方式,它的应用范围包括传感放大器.直流增益模块和其他所有可用单电源供电的使用运放的地方使 ...
-
mybatis逆向工程--自动生成实体代码(mybatis-generator)
随便找个目录, 添加文件, 如图 主要是两个jar包, generator的下载路径: https://github.com/mybatis/generator/releases 驱动包随 ...
-
Swift之沙盒与数据存储
应用沙盒结构分析 1.应用程序包:包含了所有的资源文件和可执行文件 2.Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录 3.tmp:保存应用运行时所需要的 ...
-
微软正式发布VS2015和.Net为开发者提供数百个新功能
今天,我很高兴地向大家宣布:Visual Studio 2015 和 .Net 4.6 的正式版本现已提供下载! 自去年十一月我们提出了微软开发技术的愿景:让所有开发者,无论他在什么平台,开发哪种应用 ...
-
用资源管理器右键编译 Visual Studio 解决方案文件
每次改动 VC 工程之后都要重新编译,每次 VS 又会生成调试数据库文件,很费时间,于是研究了一下如何在资源管理器中直接编译,还真发现了解决办法. 以下是适用 Visual Studio 2008 的 ...
-
Spring初始化完成后直接执行一个方法,初始化数据(解决方法被重复执行两次的情况)
在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据 是系统开始运行前必须的数据,例如权限组.系统选项.默认管理员等等.但是项 ...
-
C语言内存分析
C语言内存分析 一.进制 概念:进制是一种计数方式,是数值的表现形式 4种主要的进制: ①. 十进制:0~9 ②. 二进制:0和1 ③. 八进制:0~7 ④. 十六进制:0~9+a b c d e f ...
-
windows tomcat nginx session(当一台tomcat关闭后)
在windows下作nginx负载均衡测试. nginx的配置文件如下: worker_processes 1; events { worker_connections 1024; } http ...
欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11775745 本来想写一下帧动画的,搜了一下网上好像有一大把,就懒得写了,直接贴代码. // ...
个人原创,欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11478885 这个资源加载的loading界面demo是在玩客网做逆转三国的时候随 ...
这个资源载入的loading界面demo是在玩客网做逆转三国的时候随手写的,尽管我在那仅仅待了2个礼拜.可是也算參与了一个商业游戏项目了,学到不少东西.当时使用的cocos2d-x还是1.0版的,我用 ...
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
[游戏开发]在Lua中实现面向对象特性——模拟类.继承.多态 阅读目录 一.简介 二.前提知识 三.Lua中实现类.继承.多态 四.总结 回到顶部 一.简介 Lua是一门非常强大.非常灵活的脚本语 ...
经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...
J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用 spring 中获得由spring所配置的hibernate的操作对象,然后利用此对象进行,保存,修 ...
Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...
---------------------------------------------------------------------------------------------------- ...
-
Ubntu 14.04 下 开源骨架跟踪-skeltrack
Skeltrack是个不错的开源骨架跟踪软件.跟踪起来还相对的稳定速度还不错.能满足基本的体感功能.下面来介绍下怎么安装. 1.运行环境配置 #need clutter 1.8 or greater ...
-
HDU 3436 Queue-jumpers (splay tree)
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
-
LM358资料及引脚图
LM358里面包括有两个高增益.独立的.内部频率补偿的双运放,适用于电压范围很宽的单电源,而且也适用于双电源工作方式,它的应用范围包括传感放大器.直流增益模块和其他所有可用单电源供电的使用运放的地方使 ...
-
mybatis逆向工程--自动生成实体代码(mybatis-generator)
随便找个目录, 添加文件, 如图 主要是两个jar包, generator的下载路径: https://github.com/mybatis/generator/releases 驱动包随 ...
-
Swift之沙盒与数据存储
应用沙盒结构分析 1.应用程序包:包含了所有的资源文件和可执行文件 2.Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录 3.tmp:保存应用运行时所需要的 ...
-
微软正式发布VS2015和.Net为开发者提供数百个新功能
今天,我很高兴地向大家宣布:Visual Studio 2015 和 .Net 4.6 的正式版本现已提供下载! 自去年十一月我们提出了微软开发技术的愿景:让所有开发者,无论他在什么平台,开发哪种应用 ...
-
用资源管理器右键编译 Visual Studio 解决方案文件
每次改动 VC 工程之后都要重新编译,每次 VS 又会生成调试数据库文件,很费时间,于是研究了一下如何在资源管理器中直接编译,还真发现了解决办法. 以下是适用 Visual Studio 2008 的 ...
-
Spring初始化完成后直接执行一个方法,初始化数据(解决方法被重复执行两次的情况)
在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据 是系统开始运行前必须的数据,例如权限组.系统选项.默认管理员等等.但是项 ...
-
C语言内存分析
C语言内存分析 一.进制 概念:进制是一种计数方式,是数值的表现形式 4种主要的进制: ①. 十进制:0~9 ②. 二进制:0和1 ③. 八进制:0~7 ④. 十六进制:0~9+a b c d e f ...
-
windows tomcat nginx session(当一台tomcat关闭后)
在windows下作nginx负载均衡测试. nginx的配置文件如下: worker_processes 1; events { worker_connections 1024; } http ...






