1、游戏人工智能实验报告材料二实验二 聚集与避障实验报告一、实验目的掌握游戏中聚集与避障的人工智能算法,理解宽视野和有限视野的区别二、实验仪器Windows 7系统 Microsoft Visual Studio2015三、实验原理及过程/描述聚集与避障的算法原理/描述程序实现时的思路包括对每个调用的API进行详细说明智能体只考虑哪些在检测盒内的障碍物。初始的时候,要将游戏世界中所有的障碍物都迭代到内存中,并标记哪些在检测盒内的障碍物以作进一步分析,然后把所有已经标记的障碍物都转换到智能体的局部空间。转换坐标后,那些x坐标为负值的物体将不被考虑,所以问题就变得简单多了,接下来必须要检测障碍物是否和
2、检测盒重叠。使障碍物的包围半径扩大检测盒宽度的一半。然后测试该障碍物的y值是否小于这个值(即障碍物的包围半径加上检测盒宽度的一半)。此时,只剩下那些与检测盒相交的障碍物了。接下来我们找出离智能体最近的相交点。再一次在局部空间中计算,第三步中扩大了障碍物的包围半径。用简单的线圆周相交测试方法可以得到被扩大的圈和x轴的相交点。4、实验结果五、实验心得(需包括有何不足如何改进)/你认为目前的聚集与避障有什么不足之处,如何改进目前的聚集与避障的不足之处在于:可能会因为错误的方案设计而搞错导致路线的躲闪。还有就是从实验2开始,我的电脑本身出现了COMCTL32.LIB文件LINK的错误,后来在同学的帮助
3、下我解决了这个问题。如何改进:实验前必须要经过精确的计算并且代码不能出现任何错误。把COMCTL32.LIB文件载入文件以让程序正确运行。6、主要代码#include main.h#include time.h/-/*Book: AI for Game DevelopersAuthors: David M. Bourg & Glenn SeemannExample: Flocking, Chapter 4*/-#define _TIMESTEP 0.0025#define _TOL 1e-10#define _FWDTIME 10#define _THRUSTFACTOR 1.0#define
4、 _CHASESETUP true#define _SPAWN_AREA_R 100#define _MAX_NUM_UNITS 20#define _UNIT_LENGTH 4#define _OBSTACLE_RADIUS_FACTOR 8#define _OBSTACLE_RADIUS _OBSTACLE_RADIUS_FACTOR * _UNIT_LENGTH#define _COLLISION_VISIBILITY_FACTOR 25#define _WIDEVIEW_RADIUS_FACTOR 200#define _NARROWVIEW_RADIUS_FACTOR 50#defi
5、ne _LIMITEDVIEW_RADIUS_FACTOR 30#define _SEPARATION_FACTOR 5#define _BACK_VIEW_ANGLE_FACTOR 1#define _FRONT_VIEW_ANGLE_FACTOR 1#define _NUM_OBSTACLES 8/ Global Variables:int FrameCounter = 0;RigidBody2D Units_MAX_NUM_UNITS;Vector Target;Vector Obstacles_NUM_OBSTACLES;bool Initialize(void) int i; Get
6、RandomNumber(0, _WINWIDTH, true); for(i=0; i_MAX_NUM_UNITS/2) Unitsi.Interceptor = true; Unitsi.ThrustForce = _THRUSTFORCE*1.5f; else Unitsi.Interceptor = false; Unitsi.ThrustForce = _THRUSTFORCE; for(i=0; i_NUM_OBSTACLES; i+) Obstaclesi.x = GetRandomNumber(_OBSTACLE_RADIUS*4, _WINWIDTH-_OBSTACLE_RA
7、DIUS*4, false); Obstaclesi.y = /*_WINHEIGHT/2;*/GetRandomNumber(_OBSTACLE_RADIUS*4, _WINHEIGHT-_OBSTACLE_RADIUS*4, false); return true;void DoUnitAI(int i) int j; int N; Vector Pave; Vector Vave; Vector Fs; Vector Pfs; Vector d, u, v, w; double m; int Nf; bool InView; bool DoFlock = WideView | Limit
8、edView | NarrowView; int RadiusFactor; / begin Flock AI Fs.x = Fs.y = Fs.z = 0; Pave.x = Pave.y = Pave.z = 0; Vave.x = Vave.y = Vave.z = 0; N = 0; Pfs.x = 0; Pfs.y = Unitsi.fLength / 2.0f; Nf = 0; for(j=1; j 0) & (fabs(w.x) fabs(w.y)*_FRONT_VIEW_ANGLE_FACTOR) if(d.Magnitude() 0) | (w.y fabs(w.y)*_BA
9、CK_VIEW_ANGLE_FACTOR); RadiusFactor = _WIDEVIEW_RADIUS_FACTOR; if(LimitedView) InView = (w.y 0); RadiusFactor = _LIMITEDVIEW_RADIUS_FACTOR; if(NarrowView) InView = (w.y 0) & (fabs(w.x) fabs(w.y)*_FRONT_VIEW_ANGLE_FACTOR); RadiusFactor = _NARROWVIEW_RADIUS_FACTOR; if(InView & (Unitsi.Interceptor = Un
10、itsj.Interceptor) if(d.Magnitude() 0) | (w.y fabs(w.y)*_BACK_VIEW_ANGLE_FACTOR) if(d.Magnitude() = (Unitsi.fLength * _SEPARATION_FACTOR) if(w.x 0) m = -1; Fs.x += m*_STEERINGFORCE * (Unitsi.fLength * _SEPARATION_FACTOR) / d.Magnitude(); / Cohesion Rule: if(DoFlock & (N 0) Pave = Pave / N; v = Unitsi
11、.vVelocity; v.Normalize(); u = Pave - Unitsi.vPosition; u.Normalize(); w = VRotate2D(-Unitsi.fOrientation, u); if(w.x 0) m = 1; if(fabs(v*u) 0) Vave = Vave / N; u = Vave; u.Normalize(); v = Unitsi.vVelocity; v.Normalize(); w = VRotate2D(-Unitsi.fOrientation, u); if(w.x 0) m = 1; if(fabs(v*u) 1) Fs.x
12、 += m * _STEERINGFORCE * acos(v * u) / pi; / Chase the target if the unit is a leader if(Chase) if(Nf = 0) Unitsi.Leader = true; else Unitsi.Leader = false; if(Unitsi.Leader | !DoFlock) if(!Unitsi.Interceptor) / Chase u = Units0.vPosition; d = u - Unitsi.vPosition; w = VRotate2D(-Unitsi.fOrientation
13、, d); if(w.x 0) m = 1; Fs.x += m*_STEERINGFORCE; else / Intercept Vector s1, s2, s12; double tClose; Vector Vr12; Vr12 = Units0.vVelocity-Unitsi.vVelocity; / closing velocity s12 = Units0.vPosition - Unitsi.vPosition; / range to close tClose = s12.Magnitude() / Vr12.Magnitude(); / time to close s1 =
14、 Units0.vPosition + (Units0.vVelocity * tClose); Target = s1; s2 = s1 - Unitsi.vPosition; w = VRotate2D(-Unitsi.fOrientation, s2); if(w.x 0) m = 1; Fs.x += m*_STEERINGFORCE; / Collision avoidance (with static obstacles) Vector a, p, b; for(j=0; j_NUM_OBSTACLES; j+) u = Unitsi.vVelocity; u.Normalize(
15、); v = u * _COLLISION_VISIBILITY_FACTOR * Unitsi.fLength; a = Obstaclesj - Unitsi.vPosition; p = (a * u) * u; b = p - a; if(b.Magnitude() _OBSTACLE_RADIUS) & (p.Magnitude() v.Magnitude() / impending collision.steer away w = VRotate2D(-Unitsi.fOrientation, a); w.Normalize(); if(w.x 0) m = -1; Fs.x +=
16、 m * _STEERINGFORCE * (_COLLISION_VISIBILITY_FACTOR * Unitsi.fLength)/a.Magnitude(); / apply accumulated steering force Unitsi.Fa = Fs; Unitsi.Pa = Pfs; / end Flock AIvoid UpdateSimulation(void) double dt = _TIMESTEP; int i; / initialize the back buffer if(FrameCounter = _RENDER_FRAME_COUNT) ClearBa
17、ckBuffer(); DrawObstacles(); / Update player controlled unit: Units0.SetThrusters(false, false, 1); Units0.SetThrusters(false, false, 1); if (IsKeyDown(VK_RIGHT) Units0.SetThrusters(true, false, 0.5); if (IsKeyDown(VK_LEFT) Units0.SetThrusters(false, true, 0.5); Units0.UpdateBodyEuler(dt); if(FrameC
18、ounter = _RENDER_FRAME_COUNT) DrawCraft(Units0, RGB(0, 255, 0); if(Units0.vPosition.x _WINWIDTH) Units0.vPosition.x = 0; if(Units0.vPosition.x _WINHEIGHT) Units0.vPosition.y = 0; if(Units0.vPosition.y 0) Units0.vPosition.y = _WINHEIGHT; / update computer controlled units: for(i=1; i= _RENDER_FRAME_C
19、OUNT) if(Unitsi.Leader) DrawCraft(Unitsi, RGB(255,0,0); else if(Unitsi.Interceptor) DrawCraft(Unitsi, RGB(255,0,255); else DrawCraft(Unitsi, RGB(0,0,255); if(Unitsi.vPosition.x _WINWIDTH) Unitsi.vPosition.x = 0; if(Unitsi.vPosition.x _WINHEIGHT) Unitsi.vPosition.y = 0; if(Unitsi.vPosition.y = _RENDE
20、R_FRAME_COUNT) CopyBackBufferToWindow(); FrameCounter = 0; else FrameCounter+;void DrawCraft(RigidBody2D craft, COLORREF clr) Vector vList5; double wd, lg; int i; Vector v1; wd = craft.fWidth; lg = craft.fLength; vList0.y = lg/2; vList0.x = wd/2; vList1.y = -lg/2; vList1.x = wd/2; vList2.y = -lg/2; vList2.x = -wd/2; vList3.y = lg/2; vList3.x = -wd/2; vList4.y = lg/2*1.5; vList4.x = 0; for(i=0; i5; i+) v1 = VRotate2D(craft.fOrientation, vListi); vListi = v1 + craft.vPosition; DrawLine(vLi
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1