第5章游戏人工智能39

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Windows程序设计(面向游戏)111第5555章游戏人工智能5.15.15.15.1移动型游戏AIAIAIAI我们常听到的AI(ArtificialIntelligence)即人工智能,是一个内容相当广的研究领域。它的主要目的是要让计算机本身按照某些法则来模拟出类似人类般的思考与预测能力,并结合计算机具有快速数学运算能力的优点,创造出计算机在各方面的有效应用。这一章要讨论的游戏人工智能,实际上只是整个人工智能研究领域中的一小部分。这里用不到像神经网络、基因算法、模糊逻辑等复杂的人工智能理论。相反,只需利用自己本身的思考模式去赋予游戏中角色的判断能力,来进行某些特定的行为,这样便可拓展出属于游戏自己本身的人工智能,而这也是一般游戏开发过程中最常见的方式。接下来将探讨一些游戏AI的基本概念,包括游戏角色的移动、路径搜寻和计算机的决策方式等。通过这些主题的讨论,可增加对游戏AI设计上的基本认识,激发设计游戏AI的灵感。5.1.15.1.15.1.15.1.1追逐移动凡是在游戏中会移动的物体,实际上几乎都涉及移动型的游戏AI,例如游戏中怪物追逐或者躲避玩家和计算机角色的移动等都是移动型AI的例子。这一小节中先来介绍在游戏程序中经常会看到的怪物追逐玩家这种追逐移动的设计方式。追逐移动是通过计算机控制角色朝某一目标物接近来实现,要设计出这样的物体移动模式很简单。以怪物追逐玩家的例子来说,只要在每次进行窗口贴图时,将怪物的所在坐标与玩家角色的所在坐标做比较,递增或递减怪物X、Y轴上的贴图坐标,使得怪物每次进行贴图时渐渐朝玩家角色所在的位置接近,便可产生追逐移动的效果。下面便是一个典型的怪物追逐玩家的移动AI算法,其中“怪物X”、“怪物Y”、“玩家X”、“玩家Y”分别用来表示怪物及玩家在X与Y轴上的贴图坐标。if{怪物x玩家x}怪物X--;else怪物X++;if{怪物Y玩家Y}怪物Y--;else怪物Y++;以前面所说明的概念来看这段算法的内容应该不难理解,是让怪物能正确地往玩家角色所在的目的地移动。不过一般在游戏程序当中,常会按照各种不同的情况(例如怪物本身的追逐能力、游戏等级的难易度等)来加入怪物追逐移动的不确定性,以提高计算机角色移动的多样化。下面来看一个怪物追逐玩家的算法例子。这段算法是以上面的算法为基础修改,使得进行追逐移动的怪物会按照自身生命值的多寡来决定是否进行追逐。在每次计算下次的位置坐标时,也只有2/3的几率能正确地朝向玩家。其中以“怪物HP”来表示怪物当前的生命值。Windows程序设计(面向游戏)112if(怪物HP200)//生命值大于200时才追{p=rand()%3;//取随机数除以3的余数ifp!=1)//余数不为1时进行追逐{if(怪物X玩家X)怪物X--;else怪物X++;if(怪物Y玩家Y)怪物Y--;else怪物Y++;}else怪物HP+=5;//怪物不动,休息补血}上面的这段怪物追逐的算法看起来比较具有弹性且符合真实的情况。在了解设计计算机角色追逐移动的方式之后,下面就来看一个完整的追逐移动范例程序。范例ch5_1ch5_1ch5_1ch5_1在范例ch4_2(飞机在循环背景上移动)中,加入3只追逐飞机移动的小鸟。程序代码:全局变量声明1//声明全局变量2HINSTANCEhInst;3HBITMAPbg,ship,bird;4HDChdc,mdc,bufdc;5HWNDhWnd;6DWORDtPre,tNow;7intx,y,nowX,nowY;8intw=0;9POINTp[3];程序说明第9行:声明“POINT”类型的点坐标数组“p[]”,用来记录窗口中3只小鸟的贴图坐标。在InitInstance()函数中设定数组中各个元素的初值。范例中使用了如图5-1所示的这张122×122的小鸟位图。图5-1Windows程序设计(面向游戏)113当目标飞机在小鸟的右边时,以图中上面的小鸟图案进行贴图;当目标飞机在小鸟的左边时,则以图中下面小鸟的图案进行贴图。程序代码:MyPaint()1//****绘图函数***********************************2//1.设定飞机坐标并贴图3//2.设定小鸟坐标并贴图4voidMyPaint(HDChdc)5{6inti;78//贴背景9SelectObject(bufdc,bg);10BitBlt(mdc,0,0,w,480,bufdc,640-w,0,SRCCOPY);11BitBlt(mdc,w,0,640-w,480,bufdc,0,0,SRCCOPY);1213//贴飞机14if(nowXx)15{16nowX+=10;17if(nowXx)18nowX=x;19}20else21{22nowX-=10;23if(nowXx)24nowX=x;25}2627if(nowYy)28{29nowY+=10;30if(nowYy)31nowY=y;32}33else34{35nowY-=10;36if(nowYy)37nowY=y;38}39SelectObject(bufdc,ship);40BitBlt(mdc,nowX,nowY,100,74,bufdc,0,74,SRCAND);41BitBlt(mdc,nowX,nowY,100,74,bufdc,0,0,SRCPAINT);Windows程序设计(面向游戏)1144243//贴小鸟44SelectObject(bufdc,bird);45for(i=0;i3;i++)46{47if(rand()%3!=1)//设定2/3几率进行追逐48{49if(p[i].ynowY-16)50p[i].y-=5;51else52p[i].y+=5;5354if(p[i].xnowX-25)55p[i].x-=5;56else57p[i].x+=5;58}5960if(p[i].xnowX-25)// 判断小鸟移动方向61{62BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,61,SRCAND);//向左追63BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,61,SRCPAINT);64}65else66{67BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,0,SRCAND);//向右追68BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,0,SRCPAINT);69}70}7172BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);7374tPre=GetTickCount();7576w+=10;77if(w==640)78w=0;79}程序说明(1)第14~41行:按照实际鼠标光标的位置(x,y)设定飞机的贴图坐标(nowX,nowY)并进行飞机的贴图。(2)第44~70行:进行小鸟追逐移动坐标计算及贴图操作。其中第47行程序代码设定小鸟有2/3的几率进行追逐移动。第48~58行设定移动的贴图坐标。第60~69行以目前飞机所在坐标点“nowX”减掉25个单位为中心点来判断贴上小鸟向右或向左飞行的图案。Windows程序设计(面向游戏)115运行结果程序运行结果如图5-2所示。图5-2小鸟在窗口中追逐飞机移动,按下【Esc】键结束程序的运行。5.1.25.1.25.1.25.1.2躲避移动从前面的追逐移动大概可以推知躲避移动是怎么一回事。与追逐移动朝着目标前进的目的刚好相反,躲避移动的目的是远离目标。下面就以计算机怪物躲避玩家的例子来看看躲避移动基本的算法。if(怪物X玩家X)怪物X++;else怪物X--;if(怪物Y玩家Y)怪物Y++;else怪物Y--;上面的这段算法,其中的判断式与追逐移动是相同的,不过每次重设怪物的贴图坐标时,则会越来越远离玩家角色的所在位置。5.1.35.1.35.1.35.1.3模式移动由于计算机角色的移动通常并不完全只进行像追逐或者躲避这样的单一的移动模式,因此程序中经常替计算机角色定义出一组移动的模式,其中可能包含多种基本的移动模式,例如追逐、躲避、随机移动、固定移动。计算机角色会随着游戏情节的改变按照定义的不同移动模式进行移动,这就是模式移动。这里以计算机怪物视玩家的强弱进行移动的例子来说明模式移动的方法。假设游戏中定义的怪物移动模式包含了追逐、躲避与随机移动3种模式,那么怪物进行这些移动的时机如图5-3所示。Windows程序设计(面向游戏)116图5-3模式移动的设计可以让计算机角色拥有更高级且富变化性的移动行为。像上面这个例子中,怪物通过比较玩家与自身的强弱来决定进行何种方式的移动,其中涉及怪物本身的思考及思考后的行为动作,因此这部分与下一节中要探讨的行为型AI相关。5.25.25.25.2行为型游戏AIAIAIAI行为型游戏AI主要是通过计算机角色本身的判断思考,然后产生对应行为的AI。在设计行为型的游戏AI时,通常会利用到一连串的“if-else”判断、数学运算,或者一些数据结构的概念。在这一节中,将讨论如何来构思并赋予游戏计算机角色的行为AI。5.2.15.2.15.2.15.2.1计算机角色的思考与行为首先来谈谈游戏程序中计算机角色的思考与行为,这部分内容事实上与平日对于各种不同事件情况进行分析思考,进而加以处理的概念是一样的。至于在游戏程序中如何让计算机角色拥有判断状况的思考能力,并按照判断后的结果进行相应的行为动作,可以利用“if-else”和“switch-case”这类的判断式来完成游戏中这类行为型AI的设计。这里举个RPG(ROLEPLAYINGGAME)游戏中怪物行为的例子进行说明。假设某一怪物在对战时具有下面的几种行为:(1)普通攻击:(2)施放攻击魔法;(3)使尽全力攻击;(4)补血;(5)逃跑。那么根据以上几种怪物的行为,可编写出如下的一段算法,用来仿真怪物在对战时的行为模式。1if(monster.nHp20)//怪物的生命大于202{3if(rand()%10!=1)4普通攻击;5else6魔法攻击;7}8else//怪物的生命小于209{10switch(rand()%5)//随机选择怪物行为11{Windows程序设计(面向游戏)11712case0:13普通攻击;14break;15case1:16魔法攻击;17break;18case2:19全力攻击;20break;21case3:22补血;23break;24case4:25逃跑;26break;27}28}在上面的这段算法中,利用“if-else”判断式判断怪物的生命值是否大于“20”。当怪物生命值大于“20”时,怪物有9/10的几率进行普通攻击及1/10的几率进行施放攻击魔法;假设当怪物受到了严重伤害且生命值小于“20”时,第10行程序代码通过“switch”叙述判断“ran()%5”的结果来进行对应的行为,因而怪物有可能会进行普通攻击、施放攻击魔法、使尽全力攻击、补血和逃跑等动作,而这些怪物行为的发生几率各为1/5。事实上像上面这样利用“if-else”、“switch”叙述,使计算机角色进行状况判断,并产生对应的行为动作就是行为型游戏AI设计的基本精神。下面来看一个简单的RPG玩家与怪物对战的范例程序。这个范例采用玩家与计算机轮流攻击的模式,其中怪物部分的行为AI将按照上面的算法以实际的程序代码加以实现,玩家部分则主要是下达攻击命令,两者之间的对战状态以文字消息来显示。运行时的画面如图5-4所示。图5-4范例ch5_2ch5_2ch5_2ch5_2在怪物与玩家对战模式中,设计计算机控制怪物的行为型AI。Windows程序设计(面向游戏)118程序代码:结构定义与全局变量声明1//定义结构体2structchr3{4intnHp;//目前生命值(healthpoint)5intfHp;//最大生命值(fullhealthpoint)6int

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功