代码https://resources.oreilly.com/examples/9780596005559/

追逐/闪躲问题由两部分组成。首先要做出追或逃的决策判断。其次是开始追或逃,也就是让追击者追猎物,或者让猎物尽可能离追击者远一点,免得被抓到。

追逐猎物是最简单、最容易写而且也是最常用的方法,就是在每次的游戏循环中,更新追击者的坐标,让追击者和猎物的坐标离得愈来愈近。这种算法不去管追击者和猎物各自行进的方向和速度。

除了这种最简单的方法之外,还有其他方法可以用,也许更能满足你的需求,审视你的游戏所需的条件。如根据速度和相对位置的信息,试图阻拦猎物。另一种方法是利用势函数(potential function),以某种方式改变追击者的行为,或让猎物引起追击者的注意。同样地,你也可以用类似的势函数,让猎物逃离追击者,或让追击者对猎物产生排斥感。

基本的追逐和闪躲

最简单的追逐算法是根据猎物的坐标来修改追击者的坐标,使两者间的距离逐渐缩短,反则扩大距离。猎物prey,追击者predator

基本追逐

if (predatorX > preyX)predatorX--;
else if (predatorX < preyX)predatorX++;if (predatorY > preyY)predatorY--;
else if (predatorY < preyY)predatorY++;

基本闪躲

if (preyX > predatorX)preyX++;
else if (preyX < predatorX)preyX--;if (preyY > predatorY)preyY++;
else if (preyY < predatorY)preyY--;

在砖块式构成的游戏中,游戏领域会切割成不连续的砖块(正方形、六边形等),以砖块为单位,前进的方向是有限制的。

而在连续环境中,则以点坐标表示位置,玩家也可以往任何方向移动。

以上算法的轨迹是一条折线,比较自然的做法是走直线。

视线追逐

右图表示猎物在运动的情况

在连续环境,移动单位是像素,不会影响动作的流畅感。

而在砖块环境,由于只有八种可能的移动方向,会引发一个有趣的问题:从数学观点来看,没有任何一个方向可以精确表达目标的真正方向。我们需要做的是找出邻近的八个砖块中,有哪一个是移动后,尽可能以直线走向玩家的。

解决方式是使用标准线段(standard line)算法。如Bresenham线段算法,它与其他线段绘制算法不同,绝不会在线段最短的那个轴上画出两个相邻的像素。

Bresenham算法的原理是比较起始点和终点之间的横轴和纵轴的长度,哪个轴比较长,就往该方向前进,等长就往斜边前进。

void ai_Entity::BuildPathToTarget(void)
{int nextCol=col;int   nextRow=row;int deltaRow=endRow-row;int deltaCol=endCol-col;int stepCol; int stepRow;int currentStep;int fraction;// 清空for (currentStep=0;currentStep<kMaxPathLength;currentStep++){pathRow[currentStep]=-1;pathCol[currentStep]=-1;}currentStep=0;pathRowTarget=endRow;pathColTarget=endCol;if (deltaRow < 0) stepRow=-1; else stepRow=1;if (deltaCol < 0) stepCol=-1;  else stepCol=1;deltaRow=abs(deltaRow*2);deltaCol=abs(deltaCol*2);pathRow[currentStep]=nextRow;pathCol[currentStep]=nextCol;currentStep++;if (currentStep>=kMaxPathLength)return;// Bresenham算法   if (deltaCol > deltaRow) {fraction = deltaRow * 2 - deltaCol;while (nextCol != endCol) {if (fraction >= 0) {nextRow += stepRow;fraction = fraction - deltaCol;}nextCol = nextCol + stepCol;fraction = fraction + deltaRow;pathRow[currentStep]=nextRow;pathCol[currentStep]=nextCol;currentStep++;if (currentStep>=kMaxPathLength)return;}} else {fraction = deltaCol * 2 - deltaRow;while (nextRow != endRow) {if (fraction >= 0) {nextCol = nextCol + stepCol;fraction = fraction - deltaRow;}nextRow = nextRow + stepRow;fraction = fraction + deltaCol;pathRow[currentStep]=nextRow;pathCol[currentStep]=nextCol;currentStep++;if (currentStep>=kMaxPathLength)return;}}} 

连续环境的视线追逐

Bresenham算法对砖块环境而言是相当有效的方法。而在连续环境中,可以结合物理引擎使用---个体移动都是由力和扭力(force & torque)来推动的,比如飞机、飞船等。

拦截

直接朝着猎物方向前进,从空间或者时间的角度来看,不一定都是追上猎物的最短路径。比较合理的解决办法,是让追击者在猎物路径上的某个点予以拦截。这样从时空角度来看,可以让追击者以最短的时间或路径追到猎物。另外,拦截算法甚至可以让速度较慢的追击者,有机会拦截到速度较快的猎物。

拦截算法的基本原理是能够预测猎物未来的位置,然后直接到那个位置去,使其能和猎物同时到达同一位置。

游戏AI-1:追逐和闪躲相关推荐

  1. 游戏开发中的人工智能(二):追逐和闪躲

    接上文 游戏开发中的人工智能(一):游戏人工智能简介 本文内容:讨论基本的追逐和闪躲技术,以及进级的拦截技术.我们也谈及这些技术在砖块环境和连续环境中的变化. 追逐和闪躲 本章的焦点是追逐和闪躲,这是 ...

  2. Java版战棋(SLG)游戏AI及寻径处理入门

    代码下载地址:http://download.csdn.net/source/1047937 SLG或者说战棋游戏,在大多数英文站点是归类到Simulation Game的(包括模拟城市之类的纯SIM ...

  3. 【总结】游戏AI人工智能

    参考书籍<Unity3D人工智能编程精粹><Unity3D人工智能编程> 游戏AI的架构模型 运动层:AI的具体行为,比如移动 决策层:决定AI下一时间步该做什么 战略层:从集 ...

  4. 游戏AI:只是AI间的游戏,还是游戏的未来?

    前言背景 1. 雅达利的崛起与沉沦 1974年,一个名叫史蒂夫·乔布斯的年轻人来到了雅达利(Atari)公司位于洛思加图斯的总部,拿着一块他朋友沃兹尼亚克做的电路板,手舞足蹈的比划,试图让对方相信这个 ...

  5. npc的AI是如何运作的? 从程序到策划深入谈游戏AI

    在我们玩的大多游戏中,总有这么一些角色默默无闻的陪伴着我们,这就是游戏中的npc.npc本意是non-player character,即游戏中非玩家操作的角色都是npc,包括怪物.村民等等元素都是n ...

  6. 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...

  7. 【转】【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    原文连接:http://www.cnblogs.com/dyllove98/archive/2012/04/07/2461865.html#commentform 我们常常听闻AI(Artificia ...

  8. 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI .

    本系列文章由zhmxy555编写,转载请注明出处.  http://blog.csdn.net/zhmxy555/article/details/7434317 作者:毛星云    邮箱: happy ...

  9. [原]【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI

    本系列文章由zhmxy555编写,转载请注明出处.  http://blog.csdn.net/zhmxy555/article/details/7434317 作者:毛星云    邮箱: happy ...

最新文章

  1. jsp 分页 tag
  2. 0308-标签的用法(a,ul/ol,table)
  3. windows下安装pygtk报g_assertion_message无法定位libglib-2.0-0.dll错误解决
  4. Unity 类似FingerGestures 的相机跟随功能
  5. Motan的SPI机制实现分析
  6. clion 配置,操作,技巧
  7. 《Office 365 开发入门指南》
  8. java成员内部类_Java中的内部类(二)成员内部类
  9. CentOS 7下安装集群Zookeeper-3.4.9
  10. 限时免费《敏捷个人-认识自我,管理自我 v0.6.pdf》
  11. j2me模拟器java游戏存档修改_单机游戏存档修改
  12. 固态硬盘与普通硬盘有哪些区别?
  13. [经验教程]拼多多直接免拼是什么意思?
  14. git 和 phabricator arc 常用 命令解析
  15. JAVA 蓝桥杯 算法提高 阮小二买彩票
  16. 关于云计算资源调度的一些思考
  17. opencv学习日志15-统计焊点个数并输出
  18. pip stall报错:Requirement already satisfied
  19. USB 3.0规范中译本 第5章 机械结构
  20. win10下星际争霸II和Pymarl环境配置

热门文章

  1. 太秀了!Android Studio 4.0 重磅来袭!Android 11 Bata 版来了!
  2. SmartGit每天弹出SmartGit requires a restart 的解决办法
  3. 第七届蓝桥杯大赛个人赛决赛(软件类)真题 Java语言B组 答案
  4. Android 应用兼容性最佳实践 | 中文教学视频
  5. 对朴素贝叶斯的理解(python代码已经证明)
  6. 位,字和字节的关系电脑知识
  7. 珍珠影城 - 360FLY
  8. android textview ellipsize汉字数字混合,Android TextView属性ellipsize多行失效的解决思路...
  9. 九齐单片机NY8B062D单按键控制4种LED状态
  10. 你还用70后的管理方式,管理99年的员工?上世纪的管理学已死