游戏人工智能实验报告二

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二聚集与避障

实验报告

一、实验目的

掌握游戏中聚集与避障的人工智能算法,理解宽视野和有限视野的区别

二、实验仪器

Windows 7系统

Microsoft Visual Studio2015

三、实验原理及过程

//描述聚集与避障的算法原理

//描述程序实现时的思路包括对每个调用的API进行详细说明

智能体只考虑哪些在检测盒内的障碍物。

初始的时候,要将游戏世界中所有的障碍物都迭代到内存中,并标记哪些在检测盒内的障碍物以作进一步分析,然后把所有已经标记的障碍物都转换到智能体的局部空间。

转换坐标后,那些x坐标为负值的物体将不被考虑,所以问题就变得简单多了,接下来必须要检测障碍物是否和检测盒重叠。使障碍物的包围半径扩大检测盒宽度的一半。然后测试该障碍物的y值是否小于这个值(即障碍物的包围半径加上检测盒宽度的一半)。

此时,只剩下那些与检测盒相交的障碍物了。

接下来我们找出离智能体最近的相交点。

再一次在局部空间中计算,第三步中扩大了障碍物的包围半径。

用简单的线圆周相交测试方法可以得到被扩大的圈和x轴的相交点。

四、实验结果

五、实验心得(需包括有何不足如何改进)

//你认为目前的聚集与避障有什么不足之处,如何改进

目前的聚集与避障的不足之处在于:

可能会因为错误的方案设计而搞错导致路线的躲闪。

还有就是从实验2开始,我的电脑本身出现了COMCTL32.LIB文件LINK的错误,后来在同学的帮助下我解决了这个问题。

如何改进:

实验前必须要经过精确的计算并且代码不能出现任何错误。

把COMCTL32.LIB文件载入文件以让程序正确运行。

六、主要代码

#include"main.h"

#include"time.h"

//---------------------------------------------------------------------------

/*

Book: AI for Game Developers

Authors: David M. Bourg & Glenn Seemann

Example: Flocking, Chapter 4

*/

//---------------------------------------------------------------------------

#define_TIMESTEP 0.0025

#define_TOL 1e-10

#define_FWDTIME 10

#define_THRUSTFACTOR 1.0

#define _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_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;

GetRandomNumber(0, _WINWIDTH, true);

for(i=0; i<_MAX_NUM_UNITS; i++)

{

Units[i].fMass = 10;

Units[i].fInertia = 10;

Units[i].fInertiaInverse = 1/10;

Units[i].vPosition.x = GetRandomNumber(_WINWIDTH/2-_SPAWN_AREA_R, _WINWIDTH/2+_SPAWN_AREA_R, false);

Units[i].vPosition.y = GetRandomNumber(_WINHEIGHT/2-_SPAWN_AREA_R, _WINHEIGHT/2+_SPAWN_AREA_R, false);

Units[i].fWidth = _UNIT_LENGTH/2;

Units[i].fLength = _UNIT_LENGTH;

Units[i].fHeight = _UNIT_LENGTH;

Units[i].fOrientation = GetRandomNumber(0, 360, false);

Units[i].CD.y = -0.12*Units[i].fLength; Units[i].CD.x = 0.0f; // coordinates of the body center of drag

Units[i].CT.y = -0.50*Units[i].fLength; Units[i].CT.x = 0.0f; // coordinates of the propeller thrust vector

Units[i].CPT.y = 0.5*Units[i].fLength; Units[i].CPT.x = -0.5*Units[i].fWidth; // coordinates of the port bow thruster

Units[i].CST.y = 0.5*Units[i].fLength; Units[i].CST.x = 0.5*Units[i].fWidth; // coordinates of the starboard bow thruster

Units[i].ProjectedArea = (Units[i].fLength + Units[i].fWidth) * Units[i].fHeight;

Units[i].Leader = false;

if(i>_MAX_NUM_UNITS/2)

{

Units[i].Interceptor = true;

Units[i].ThrustForce = _THRUSTFORCE*1.5f;

} else {

Units[i].Interceptor = false;

Units[i].ThrustForce = _THRUSTFORCE;

}

}

for(i=0; i<_NUM_OBSTACLES; i++)

{

相关文档
最新文档