ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:58.21KB ,
资源ID:7027621      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7027621.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(游戏人工智能实验报告材料二.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

游戏人工智能实验报告材料二.docx

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