




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、游戲人工智能實驗報告記錄四作者:日期:實驗四 有限狀態(tài)機實驗實驗報告一、實驗?zāi)康耐ㄟ^螞蟻世界實驗掌握游戲中追有限狀態(tài)機算法二、實驗儀器Windows7 系統(tǒng)Microsoft Visual Studio 2015三、實驗原理及過程1)制作菜單設(shè)置參數(shù):點擊會彈出對話框,設(shè)置一些參數(shù),紅、黑螞蟻的家會在地圖上標記出來運行:設(shè)置好參數(shù)后點擊運行,毒藥、食物、水會在地圖上隨機顯示下一步:2只紅螞蟻和2只黑螞蟻會隨機出現(xiàn)在地圖上,窗口右方還會出現(xiàn)紅、黑螞蟻當(dāng)前 數(shù)量的統(tǒng)計 不斷按下一步,有限狀態(tài)機就會不斷運行,使蟻群產(chǎn)生變化2)添加加速鍵20資源視圖中選擇ID和鍵值3) 新建頭文件def.h在 Ant
2、View.cpp 中加入 #include def.h與本實驗有關(guān)的數(shù)據(jù)大都是在這里定義的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類中函數(shù)的定義ai_Entity:ai_Entity()type=0;state=0;row=0;col=0;int Rnd(int min, int max)/ 不能產(chǎn)生負數(shù)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個靜態(tài)文本框,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的成員變量,刷新窗口設(shè)置參數(shù):點擊出現(xiàn)對話框,輸入
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。;運行:初始化數(shù)組,隨機生成毒藥
17、、事物、水,刷新窗口void CAntView:OnRun()/ TODO:在此添加命令處理程序代碼if(flag=0)AfxMessageBox(L 還未設(shè)置螞蟻家的位置!”);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); /取系統(tǒng)時間為隨機種子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。;下一步:有限狀態(tài)機的核心代碼,刷新窗口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 函數(shù)flag是標志變量,便于控制繪圖void CAn tView:O nDraw(CDC* pDC)CAntDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);if (!pDoc)return;/ TODO:在此處為本機數(shù)據(jù)添加繪制代碼int i,j;/繪制網(wǎng)格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)遍歷數(shù)組在相應(yīng)位置顯示圖片(水滴、骷髏、蘋果) 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(紅螞蟻數(shù):%d 黑螞蟻數(shù):%d),RedNum,BlackNum); /輸出當(dāng)前螞蟻數(shù)pDC-TextOutW(43*LENGTH,0,s);四、實驗結(jié)果運行:點擊菜單項,設(shè)置參數(shù),彈出對話框如果設(shè)置參數(shù)不對:(房子坐標越界、紅黑房子坐標相等、食物毒
28、物水?dāng)?shù)為負數(shù))點擊運行或F5,食物毒物水出現(xiàn):KM點擊下一步或F10,螞蟻和文字出現(xiàn):多次點擊下一步,螞蟻數(shù)改變:21K瓏48怕- ?30可以多次點擊下一步設(shè)置的參數(shù)不同螞蟻的繁殖情況不同。比如,食物多,繁殖快,毒物多,螞蟻可能很快就滅 絕了EiF 旳 血VK|0 Qt口 b口斑五、實驗心得通過有限狀態(tài)機實現(xiàn)螞蟻的繁殖,很有趣的一個實驗,通過此次實驗?zāi)茉黾覣I和MFC的知識,程序還有很多需要改進的地方。比如,有時候不按指定的順序點擊菜單將會出現(xiàn)小 錯誤;def.h里的東西太雜,可以新建cpp文件,整理進去。六、主要代碼實驗過程中已經(jīng)列出主要代碼,這里再列出與有限狀態(tài)機算法有關(guān)的代碼ai_Ent
29、ity:ai_Entity()type=O;state=O;row=0;col=0;int Rnd(int min, int max)/ 不能產(chǎn)生負數(shù)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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高頻軸項目可行性研究報告
- 2025年青銅復(fù)合粉項目可行性研究報告
- 2025至2030年中國無機不燃玻璃鋼風(fēng)管數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國數(shù)碼型三目正置式金相顯微鏡數(shù)據(jù)監(jiān)測研究報告
- 國外買賣合同范本
- 疫情終止合同范本
- 雇車送貨合同范本
- 2025至2030年中國青粘谷子數(shù)據(jù)監(jiān)測研究報告
- 給風(fēng)機行業(yè)深度研究報告
- 2025年汽車牌照識別系統(tǒng)項目可行性研究報告
- 《高級計量經(jīng)濟學(xué)》-上課講義課件
- 中國文化概論(第三版)全套課件
- 門窗安裝技術(shù)標投標書
- 新版手機開發(fā)項目流程圖
- 折彩粽的手工制作ppt公開課
- 主要工業(yè)產(chǎn)品統(tǒng)計指南
- 發(fā)證機關(guān)所在地區(qū)代碼表
- 建筑垃圾回收利用統(tǒng)計臺賬
- 《不一樣的你我他》(完美)課件
- 外研版一起點二年級下冊英語全冊課件
- XE82000--午山風(fēng)電場風(fēng)機定檢作業(yè)指導(dǎo)書
評論
0/150
提交評論