您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > 游戏人工智能实验报告一
实验一追逐与拦截实验报告一、实验目的掌握游戏中追逐与拦截的人工智能算法二、实验仪器Windows7系统MicrosoftVisualStudio2015三、实验原理及过程//描述追逐与拦截的算法原理//描述程序实现时的思路包括对每个调用的API进行详细说明(1)描述追逐与拦截的算法原理:连续环境中的视线追逐是最简单的追逐算法,但是追逐者的移动不仅有线速度,而且还有角速度。算法思路就是:首先根据角速度把方向转到视线方向,然后向目标追过去。完整追逐/闪躲由三部分组成:首先,作出追或逃的决策判断。其次,开始追或逃(本章重点)最后,避开障碍物。拦截算法的基本原理是可以预测猎物未来的位置,然后直接到那个位置去,让追击者和猎物同时到达同一个位置。为了找出追击者和猎物能同时到达的点,不仅要考虑他们的移动方向,还要考虑他们的速度。(2)Main和winmain进行函数的定义。RigidBody2D类:进行物体的质量,惯性,关系,坐标,长高宽即外形的定义,用向量表示他们移动的方向。UpdateSimulation函数对于物体1,2的移动进行反应和控制。DoCraft2Chase函数对于物体1,2追逐进行判断,DoCraft2Evade函数对于物体1,2躲避进行判断。DoCraft2InterceptAlt函数对于物体1,2拦截进行判断。DoAttractCraft2函数判断是否攻击。四、实验结果五、实验心得(需包括有何不足如何改进)我认为目前的追逐与拦截的不足之处在于:本次实验做的是连续环境中的视线追逐与拦截。相比砖块环境中的追逐与拦截,肯定是要灵活变通很多,但是箭头老要跑到屏幕外面去,这就非常尴尬了。猎物的速度向量和初始位置向量是固定的,而且靠拢时间的计算是需要相对位移和相对速度的,容易得到两者不相遇的尴尬情况。如何改进:计算采用靠拢时间的办法,此外,再想办法让箭头留在屏幕以内,这样视觉感受会比较好。六、主要代码main.cpp#includemain.h#includetime.h//---------------------------------------------------------------------------/*Book:AIforGameDevelopersAuthors:DavidM.Bourg&GlennSeemannExample:Chasingandevadingincontinuousenvironments,Chapter2*///---------------------------------------------------------------------------//GlobalVariables:intFrameCounter=0;RigidBody2DCraft1,Craft2;VectorTarget;#define_TIMESTEP0.001#define_TOL1e-10#define_FWDTIME10#define_THRUSTFACTOR3#define_CHASESETUPtrueboolInitialize(void){Craft1.fMass=10;Craft1.fInertia=10;Craft1.fInertiaInverse=1/10;Craft1.vPosition.x=_WINWIDTH-60;Craft1.vPosition.y=_WINHEIGHT*0.8;Craft1.fWidth=10;Craft1.fLength=20;Craft1.fHeight=5;Craft1.fOrientation=135;Craft1.CD.y=-0.12*Craft1.fLength;Craft1.CD.x=0.0f;//coordinatesofthebodycenterofdragCraft1.CT.y=-0.50*Craft1.fLength;Craft1.CT.x=0.0f;//coordinatesofthepropellerthrustvectorCraft1.CPT.y=0.5*Craft1.fLength;Craft1.CPT.x=-0.5*Craft1.fWidth;//coordinatesoftheportbowthrusterCraft1.CST.y=0.5*Craft1.fLength;Craft1.CST.x=0.5*Craft1.fWidth;//coordinatesofthestarboardbowthrusterCraft1.ProjectedArea=(Craft1.fLength+Craft1.fWidth)*Craft1.fHeight;Craft1.ThrustForce=_THRUSTFORCE*1;Craft2.fMass=10;Craft2.fInertia=10;Craft2.fInertiaInverse=1/10;if(_CHASESETUP){Craft2.vPosition.x=40;Craft2.vPosition.y=_WINHEIGHT*0.8;}else{Craft2.vPosition.x=Craft1.vPosition.x-Craft1.fLength*8;Craft2.vPosition.y=Craft1.vPosition.y-Craft1.fLength*4;}Craft2.fWidth=10;Craft2.fLength=20;Craft2.fHeight=5;if(_CHASESETUP)Craft2.fOrientation=-135;elseCraft2.fOrientation=135;Craft2.CD.y=-0.12*Craft2.fLength;Craft2.CD.x=0.0f;//coordinatesofthebodycenterofdragCraft2.CT.y=-0.50*Craft2.fLength;Craft2.CT.x=0.0f;//coordinatesofthepropellerthrustvectorCraft2.CPT.y=0.5*Craft2.fLength;Craft2.CPT.x=0.5*Craft2.fWidth;//coordinatesoftheportbowthrusterCraft2.CST.y=0.5*Craft2.fLength;Craft2.CST.x=-0.5*Craft2.fWidth;//coordinatesofthestarboardbowthrusterCraft2.ProjectedArea=(Craft2.fLength+Craft2.fWidth)*Craft2.fHeight;Craft2.ThrustForce=_THRUSTFORCE*_THRUSTFACTOR;returntrue;}voidUpdateSimulation(void){doubledt=_TIMESTEP;RECTr;Craft1.SetThrusters(false,false);if(IsKeyDown(VK_UP))Craft1.ModulateThrust(true);if(IsKeyDown(VK_DOWN))Craft1.ModulateThrust(false);if(IsKeyDown(VK_RIGHT))Craft1.SetThrusters(true,false);if(IsKeyDown(VK_LEFT))Craft1.SetThrusters(false,true);//Docraft2AICraft2.Fa.x=0;Craft2.Fa.y=0;Craft2.Pa.x=0;Craft2.Pa.y=0;if(BasicChase){DoCraft2Chase();DoCraft2ModulateThrust();}if(BasicEvade)DoCraft2Evade();if(InterceptChase){//DoCraft2Intercept();//DoCraft2ModulateThrust();DoCraft2InterceptAlt();}if(PotentialChase)DoAttractCraft2();//updatethesimulationCraft1.UpdateBodyEuler(dt);Craft2.UpdateBodyEuler(dt);if(FrameCounter=_RENDER_FRAME_COUNT){//updatethedisplayif(!ShowTrails)ClearBackBuffer();DrawCraft(Craft1,RGB(0,0,255));DrawCraft(Craft2,RGB(255,0,0));RECTr;r.left=(int)(Target.x-3);r.top=(int)(Target.y-3);r.right=(int)(Target.x+3);r.bottom=(int)(Target.y+3);DrawEllipse(&r,1,RGB(0,255,0));CopyBackBufferToWindow();FrameCounter=0;}elseFrameCounter++;if(Craft1.vPosition.x_WINWIDTH)Craft1.vPosition.x=0;if(Craft1.vPosition.x0)Craft1.vPosition.x=_WINWIDTH;if(Craft1.vPosition.y_WINHEIGHT)Craft1.vPosition.y=0;if(Craft1.vPosition.y0)Craft1.vPosition.y=_WINHEIGHT;if(Craft2.vPosition.x_WINWIDTH)Craft2.vPosition.x=0;if(Craft2.vPosition.x0)Craft2.vPosition.x=_WINWIDTH;if(Craft2.vPosition.y_WINHEIGHT)Craft2.vPosition.y=0;if(Craft2.vPosition.y0)Craft2.vPosition.y=_WINHEIGHT;}voidDrawCraft(RigidBody2Dcraft,COLORREFclr){VectorvList[5];doublewd,lg;inti;Vectorv1;wd=craft.fWidth;lg=craft.fLength;vList[0].y=lg/2;vList[0].x=wd/2;vList[1].y=-lg/2;vList[1].x=wd/2;vList[2].y=-lg/2;vList[2].x=-wd/2;vList[3].y=lg/2;vList[3].x=-wd/2;vList[4].y=lg/2*1.5;vList[4].x=0;for(i=0;i5;i++){v1=VRotate2D(craft.fOrientation,vList[i]);vList[i]=v1+craft.vPosition;}DrawLine(vList[0].x,vList[0].y,vList[1].x,vList[1].y,2,clr);DrawLine(vList[1].x,vList[1].y,vList[2].x,vList[2].y,2,clr);DrawLine(vList[2].x,vList[2].y,vList[3].x,vList[3].y,2,clr);DrawLine(vList[3].x,vList[3].y,vList[4].x,vList[4].y,2,clr);DrawLine(vList[4].x,vList[4].y,vList[0].x,vList[0].y,2,clr);if(ShowVectors){Vectorv,u;doublef=5;//Sho
本文标题:游戏人工智能实验报告一
链接地址:https://www.777doc.com/doc-5731727 .html