欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:3878362       资源大小:58.17KB        全文页数:21页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    游戏人工智能实验报告二.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#define

    5、 _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; GetRa

    6、ndomNumber(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_RADI

    7、US*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 | Limited

    8、View | 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)*_BACK

    9、_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 = Unit

    10、sj.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.v

    11、Velocity; 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 = U

    14、nits0.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 += m

    16、 * _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) ClearBack

    17、Buffer(); 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(FrameCou

    18、nter = _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_COU

    19、NT) 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 = _RENDER_

    20、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;


    注意事项

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

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开