




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、游戏人工智能实验报告记录四作者:日期:实验四 有限状态机实验实验报告一、实验目的通过蚂蚁世界实验掌握游戏中追有限状态机算法二、实验仪器Windows7 系统Microsoft Visual Studio 2015三、实验原理及过程1)制作菜单设置参数:点击会弹出对话框,设置一些参数,红、黑蚂蚁的家会在地图上标记出来运行:设置好参数后点击运行,毒药、食物、水会在地图上随机显示下一步:2只红蚂蚁和2只黑蚂蚁会随机出现在地图上,窗口右方还会出现红、黑蚂蚁当前 数量的统计 不断按下一步,有限状态机就会不断运行,使蚁群产生变化2)添加加速键20资源视图中选择ID和键值3) 新建头文件def.h在 Ant
2、View.cpp 中加入 #include def.h与本实验有关的数据大都是在这里定义的int flag=O;#define kForage 1#define kGoHome 2#define kThirsty 3#define kDead 4#define kMaxEntities 200class ai_Entitypublic:int type;int state;int row;int col;ai_Entity();ai_Entity() void New (int theType,int theStatejnt theRowjnt theCol);void Forage();vo
3、id GoHome();void Thirsty();void Dead();ai_Entity entityListkMaxEntities;#define kRedAnt 1#define kBlackAnt 2 int RedHomeRow;int RedHomeCol;int BlackHomeRow;int BlackHomeCol;int RedNum=2;int BlackNum=2;/地图大小,可改变#define kMaxRows 30#define kMaxCols 40#define LENGTH 20int terrainkMaxRowskMaxCols;#define
4、 kGround 1#define kWater 2#define kBlackHome 3#define kRedHome 4#define kPoison 5#define kFood 6/ai_Entity类中函数的定义ai_Entity:ai_Entity()type=0;state=0;row=0;col=0;int Rnd(int min, int max)/ 不能产生负数int result;doresult=rand()%max;while (result=min);return result;void ai_Entity:New ( int theType,int theSt
5、atejnt theRow,int theCol) type=theType; row=theRow; col=theCol; state=theState;void ai_Entity:Forage()int rowMove;int colMove;int newRow;int newCol;int foodRow;int foodCol;int poisonRow;int poisonCol;rowMove=Rnd(-1,3)-1;colMove=Rnd(-1,3)-1;newRow=row+rowMove; newCol=col+colMove;if (newRow0)return;if
6、 (newCol=kMaxRows) return;if (newCol=kMaxCols) return;if (terrainnewRownewCol=kGround)|(terrainnewRownewCol=kWater) row=newRow;col=newCol;if (terrainnewRownewCol=kFood)row=newRow;col=newCol;terrainrowcol=kGround;state=kGoHome;dofoodRow=Rnd(-1,kMaxRows); foodCol=Rnd(-1,kMaxCols); while (terrainfoodRo
7、wfoodCol!=kGround); terrainfoodRowfoodCol=kFood;if (terrainnewRownewCol=kPoison)row=newRow;col=newCol;terrainrowcol=kGround;state=kDead;dopoisonRow=Rnd(-1,kMaxRows); poisonCol=Rnd(-1,kMaxCols); while (terrainpoisonRowpoisonCol!=kGround); terrainpoisonRowpoisonCol=kPoison;void ai_Entity:GoHome()int r
8、owMove;int colMove;int newRow;int newCol;int homeRow;int homeCol;int poisonRow;int poisonCol;int i;if (type=kRedAnt)homeRow=RedHomeRow;homeCol=RedHomeCol;elsehomeRow=BlackHomeRow; homeCol=BlackHomeCol;if (rowvhomeRow)rowMove=1;else if(rowhomeRow)*rowMove=-1;elserowMove=0;if (colvhomeCol)colMove=1;el
9、se if(colhomeCol)colMove=-1;elsecolMove=0;newRow=row+rowMove;newCol=col+colMove;if (newRow0)return;if (newCol=kMaxRows)return;if (newCol=kMaxCols)return;if (terrainnewRownewCol!=kPoison)row=newRow;col=newCol;elserow=newRow;col=newCol;terrainrowcol=kGround;state=kDead;dopoisonRow=Rnd(-1,kMaxRows); po
10、isonCol=Rnd(-1,kMaxCols); while (terrainpoisonRowpoisonCol!=kGround); terrainpoisonRowpoisonCol=kPoison;if (newRow=homeRow )&( newCol=homeCol)row=newRow;col=newCol;state=kThirsty;for(i=0;ikMaxEntities;i+)if(entityListi.type=O)entityListi.New(type,kForage,homeRow,homeCol);if (type=kRedAnt)RedNum+;if
11、(type=kBlackAnt)BlackNum+;break;void ai_Entity:Thirsty()int rowMove;int colMove;int newRow;int newCol;int foodRow;int foodCol;int poisonRow;int poisonCol;rowMove=Rnd(-1,3)-1;colMove=Rnd(-1,3)-1;newRow=row+rowMove;newCol=col+colMove;if (newRow0)return;if (newCol=kMaxRows)return;if (newCol=kMaxCols)re
12、turn;if (terrainnewRownewCol=kGround)|(terrainnewRownewCol=kFood)row=newRow;col=newCol;if (terrainnewRownewCol=kWater)row=newRow;col=newCol;terrainrowcol=kGround;state=kForage;dofoodRow=Rnd(-1,kMaxRows); foodCol=Rnd(-1,kMaxCols); while (terrainfoodRowfoodCol!=kGround); terrainfoodRowfoodCol=kWater;i
13、f (terrainnewRownewCol=kPoison)row=newRow;col=newCol;terrainrowcol=kGround;state=kDead;dopoisonRow=Rnd(-1,kMaxRows); poisonCol=Rnd(-1,kMaxCols); while (terrainpoisonRowpoisonCol!=kGround); terrainpoisonRowpoisonCol=kPoison; void ai_Entity:Dead()if (type=kRedAnt)RedNum-;if (type=kBlackAnt)BlackNum-;
14、type=0;4)制作对话框添加资源,拖动控件9个静态文本框,7个编辑框右键对话框添加类InputDIg,添加成员变量int m_RedHomeRow;int m_RedHomeCol;int m_BlackHomeRow;int m_BlackHomeCol;int m_food;int m_water;int m_poison;在 AntView.cpp 中加入 #include InputDlg.h5) 对菜单项添加事件给CAntView类添加一些成员变量没做说明都是添加到CAntView类,没做说明都是COMMAND事件CAntView的成员变量,刷新窗口设置参数:点击出现对话框,输入
15、值,确定后赋给void CAntView:OnData() / TODO:在此添加命令处理程序代码InputDlg dlg;if(dlg.DoModal()=IDOK)RedHomeRow=kRedHomeRow=dlg.m_RedHomeRow;RedHomeCol=kRedHomeCol=dlg.m_RedHomeCol;BlackHomeRow=kBlackHomeRow=dlg.m_BlackHomeRow;BlackHomeCol=kBlackHomeCol=dlg.m_BlackHomeCol;kMaxWater=dlg.m_water;kMaxFood=dlg.m_food;kM
16、axPoison=dlg.m_poison;if (kRedHomeRow=kMaxRows|kBlackHomeRow=kMaxRows|kRedHomeCol=kMaxCols|kBlackHomeCol=kMaxCols |kRedHomeRow0|kBlackHomeRowv0|kRedHomeCol0|kBlackHomeColv0 |kRedHomeRow=kBlackHomeRow&kRedHomeCol=kBlackHomeCol)AfxMessageBox(L 输入坐标不合法,请重新输入!”);return;flag=1;Invalidate。;运行:初始化数组,随机生成毒药
17、、事物、水,刷新窗口void CAntView:OnRun()/ TODO:在此添加命令处理程序代码if(flag=0)AfxMessageBox(L 还未设置蚂蚁家的位置!”);return ;if(flag!=1)return ;int i,j;for(i=0;ikMaxRows;i+)for (j=0;jkMaxCols;j+)terrainij=kGround;terrainkRedHomeRowkRedHomeCol=kRedHome;terrainkBlackHomeRowkBlackHomeCol=kBlackHome;srand(time(NULL); /取系统时间为随机种子i
18、nt r,c;for(i=0;ikMaxWater;i+)r=Rnd(-1,kMaxRows);c=Rnd(-1,kMaxCols);if (terrainrc=kGround)terrainrc=kWater;elsefor(i=0;ikMaxPoison;i+)r=Rnd(-1,kMaxRows);c=Rnd(-1,kMaxCols);if (terrainrc=kGround)terrainrc=kPoison;elsei-;for(i=0;ikMaxFood;i+)r=Rnd(-1,kMaxRows);c=Rnd(-1,kMaxCols);if (terrainrc=kGround)t
19、errainrc=kFood;elsei-;flag=2;Invalidate。;下一步:有限状态机的核心代码,刷新窗口void CAntView:OnNext()/ TODO:在此添加命令处理程序代码if(flag=2)/kGround才能新建int x,y;for(int i=0;i2;i+)x=Rnd(-1,kMaxCols);y=Rnd(-1,kMaxRows);if(terrainyx=kGround)entityListi.New(kRedAnt,kForage,y,x);elsei-;for(int i=2;i4;i+)x=Rnd(-1,kMaxCols);y=Rnd(-1,kM
20、axRows); if(terrainyx=kGround) entityListi.New(kBlackAnt,kForage,y,x);elsei-;flag=3;elsefor(int i=O;ikMaxEntities;i+)switch (entityListi.state)case kForage:entityListi.Forage();break;case kGoHome:entityListi.GoHome();break;case kThirsty:entityListi.Thirsty();break;case kDead:entityListi.Dead();break
21、;default:break;Invalidate();6) On Draw 函数flag是标志变量,便于控制绘图void CAn tView:O nDraw(CDC* pDC)CAntDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);if (!pDoc)return;/ TODO:在此处为本机数据添加绘制代码int i,j;/绘制网格for(i=O;iMoveTo(O,i); pDC-LineTo(LENGTH*kMaxCols,i); for(i=O;iMoveTo(i,O);pDC-LineTo(i ,L ENGTH*kMaxRows);/画岀红
22、黑房子if(flag=1)pDC-TextOutW(kBlackHomeCol*LENGTH+1,kBlackHomeRow*LENGTH+1 ,L H); pDC-SetTextColor(RGB(255,0,0);pDC-TextOutW(kRedHomeCol*LENGTH+1,kRedHomeRow*LENGTH+1 ,L H); pDC-SetTextColor(RGB(0,0,0);if(flag=2)遍历数组在相应位置显示图片(水滴、骷髅、苹果) CDC deMemory;dcMemory.CreateCompatibleDC(pDC);CBitmap bmp1,bmp2,bmp
23、3;BITMAP bmplnfo1,bmplnfo2,bmplnfo3;bmp1.LoadBitmapW(IDB_BITMAP1);bmp1.GetBitmap(&bmplnfo1);bmp2.LoadBitmapW(IDB_BITMAP2);bmp2.GetBitmap(&bmpInfo2);bmp3.LoadBitmapW(IDB_BITMAP3);bmp3.GetBitmap(&bmpInfo3);CBitmap *pOldBitmap=dcMemory.SelectObject(&bmp1);for(i=0;ikMaxRows;i+)for (j=0;jStretchBlt(j*LEN
24、GTH+1,i*LENGTH+1,19,19, &dcMemory,0,0,bmplnfo1.bmWidth,bmplnfo1.bmHeight,SRCCOPY);else if(terrainij=kPoison)dcMemory.SelectObject(&bmp2);pDC-StretchBlt(j*LENGTH+1,i*LENGTH+1,19,19, &dcMemory,0,0,bmplnfo2.bmWidth,bmplnfo2.bmHeight,SRCCOPY);else if(terrainij=kFood)dcMemory.SelectObject(&bmp3);pDC-Stre
25、tchBlt(j*LENGTH+1,i*LENGTH+1,18,18, &dcMemory,0,0,bmplnfo3.bmWidth,bmplnfo3.bmHeight,SRCCOPY); dcMemory.SelectObject(pOldBitmap);if(flag=3) 绘制蚂蚁CDC deMemory;dcMemory.CreateCompatibleDC(pDC);CBitmap bmp1,bmp2;BlTMAP bmplnfo1,bmplnfo2;bmp1.LoadBitmapW(IDB_BITMAP4);bmp1.GetBitmap(&bmplnfo1);bmp2.LoadBi
26、tmapW(IDB_BITMAP5);bmp2.GetBitmap(&bmplnfo2);CBitmap *pOldBitmap=dcMemory.SelectObject(&bmp1);for(i=0;iStretchBlt(entityListi.col*LENGTH+1,entityListi.row*LENGTH+1,19,19, &dcMemory,0,0,bmpInfo1.bmWidth,bmp Info1.bmHeight,SRCCOPY);if(entityListi.type=kBlackAnt)dcMemory.SelectObject(&bmp2);pDC-Stretch
27、Blt(entityListi.col*LENGTH+1,entityListi.row*LENGTH+1,19,19, &dcMemory,0,0,bmplnfo2.bmWidth,bmplnfo2.bmHeight,SRCCOPY);dcMemory.SelectObject(pOldBitmap);CString s;s.Format(_T(红蚂蚁数:%d 黑蚂蚁数:%d),RedNum,BlackNum); /输出当前蚂蚁数pDC-TextOutW(43*LENGTH,0,s);四、实验结果运行:点击菜单项,设置参数,弹出对话框如果设置参数不对:(房子坐标越界、红黑房子坐标相等、食物毒
28、物水数为负数)点击运行或F5,食物毒物水出现:KM点击下一步或F10,蚂蚁和文字出现:多次点击下一步,蚂蚁数改变:21K珑48怕- ?30可以多次点击下一步设置的参数不同蚂蚁的繁殖情况不同。比如,食物多,繁殖快,毒物多,蚂蚁可能很快就灭 绝了EiF 旳 血VK|0 Qt口 b口斑五、实验心得通过有限状态机实现蚂蚁的繁殖,很有趣的一个实验,通过此次实验能增加AI和MFC的知识,程序还有很多需要改进的地方。比如,有时候不按指定的顺序点击菜单将会出现小 错误;def.h里的东西太杂,可以新建cpp文件,整理进去。六、主要代码实验过程中已经列出主要代码,这里再列出与有限状态机算法有关的代码ai_Ent
29、ity:ai_Entity()type=O;state=O;row=0;col=0;int Rnd(int min, int max)/ 不能产生负数int result;doresult=rand()%max;while (result=min);return result;void ai_Entity:New ( int theType,int theStatejnt theRow,int theCol) type=theType; row=theRow; col=theCol; state=theState;void ai_Entity:Forage()int rowMove;int c
30、olMove;int newRow;int newCol;int foodRow;int foodCol;int poisonRow;int poisonCol;rowMove=Rnd(-1,3)-1;colMove=Rnd(-1,3)-1;newRow=row+rowMove; newCol=col+colMove;if (newRow0)return;if (newCol=kMaxRows) return;if (newCol=kMaxCols) return;if (terrainnewRownewCol=kGround)|(terrainnewRownewCol=kWater) row
31、=newRow;col=newCol;if (terrainnewRownewCol=kFood)row=newRow;col=newCol;terrainrowcol=kGround;state=kGoHome;dofoodRow=Rnd(-1,kMaxRows); foodCol=Rnd(-1,kMaxCols); while (terrainfoodRowfoodCol!=kGround); terrainfoodRowfoodCol=kFood;if (terrainnewRownewCol=kPoison)row=newRow;col=newCol;terrainrowcol=kGr
32、ound;state=kDead;dopoisonRow=Rnd(-1,kMaxRows); poisonCol=Rnd(-1,kMaxCols); while (terrainpoisonRowpoisonCol!=kGround); terrainpoisonRowpoisonCol=kPoison;void ai_Entity:GoHome()int rowMove;int colMove;int newRow;int newCol;int homeRow;int homeCol;int poisonRow;int poisonCol;int i;if (type=kRedAnt)hom
33、eRow=RedHomeRow;homeCol=RedHomeCol;elsehomeRow=BlackHomeRow; homeCol=BlackHomeCol;if (rowhomeRow)rowMove=-1;elserowMove=0;if (colvhomeCol)colMove=1;else if(colhomeCol)colMove=-1;elsecolMove=0;newRow=row+rowMove;newCol=col+colMove;if (newRow0)return;if (newCol=kMaxRows)return;if (newCol=kMaxCols)retu
34、rn;if (terrainnewRownewCol!=kPoison)row=newRow;col=newCol;elserow=newRow;col=newCol;terrainrowcol=kGround;state=kDead;dopoisonRow=Rnd(-1,kMaxRows); poisonCol=Rnd(-1,kMaxCols); while (terrainpoisonRowpoisonCol!=kGround); terrainpoisonRowpoisonCol=kPoison;if (newRow=homeRow )&( newCol=homeCol)row=newR
35、ow;col=newCol;state=kThirsty;for(i=0;ikMaxEntities;i+)if(entityListi.type=O)entityListi.New(type,kForage,homeRow,homeCol); if (type=kRedAnt)RedNum+;if (type=kBlackAnt)BlackNum+;break;void ai_Entity:Thirsty()int rowMove;int colMove;int newRow;int newCol;int foodRow;int foodCol;int poisonRow;int poisonCol;rowMove=Rnd(-1,3)-1;colMove=Rnd(-1,3)-1;newRow=row+rowMove; newCol=col+colMove;if (newRow0)return;if (newCol=kMaxRows)return;if (newCol=kMaxCols
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年野营炊具项目可行性研究报告
- 2025年触倒30%乳油项目可行性研究报告
- 2025年缝纫机拉筒项目可行性研究报告
- 2025年空压机电磁阀项目可行性研究报告
- 2025年甲虫电子变压器项目可行性研究报告
- 绿色智能科技园区建设可行性研究报告
- 2025年汽车防盗系统项目可行性研究报告
- 某年度珠江帝景营销推广方案
- 2025公司级安全培训考试试题A卷
- 2025年推式隔离柱项目可行性研究报告
- 第四章通道内非耦合层流的
- 供水管网施工组织设计
- 最全的冷轧知识材质牌号分类及生产工艺
- 易制毒、易制爆化学品安全培训
- 异面直线所成的角与求法
- 信息安全风险评估培训(课堂PPT)
- 气化风机检修工艺规程
- 美女金喜善写真集
- 大学物理平面电磁波ppt课件
- 八年级下写字课
- 前列腺癌临床路径(最全版)
评论
0/150
提交评论