游戏人工智能 有限状态机的实验报告

合集下载

实验3有限状态机

实验3有限状态机
对收集到的数据进行深入分析,以了解有限状态机的表现和优缺点。例如,我们可以分析不同输入下有限状态机的响 应时间、内存占用情况等,以便更好地理解其性能特点。
结果评估
根据实验目标和数据分析结果,对实现的有限状态机进行评估。评估指标可以包括功能完整性、性能效 率、可扩展性等。通过评估,我们可以了解实现的效果如何,以及需要改进的地方。
与流程图的区别
流程图描述的是一系列的决策和转移, 而有限状态机强调的是系统的状态和 状态之间的转换。
与数据结构模型的区别
与模拟器的区别
模拟器用于模拟系统的行为,而有限 状态机是一种用于描述系统行为的计 算模型。
有限状态机不仅关注数据结构,更关 注状态之间的转移逻辑和行为。
02 有限状态机的实现方式
THANKS FOR WATCHING
感谢您的观看
不足
在实验过程中,我们发现自己在有限状态机的设计和实现上还存在一些不足之处。例如,在状态转移逻辑的设计 上,我们有时会忽略一些重要的状态转移条件,导致程序运行结果不正确。此外,在代码实现方面,我们也存在 一些语法错误和逻辑错误,需要进一步加强代码审查和测试。
对未来研究的建议与展望
要点一
建议
为了进一步提高有限状态机的应用效果和性能,我们建议 在未来的研究中,可以从以下几个方面进行改进。首先, 深入研究有限状态机的设计方法和技巧,提高状态转移逻 辑的准确性和可靠性。其次,加强有限状态机的测试和验 证,及时发现和修复程序中的错误和问题。最后,探索有 限状态机在其他领域的应用,如人工智能、游戏开发等。
04 实验结果与讨论
结果展示
状态转移图
根据实验数据,绘制了有限状态机的状态转移图, 清晰地展示了各个状态之间的转移关系。

人工智能实训报告

人工智能实训报告

人工智能实训报告《人工智能实训报告》一、初识人工智能,像打开魔法盒的好奇“哇塞,老师说我们要开始人工智能实训啦!这就像是要打开一个装满魔法的盒子一样。

”我兴奋地对同桌说。

记得那是一个阳光明媚的早晨,教室里的窗帘被风吹得轻轻飘动。

老师抱着一堆关于人工智能的资料走进来,同学们都伸长了脖子张望。

当老师提到人工智能这个词的时候,我脑海里瞬间浮现出科幻电影里那些超级智能的机器人。

同桌眼睛亮晶晶的,凑过来小声说:“你说我们会不会做出像电影里一样厉害的东西呀?”我毫不犹豫地回答:“肯定会的,这肯定超级有趣。

”就像我们在期待一场神秘的冒险,充满了未知的惊喜。

这时候的人工智能在我心里,就像是一个充满无限可能的宝藏,等着我们去挖掘。

二、编程中的迷茫,像迷失在迷宫里的小老鼠“哎呀,这编程怎么这么难啊!我感觉自己像一只迷失在迷宫里的小老鼠。

”我沮丧地跟小组伙伴抱怨。

那天下午,教室里的气氛格外沉闷。

我们坐在电脑前,面对着满屏幕的代码,眼睛都花了。

我敲了几行代码,结果运行的时候总是出错。

我皱着眉头,眼睛死死地盯着屏幕,试图找出问题所在。

小组伙伴在旁边也着急,他说:“你看这里,这个变量是不是定义错了?”我看了看,还是一头雾水。

“我怎么感觉这代码就像一团乱麻,根本理不清。

”我叹了口气。

旁边的另一个同学也说:“我觉得我们就像在黑暗里摸索,根本不知道哪里是出口。

”我们都有点垂头丧气,这时候的人工智能编程就像一座难以翻越的大山,让我们不知所措。

三、小突破的惊喜,像在黑暗中看到一丝曙光“哈哈,我找到问题所在了!这感觉就像在黑暗中突然看到了一丝曙光。

”我兴奋地大喊。

那是一个有点闷热的傍晚,教室里只有我们小组还在奋战。

我一遍又一遍地检查代码,突然发现是一个符号用错了。

当我改正这个错误,程序成功运行出结果的时候,我简直要跳起来了。

小组伙伴们也围了过来,脸上都洋溢着惊喜的笑容。

一个同学说:“哇,你可太厉害了。

这就像在绝望的时候突然有人给了我们希望一样。

魏泽涛—人工智能实验报告

魏泽涛—人工智能实验报告

H a r b i n I n s t i t u t e o f T e c h n o l o g y a t W e i h a i人工智能实验报告设计题目:智能五子棋院系:计算机科学与技术学院班级:0604104学号:060410408设计者:XXX哈尔滨工业大学(威海)一.实验内容用程序实现五子棋人机对弈二.题目介绍五子棋是一种爱大众广泛喜爱的游戏.其规则简单,变化多端,非常富有趣味性和消遣性。

这里设计和地了一小人机对下的五子程序采用了博弈甜的方法,应用了剪枝和最大最小树原理进行搜索发现最好的下子位置。

介绍五子棋程序的数据结构.评分规则、胜负判断方法和搜索算法过程。

三.实验原理1.评分规则对于下子的重要性评分,需要从六个位置来考虑当前棋局的情况,分别为,&brvbar ;实际上需要考虑在这六个位置上某一方所形成的子的布局的情况,对于在还没有子的地方落子以后的当前局面的分,主要是为了说明在这个地方下子的重要性程度,设定了一个简单的规则来表示当前棋面对电脑方的分数。

2.胜负判断实际上,是根据当前最后一个落f的情况来判断雌负的。

实际上需要从四个位置判断,以该子为出发点的水半,直和两条分别为45度角和 1 3 5 度角的线¨的是看在这四个方向是否最后落子的----方构成连续五个的棋子,如果是的话,就表示该盘棋局已经分出胜负。

3.搜索算法实现描述人机对弈算法:人机对弈算法完全按照CGame基类定义的接口标准,封装在了COneGame派生类之中。

下面将对这个算法进行详细地介绍。

[14]1获胜组合获胜组合是一个三维数组,它记录了所有取胜的情况。

也就是说,参考于CTable::Win中的情况,对于每一个落子坐标,获胜的组合一共有15 * 11 * 2 + 11 * 11 * 2 = 572种。

而对于每个坐标的获胜组合,应该设置一个[15][15][572]大小的三维数组。

在拥有了这些获胜组合之后,就可以参照每个坐标的572种组合给自己的局面和玩家的局面进行打分,也就是根据当前盘面中某一方所拥有的获胜组合多少进行权值的估算,给出最有利于自己的一步落子坐标。

人工智能-实验报告-

人工智能-实验报告-

人工智能实验报告班级:数媒081学号:108028017姓名:徐浩2010-2011学年第1学期实验名称实验一XNA编程基础课时安排7课时实验要求掌握XNA游戏基本运行框架,二维纹理绘制,三维模型绘制的代码实现方法。

实验核心代码:protected override void Initialize(){base.Initialize();Viewport vp = graphics.GraphicsDevice.Viewport;//窗口大小规定spotlightPosition.X = vp.X + vp.Width / 2;spotlightPosition.Y = vp.Y + vp.Height / 2;//光的位置设定catPosition.X = vp.X + vp.Width / 4;catPosition.Y = vp.Y + vp.Height / 2;}protected override void Update(GameTime gameTime){HandleInput();// clamp the cat's position so that it stays on the screen.Viewport vp = graphics.GraphicsDevice.Viewport;catPosition.X = MathHelper.Clamp(catPosition.X, vp.X, vp.X + vp.Width);catPosition.Y = MathHelper.Clamp(catPosition.Y, vp.Y, vp.Y + vp.Height);// use the TurnToFace function to update the spotlightAngle to face// towards the cat.spotlightAngle = TurnToFace(spotlightPosition, catPosition, spotlightAngle, SpotlightTurnSpeed);base.Update(gameTime);}private static float TurnToFace(Vector2 position, Vector2 faceThis,float currentAngle, float turnSpeed){// consider this diagram:// C// /|// / |// / | y// / o |// S--------// x//// where S is the position of the spot light, C is the position of the cat, // and "o" is the angle that the spot light should be facing in order to // point at the cat. we need to know what o is. using trig, we know that // tan(theta) = opposite / adjacent// tan(o) = y / x// if we take the arctan of both sides of this equation...// arctan( tan(o) ) = arctan( y / x )// o = arctan( y / x )// so, we can use x and y to find o, our "desiredAngle."// x and y are just the differences in position between the two objects. float x = faceThis.X - position.X;float y = faceThis.Y - position.Y;float desiredAngle = (float)Math.Atan2(y, x);float difference = WrapAngle(desiredAngle - currentAngle);// clamp that between -turnSpeed and turnSpeed.difference = MathHelper.Clamp(difference, -turnSpeed, turnSpeed);// so, the closest we can get to our target is currentAngle + difference. // return that, using WrapAngle again.return WrapAngle(currentAngle + difference);}实验心得:通过这个实验初步了解了xna的几个主要函数的功能,比如Update,Draw函数。

人工智能实验报告四

人工智能实验报告四

人工智能实验报告四在当今科技飞速发展的时代,人工智能已经成为了引领创新和变革的重要力量。

本次实验旨在深入探究人工智能在特定领域的应用和表现,以期为未来的研究和实践提供有价值的参考。

实验的背景是随着数据量的爆炸式增长和计算能力的大幅提升,人工智能技术在图像识别、自然语言处理、智能推荐等领域取得了显著的成果。

然而,其在某些复杂场景下的性能和可靠性仍有待进一步提高。

实验的目标主要有两个:一是评估某个人工智能模型在处理特定任务时的准确性和效率;二是分析该模型在不同参数设置下的表现差异,寻找最优的配置方案。

为了实现上述目标,我们首先进行了充分的实验准备工作。

收集了大量相关的数据集,并对其进行了预处理,包括数据清洗、标注和划分。

同时,确定了实验所需的硬件和软件环境,确保实验的顺利进行。

在实验过程中,我们采用了多种技术手段和方法。

例如,运用了深度学习中的卷积神经网络(CNN)来处理图像数据,利用循环神经网络(RNN)及其变体长短时记忆网络(LSTM)来处理序列数据。

此外,还尝试了不同的优化算法,如随机梯度下降(SGD)、Adagrad、Adadelta 等,以提高模型的训练速度和收敛效果。

通过一系列的实验,我们得到了丰富的实验结果。

在准确性方面,模型在某些任务上的表现达到了较高的水平,但在一些复杂和模糊的情况下仍存在一定的误判。

效率方面,不同的模型结构和参数设置对训练时间和推理速度产生了明显的影响。

进一步分析实验结果发现,数据的质量和数量对模型的性能起着至关重要的作用。

高质量、大规模的数据能够显著提升模型的泛化能力和准确性。

同时,模型的超参数调整也是一个关键环节,合适的学习率、层数、节点数等参数能够有效提高模型的性能。

然而,实验中也遇到了一些问题和挑战。

例如,模型的过拟合现象时有发生,导致在新数据上的表现不佳。

此外,计算资源的限制也在一定程度上影响了实验的规模和效率。

针对这些问题,我们提出了相应的改进措施和建议。

人工智能游戏可行性分析报告

人工智能游戏可行性分析报告

人工智能游戏可行性分析报告随着人工智能技术的飞速发展,人们对于将其应用于各个领域的探索也越来越深入。

其中,人工智能在游戏领域的应用备受关注,一些游戏开发者开始尝试利用人工智能技术来提升游戏的交互性、挑战性和趣味性。

本报告将对人工智能游戏的可行性进行深入分析。

首先,人工智能在游戏中的应用有着无限的潜力。

通过人工智能算法,游戏可以实现更加智能化的敌人设计,使得游戏难度能够根据玩家的水平自适应调整,增加游戏的趣味性和挑战性。

此外,人工智能还能够帮助游戏开发者设计更加真实的角色行为模式,使得游戏中的NPC角色更具生命力和逼真感。

通过运用人工智能技术,游戏可以实现更加智能的对话系统和情感识别,提升玩家的游戏体验。

其次,人工智能游戏在技术上是可行的。

目前,人工智能技术已经取得了长足的进步,包括深度学习、强化学习、自然语言处理等技术在游戏开发中都可以得到应用。

游戏开发者可以借助开源的人工智能框架和工具,如TensorFlow、PyTorch等,来快速实现对人工智能的集成。

同时,云计算和大数据技术的发展也为人工智能游戏提供了强大的计算和存储支持,保障了游戏的流畅性和稳定性。

再次,人工智能游戏在商业上具有广阔的前景。

随着玩家对游戏品质和体验要求的不断提升,引入人工智能技术可以使游戏更加个性化、智能化,从而提高玩家的粘性和满意度。

一些研究机构数据表明,采用了人工智能技术的游戏往往会有更高的用户留存率和付费转化率,为游戏开发者带来丰厚的商业回报。

总结而言,人工智能游戏具备可行性,不仅在技术上得到了有力支持,而且在商业上具有广阔的前景。

游戏开发者应当密切关注人工智能技术的发展趋势,积极探索人工智能在游戏中的应用方式,不断创新,为玩家带来更为优质和智能化的游戏体验,从而赢得市场和用户的青睐。

愿本报告对您有所启发,谢谢!。

实验五 有限状态机实验总结报告

实验五 有限状态机实验总结报告

实验五有限状态机实验总结报告0800220229 吴健伟第8周星期三第5大节一.实验目的:本次实验通过verilog硬件描述语言编写摩尔型有限状态机和米勒型有限状态机,掌握采用有限状态机产生各种控制信号的原理,熟悉如何选用合适的有限状态机进行电路设计,通过实验进一步了解原理图编辑方法和仿真方法。

二实验内容和步骤:1.利用verilog语言,设计一个采用摩尔型有限状态机实现的流水灯控制程序;源程序如下:module sled(clk,led);input clk;output[7:0]led;reg[7:0]led;reg[2:0]state;parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101,s6=3'b110,s7=3'b111;always @(posedge clk)case(state)s0:begin state<=s1;led<=8'b00000001;ends1:begin state<=s2;led<=8'b00000010;ends2:begin state<=s3;led<=8'b00000100;ends3:begin state<=s4;led<=8'b00001000;ends4:begin state<=s5;led<=8'b00010000;ends5:begin state<=s6;led<=8'b00100000;ends6:begin state<=s7;led<=8'b01000000;ends7:begin state<=s0;led<=8'b10000000;endendcaseendmodule仿真后的波形如下图所示:2.利用verilog语言,设计一个采用米勒型有限状态机实现的串行口发送程序;源程序如下图所示:module s_tx(clk,en,dain,txd);input clk,en;input[7:0] dain;output txd;reg[7:0] da_temp;reg txd;reg[3:0] state;parameter swait=4'b0000,star=4'b0001,s1=4'b0010,s2=4'b0011,s3=4'b0100,s4=4'b0101,s5=4'b0110,s6=4'b0111,s7=4'b1000,s8=4'b1001,stop=4'b1010;always@(posedge en)da_temp<=dain;always @(posedge clk)if(!en)beginstate<=swait;txd<=1;endelsecase(state)swait:begin state<=star;txd<=1;endstar:begin state<=s1;txd<=0;ends1:begin state<=s2;txd<=da_temp[7];ends2:begin state<=s3;txd<=da_temp[6];ends3:begin state<=s4;txd<=da_temp[5];ends4:begin state<=s5;txd<=da_temp[4];ends5:begin state<=s6;txd<=da_temp[3];ends6:begin state<=s7;txd<=da_temp[2];ends7:begin state<=s8;txd<=da_temp[1];ends8:begin state<=stop;txd<=da_temp[0];endstop:begin state<=stop;txd<=1;endendcaseendmodule3.利用verilog语言,设计一个采用米勒型有限状态机实现的串行口接受程序;源程序如下图所示:module s_rx(clk, dain,daout);input clk,dain;output[7:0] daout;reg[7:0] daout;reg[7:0] da_temp;reg[3:0] state;parameter star =4'b0000,s1=4'b0010,s2=4'b0011,s3=4'b0100,s4=4'b0101,s5=4'b0110,s6=4'b0111,s7=4'b1000,s8=4'b1001,stop=4'b1010;always@(negedge clk)case(state);star: if(dain)state<=star;elsestate<=s1;s1:begin state<=s2;da_temp[7]<=dain;ends2:begin state<=s3;da_temp[6] <=dain;ends3:begin state<=s4;da_temp[5] <=dain;ends4:begin state<=s5;da_temp[4] <=dain;ends5:begin state<=s6;da_temp[3] <=dain;ends6:begin state<=s7;da_temp[2] <=dain;ends7:begin state<=s8;da_temp[1] <=dain;ends8:begin state<=stop;da_temp[0] <=dain;endstop: if(!dain)state<=stop;elsebeginstate<=star;daout<=da_temp;endendcaseendmodule4.利用原理图编辑方法,将串行口发送和接受模块进行连接,实现完整的串行通信电路,并对电路进行仿真。

游戏人工智能实验报告二

游戏人工智能实验报告二

实验二聚集与避障实验报告一、实验目的掌握游戏中聚集与避障的人工智能算法,理解宽视野和有限视野的区别二、实验仪器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 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 _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 dragUnits[i].CT.y = -0.50*Units[i].fLength; Units[i].CT.x = 0.0f; // coordinates of the propeller thrust vectorUnits[i].CPT.y = 0.5*Units[i].fLength; Units[i].CPT.x = -0.5*Units[i].fWidth; // coordinates of the port bow thrusterUnits[i].CST.y = 0.5*Units[i].fLength; Units[i].CST.x = 0.5*Units[i].fWidth; // coordinates of the starboard bow thrusterUnits[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++){Obstacles[i].x = GetRandomNumber(_OBSTACLE_RADIUS*4, _WINWIDTH-_OBSTACLE_RADIUS*4, false);Obstacles[i].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 || LimitedView || NarrowView;int RadiusFactor;// begin Flock AIFs.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 = Units[i].fLength / 2.0f;Nf = 0;for(j=1; j<_MAX_NUM_UNITS; j++){if(i!=j){InView = false;d = Units[j].vPosition - Units[i].vPosition;w = VRotate2D(-Units[i].fOrientation, d);if(((w.y > 0) && (fabs(w.x) < fabs(w.y)*_FRONT_VIEW_ANGLE_FACTOR)))if(d.Magnitude() <= (Units[i].fLength * _NARROWVIEW_RADIUS_FACTOR))Nf++;if(WideView){InView = ((w.y > 0) || ((w.y < 0) && (fabs(w.x) > fabs(w.y)*_BACK_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 && (Units[i].Interceptor == Units[j].Interceptor)){if(d.Magnitude() <= (Units[i].fLength * RadiusFactor)){Pave += Units[j].vPosition;Vave += Units[j].vVelocity;N++;}}// Separation Rule:if(InView)//(w.y > 0) || ((w.y < 0) && (fabs(w.x) > fabs(w.y)*_BACK_VIEW_ANGLE_FACTOR))) {if(d.Magnitude() <= (Units[i].fLength * _SEPARATION_FACTOR)){if(w.x < 0) m = 1;if(w.x > 0) m = -1;Fs.x += m*_STEERINGFORCE * (Units[i].fLength * _SEPARATION_FACTOR) / d.Magnitude();}}}}// Cohesion Rule:if(DoFlock && (N > 0)){Pave = Pave / N;v = Units[i].vVelocity;v.Normalize();u = Pave - Units[i].vPosition;u.Normalize();w = VRotate2D(-Units[i].fOrientation, u);if(w.x < 0) m = -1;if(w.x > 0) m = 1;if(fabs(v*u) < 1.0f)Fs.x += m * _STEERINGFORCE * acos(v * u) / pi; }// Alignment Rule:if(DoFlock && (N > 0)){Vave = Vave / N;u = Vave;u.Normalize();v = Units[i].vVelocity;v.Normalize();w = VRotate2D(-Units[i].fOrientation, u);if(w.x < 0) m = -1;if(w.x > 0) m = 1;if(fabs(v*u) < 1)Fs.x += m * _STEERINGFORCE * acos(v * u) / pi; }// Chase the target if the unit is a leaderif(Chase){if(Nf == 0)Units[i].Leader = true;elseUnits[i].Leader = false;if((Units[i].Leader || !DoFlock)){if(!Units[i].Interceptor){// Chaseu = Units[0].vPosition;d = u - Units[i].vPosition;w = VRotate2D(-Units[i].fOrientation, d);if(w.x < 0) m = -1;if(w.x > 0) m = 1;Fs.x += m*_STEERINGFORCE;} else {// InterceptVector s1, s2, s12;double tClose;Vector Vr12;Vr12 = Units[0].vVelocity-Units[i].vVelocity; // closing velocitys12 = Units[0].vPosition - Units[i].vPosition; // range to closetClose = s12.Magnitude() / Vr12.Magnitude(); // time to closes1 = Units[0].vPosition + (Units[0].vVelocity * tClose);Target = s1;s2 = s1 - Units[i].vPosition;w = VRotate2D(-Units[i].fOrientation, s2);if(w.x < 0) m = -1;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 = Units[i].vVelocity;u.Normalize();v = u * _COLLISION_VISIBILITY_FACTOR * Units[i].fLength;a = Obstacles[j] - Units[i].vPosition;p = (a * u) * u;b = p - a;if((b.Magnitude() < _OBSTACLE_RADIUS) && (p.Magnitude() < v.Magnitude())){// impending collision...steer awayw = VRotate2D(-Units[i].fOrientation, a);w.Normalize();if(w.x < 0) m = 1;if(w.x > 0) m = -1;Fs.x += m * _STEERINGFORCE * (_COLLISION_VISIBILITY_FACTOR *Units[i].fLength)/a.Magnitude();}}// apply accumulated steering forceUnits[i].Fa = Fs;Units[i].Pa = Pfs;// end Flock AI}void UpdateSimulation(void){double dt = _TIMESTEP;int i;// initialize the back bufferif(FrameCounter >= _RENDER_FRAME_COUNT){ClearBackBuffer();DrawObstacles();}// Update player controlled unit:Units[0].SetThrusters(false, false, 1);Units[0].SetThrusters(false, false, 1);if (IsKeyDown(VK_RIGHT))Units[0].SetThrusters(true, false, 0.5);if (IsKeyDown(VK_LEFT))Units[0].SetThrusters(false, true, 0.5);Units[0].UpdateBodyEuler(dt);if(FrameCounter >= _RENDER_FRAME_COUNT)DrawCraft(Units[0], RGB(0, 255, 0));if(Units[0].vPosition.x > _WINWIDTH) Units[0].vPosition.x = 0;if(Units[0].vPosition.x < 0) Units[0].vPosition.x = _WINWIDTH;if(Units[0].vPosition.y > _WINHEIGHT) Units[0].vPosition.y = 0;if(Units[0].vPosition.y < 0) Units[0].vPosition.y = _WINHEIGHT;// update computer controlled units:for(i=1; i<_MAX_NUM_UNITS; i++){DoUnitAI(i);if(FrameCounter >= _RENDER_FRAME_COUNT){if(Units[i].Leader)DrawCraft(Units[i], RGB(255,0,0));else {if(Units[i].Interceptor)DrawCraft(Units[i], RGB(255,0,255));elseDrawCraft(Units[i], RGB(0,0,255));}}if(Units[i].vPosition.x > _WINWIDTH) Units[i].vPosition.x = 0;if(Units[i].vPosition.x < 0) Units[i].vPosition.x = _WINWIDTH;if(Units[i].vPosition.y > _WINHEIGHT) Units[i].vPosition.y = 0;if(Units[i].vPosition.y < 0) Units[i].vPosition.y = _WINHEIGHT;} // end i-loopif(FrameCounter >= _RENDER_FRAME_COUNT) {CopyBackBufferToWindow();FrameCounter = 0;} elseFrameCounter++;}void DrawCraft(RigidBody2D craft, COLORREF clr){Vector vList[5];double wd, lg;int i;Vector v1;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; i<5; 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){Vector v, u;double f = 0.025;// Show velocity vectors in greenDrawLine(craft.vPosition.x, craft.vPosition.y, craft.vPosition.x+craft.vVelocity.x, craft.vPosition.y+craft.vVelocity.y, 3, RGB(0,255,0));// Show force vectors in black// thrust vectorv.x = 0;v.y = craft.ThrustForce*f;v = VRotate2D(craft.fOrientation, v);u.x = craft.CT.x;u.y = craft.CT.y;u = VRotate2D(craft.fOrientation, u);DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0));// port steering forcev.x = craft.PThrust.x*f;v.y = craft.PThrust.y*f;v = VRotate2D(craft.fOrientation, v);u.x = craft.CPT.x;u.y = craft.CPT.y;u = VRotate2D(craft.fOrientation, u);DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0));// stbd steering forcev.x = craft.SThrust.x*f;v.y = craft.SThrust.y*f;v = VRotate2D(craft.fOrientation, v);u.x = craft.CST.x;u.y = craft.CST.y;u = VRotate2D(craft.fOrientation, u);DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0));// applied forcev.x = craft.Fa.x*f;v.y = craft.Fa.y*f;v = VRotate2D(craft.fOrientation, v);u.x = craft.Pa.x;u.y = craft.Pa.y;u = VRotate2D(craft.fOrientation, u);DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x,craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0));}}void DrawObstacles(void){int i;RECT r;int radius = _OBSTACLE_RADIUS/2;for(i=0; i<_NUM_OBSTACLES; i++){SetRect(&r, Obstacles[i].x - radius, Obstacles[i].y - radius, Obstacles[i].x + radius, Obstacles[i].y + radius);DrawEllipse(&r, 2, RGB(255,0,0));}}/*void DoAttractCraft2(void){// Apply Leonard-Jones potential force to Craft2// todo: make sure rigidbody calcloads function handles itVector r = Craft2.vPosition - Craft1.vPosition;Vector u = r;u.Normalize();double k1 = 0.5e2; // repeldouble k2 = 1.0e2; // attractk2*pow(Craft2.fLength*3/r.Magnitude(), 2)) ) * u);Craft2.Pa.x = 0;Craft2.Pa.y = Craft2.fLength / 2;Target = Craft1.vPosition;}*/int GetRandomNumber(int min, int max, bool seed) {int number;if(seed)srand( (unsigned)time( NULL ) );number = (((abs(rand())%(max-min+1))+min));if(number>max)number = max;if(number<min)number = min;return number;}。

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

实验三:有限状态机姓名:廖远东班级:数媒2 学号:E10700217一、实验目的掌握有限状态机的原理,并会使用有限状态机,要求能编程序实现一个案例如书上蚁群世界。

.二、实验仪器linux 下的codeblock三、主要代码ant.h:#ifndef ANT_H_INCLUDED#define ANT_H_INCLUDED#define kGround 1#define kWater 2#define kBlackHome 3#define kRedHome 4#define kPoison 5#define kFood 6#define kMaxWater 15#define kMaxPoison 8#define kMaxFood 20#define kRedHomeRow 5#define kRedHomeCol 5#define kBlackHomeRow 5#define kBlackHomeCol 36// entities#define kMaxEntities 30#define kRedAnt 1#define kBlackAnt 2#define kTree 3#define kPlayerSpeed 4// entity states#define kForage 1#define kGoHome 2 #define kGuard 3#define kThirsty 4#define kDead 5//#define kChaseDistance 7//#define kMaxPathLength 200// world constants#define kMaxRows 30 #define kMaxCols 10 //#define kMaxTiles 10// world constants//#define kUpKey 1 //#define kDownKey 2 //#define kLeftKey 3//#define kRightKey 4class a i_Entity{public:int type;int state;int row;int col;//unsigned long timeToMove;ai_Entity();~ai_Entity();void Forage(void);void GoHome(void);void Thirsty(void);void Dead(void);void New(int theType, int theState, int theRow, int theCol);int DistanceFrom(int t);};class a i_World{public:ai_World();~ai_World();void UpdateWorld(void);};#endif // ANT_H_INCLUDEDant.cpp#include "ant.h"//#include<cstdlib.h>#include<stdlib.h>#include<time.h>ai_World MainWorld;ai_Entity entityList[kMaxEntities];int terrainBackup[kMaxRows][kMaxCols]; int terrain[kMaxRows][kMaxCols];ai_Entity::ai_Entity(){int i;for (i=0;i<kMaxEntities;i++){entityList[i].row=0;entityList[i].col=0;entityList[i].type=0;entityList[i].state=0;}/* for (i=0;i<KBegEnt;i++){entityList[i].New(kRedAnt,)}*/entityList[0].New(kRedAnt,kForage,5,5);entityList[1].New(kRedAnt,kForage,8,5);entityList[2].New(kBlackAnt,kForage,5,36);entityList[3].New(kBlackAnt,kForage,8,36);}// ----------------------------------------------------------------- //ai_Entity::~ai_Entity()// ----------------------------------------------------------------- //{}// ----------------------------------------------------------------- //void ai_Entity::Forage(void)// ----------------------------------------------------------------- //{int rowMove;int colMove;int newRow;int newCol;int foodRow;int foodCol;int poisonRow;int poisonCol;rowMove=rand()%3-1;colMove=rand()%3-1;newRow=row+rowMove;newCol=col+colMove;if (newRow<1) return;if (newCol<1) return;if (newRow>=kMaxRows-1) return;if (newCol>=kMaxCols-1) return;if ((terrain[newRow][newCol]==kGround) || (terrain[newRow][newCol]==kWater)) {row=newRow;col=newCol;if (terrain[newRow][newCol]==kFood){row=newRow;col=newCol;terrain[row][col]=kGround;state=kGoHome;do {/////////////////////please makesure about the begin and the end//////////foodRow=rand()%(kMaxRows-3)+1;foodCol=rand()%(kMaxCols-3)+1;} while (terrain[foodRow][foodCol]!=kGround);terrain[foodRow][foodCol]=kFood;}if (terrain[newRow][newCol]==kPoison){row=newRow;col=newCol;terrain[row][col]=kGround;state=kDead;do {poisonRow=rand()%(kMaxRows-3)+1;poisonCol=rand()%(kMaxCols-3)+1;} while (terrain[poisonRow][poisonCol]!=kGround);terrain[poisonRow][poisonCol]=kPoison;}}// ----------------------------------------------------------------- //void ai_Entity::Dead(void)// ----------------------------------------------------------------- //{type=0;row=0;col=0;state=0;}// ----------------------------------------------------------------- //void ai_Entity::Thirsty(void)// ----------------------------------------------------------------- //int rowMove;int colMove;int newRow;int newCol;int foodRow;int foodCol;int poisonRow;int poisonCol;rowMove=rand()%3-1;colMove=rand()%3-1;newRow=row+rowMove;newCol=col+colMove;if (newRow<1) return;if (newCol<1) return;if (newRow>=kMaxRows-1) return;if (newCol>=kMaxCols-1) return;if ((terrain[newRow][newCol]==kGround) || (terrain[newRow][newCol]==kFood)) {row=newRow;col=newCol;}if (terrain[newRow][newCol]==kWater){row=newRow;col=newCol;terrain[row][col]=kGround;state=kForage;do {foodRow=rand()%(kMaxRows-3)+1;;foodCol=rand()%(kMaxCols-3)+1;} while (terrain[foodRow][foodCol]!=kGround);terrain[foodRow][foodCol]=kWater;}if (terrain[newRow][newCol]==kPoison){row=newRow;col=newCol;state=kDead;do {poisonRow=rand()%(kMaxRows-3)+1;poisonCol=rand()%(kMaxCols-3)+1;} while (terrain[poisonRow][poisonCol]!=kGround);terrain[poisonRow][poisonCol]=kPoison;}}// ----------------------------------------------------------------- //void ai_Entity::GoHome(void)// ----------------------------------------------------------------- //{int rowMove;int colMove;int newRow;int newCol;int homeRow;int homeCol;int i;int poisonRow;int poisonCol;if (type==kRedAnt){homeRow=kRedHomeRow;homeCol=kRedHomeCol;}else{homeRow=kBlackHomeRow;homeCol=kBlackHomeCol;}if (row<homeRow)rowMove=1;else if (row>homeRow)rowMove=-1;elseif (col<homeCol)colMove=1;else if (col>homeCol)colMove=-1;elsecolMove=0;newRow=row+rowMove;newCol=col+colMove;if (newRow<1) return;if (newCol<1) return;if (newRow>=kMaxRows-1) return;if (newCol>=kMaxCols-1) return;if (terrain[newRow][newCol]!=kPoison){row=newRow;col=newCol;}else{row=newRow;col=newCol;terrain[row][col]=kGround;state=kDead;do {poisonRow=rand()%(kMaxRows-3)+1;poisonCol=rand()%(kMaxCols-3)+1;} while (terrain[poisonRow][poisonCol]!=kGround);terrain[poisonRow][poisonCol]=kPoison;}if ((newRow==homeRow) && (newCol==homeCol)) {row=newRow;col=newCol;state=kThirsty;for (i=0;i<kMaxEntities;i++)if (entityList[i].type==0){entityList[i].row=homeRow;entityList[i].col=homeCol;entityList[i].type=type;break;}}}// ----------------------------------------------------------------- //// ----------------------------------------------------------------- //void ai_Entity::New(int theType, int theState, int theRow, int theCol)// ----------------------------------------------------------------- //{type=theType;row=theRow;col=theCol;state=theState;}// ----------------------------------------------------------------- //ai_World::ai_World()// ----------------------------------------------------------------- //{int i;int j;for (i=0;i<kMaxRows;i++)for (j=0;j<kMaxCols;j++){terrain[i][j]=kGround;}terrain[kRedHomeRow][kRedHomeCol]=kRedHome;terrain[kBlackHomeRow][kBlackHomeCol]=kBlackHome;for (i=0;i<kMaxWater;i++)terrain[rand()%(kMaxRows-3)+1][rand()%(kMaxCols-3)+1]=kWater;for (i=0;i<kMaxPoison;i++)terrain[rand()%(kMaxRows-3)+1][rand()%(kMaxCols-3)+1]=kPoison;terrain[rand()%(kMaxRows-3)+1][rand()%(kMaxCols-3)+1]=kFood;//for (i=0;i<kMaxRows;i++)// for (j=0;j<kMaxCols;j++)// terrainBackup[i][j]=terrain[i][j];}// ----------------------------------------------------------------- //ai_World::~ai_World()// ----------------------------------------------------------------- //{}// ----------------------------------------------------------------- //void ai_World::UpdateWorld(void)// ----------------------------------------------------------------- //{int i;for (i=0;i<kMaxEntities;i++){switch (entityList[i].state){case kForage:entityList[i].Forage();break;case kGoHome:entityList[i].GoHome();break;case kThirsty:entityList[i].Thirsty();break;case kDead:entityList[i].Dead();break;}}main.cpp#include <iostream>#include "ant.cpp"#include "ant.h"using namespace std;int main(){int again;do{int terrain2[kMaxRows][kMaxCols]={0};int row,col;cout<<"this is the blackground,and 1->Ground 2->Water 3->BlackHome 4->redhome 5->poision 6->food"<<endl;for(int i=1;i<kMaxCols;i++){for(int j=1;j<kMaxRows;j++){cout<<terrain[i][j];}cout<<endl;}cout<<"this is the ant location "<<endl;for(int i=0;i<kMaxEntities;i++){if(entityList[i].state!=kDead)row=entityList[i].row;col=entityList[i].col;terrain2[row][col]++;}for(int f=1;f<kMaxCols;f++){for(int j=1;j<kMaxRows;j++){cout<<terrain2[f][j];}cout<<endl;}cout<<"if you want to again ,please input the 1"<<endl;cin>>again;MainWorld.UpdateWorld();}while(again==1);}四、实验结果四、实验心得书上的代码抄死人了。

相关文档
最新文档