-游戏人工智能

上传人:痛*** 文档编号:155955493 上传时间:2022-09-25 格式:DOC 页数:10 大小:155.50KB
收藏 版权申诉 举报 下载
-游戏人工智能_第1页
第1页 / 共10页
-游戏人工智能_第2页
第2页 / 共10页
-游戏人工智能_第3页
第3页 / 共10页
资源描述:

《-游戏人工智能》由会员分享,可在线阅读,更多相关《-游戏人工智能(10页珍藏版)》请在装配图网上搜索。

1、六、有限状态机一、有限状态机原理及其模型原理:1、有限状态机的结构和类游戏软件AI结构class AIEntitypublic:int type;int state;int row;int column;int health;int strength;int intelligence;int magic;状态常量#define kRoam 1#define kEvade 2#define kAttack 3#define kHide 42、有限状态机行为及转换函数游戏软件AI转换函数class AIEntityPublic:int type;int state;int row;int colu

2、mn;int health;int strength;int intelligence;int magic;int armed;Boolean playerInRange();int checkHealth();改变状态if (checkHealth()kPoorHealth) & (playerlnRange()=false)state =kHide;else if (checkHealth() =60&!CanFindFood) gotoxy(1,MAXY+1); printf(Can not find food, maybe a block world.); WaitForKey(10)

3、; WorldInitial(); if(tu=180&home.amount=home.Target Food) gettime(&endtime); KeyPress = WaitForKey(60); DispPlayTime(); WaitForKey(10); WorldInitial(); else if(kbhit() KeyPress = getch(); DealKey(KeyPress); else KeyPress = NULL; while(KeyPress!=ESC); gettime(&endtime); DispPlayTime(); WaitForKey(10)

4、; clrscr(); ResetCur(); int MainTimer(void) static int oldhund,oldsec; struct time t; int timeuse; gettime(&t); timeuse = 0; if(t.ti_hund!=oldhund) if(t.ti_sec!=oldsec) timeuse+=100; oldsec = t.ti_sec; timeuse+=t.ti_hund-oldhund; oldhund = t.ti_hund; else timeuse = 0; return (timeuse);char WaitForKe

5、y(int secnum) int secin,secnow; int minin,minnow; int hourin,hournow; int secuse; struct time t; gettime(&t); secin = t.ti_sec; minin = t.ti_min; hourin = t.ti_hour; do if(kbhit() return(getch(); gettime(&t); secnow = t.ti_sec; minnow = t.ti_min; hournow = t.ti_hour; if(hournow!=hourin) minnow+=60;

6、if(minnowminin) secuse = (minnow-1-minin) + (secnow+60-secin); else secuse = secnow - secin; if(secuse0) gotoxy(1,MAXY+1); printf(Time conuting error, any keyto exit.); getch(); exit(3); while(secuse=secnum); return (NULL); void DispPlayTime(void) int ph,pm,ps; ph = endtime.ti_hour - starttime.ti_ho

7、ur; pm = endtime.ti_min - starttime.ti_min; ps = endtime.ti_sec - starttime.ti_sec; if(ph0) ph+=24; if(pm0) ph-; pm+=60; if(ps0) pm-; ps+=60; gotoxy(1,MAXY+1); printf(Time use: %d hour- %d min- %d sec ,ph,pm,ps);int TimeUse(void) int ph,pm,ps; gettime(&endtime); ph = endtime.ti_hour - starttime.ti_h

8、our; pm = endtime.ti_min - starttime.ti_min; ps = endtime.ti_sec - starttime.ti_sec; if(ph0) ph+=24; if(pm0) ph-; pm+=60; if(ps0) pm-; ps+=60; return(ps+(60*(pm+60*ph);void HideCur(void) union REGS regs0; regs0.h.ah=1; regs0.h.ch=0x30; regs0.h.cl=0x31; int86(0x10,®s0,®s0);void ResetCur(void) u

9、nion REGS regs0; regs0.h.ah=1; regs0.h.ch=0x06; regs0.h.cl=0x07; int86(0x10,®s0,®s0);void WorldInitial(void) int k,i,j; randomize(); clrscr(); HomeFoodInitial(); for(AntNow=0;AntNowMAX_ANT;AntNow+) AntInitial(); BlockInitial(); for(k=0;k=1;k+) for(i=0;i=MAXX;i+) for(j=0;j=MAXY;j+) Smellkij = 0

10、; SmellGoneTimer = 0; gettime(&starttime); SmellDispFlag = 0; CanFindFood = 0; HardtoFindPath = 0;void BlockInitial(void)int i,j; int bn; for(i=0;i=MAXX;i+)for(j=0;j=MAXY;j+) blockij = 0; bn = 1+ MAX_BLOCK/2 + random(MAX_BLOCK/2); for(i=0;iMAXX) x2 = MAXX; if(y2MAXY) y2 = MAXY;if(food.xxx=x1&food.xx

11、x=y1&food.yyy=x1&home.xxx=y1&home.yyy=y2) return; for(i=x1;i=x2;i+) for(j=y1;j=y2;j+) blockij = 1; gotoxy(i,j);putch(BLOCK_CHAR); void SaveBlock(void)FILE *fp_block;char FileNameBlock20;int i,j;gotoxy(1,MAXY+1); printf(); gotoxy(1,MAXY+1);printf(Save to file.,FileNameBlock);gets(FileNameBlock);if(Fi

12、leNameBlock0=0) strcpy(FileNameBlock,Ant.ant);elsestrcat(FileNameBlock,.ant);if (fp_block = fopen(FileNameBlock, wb) = NULL)gotoxy(1,MAXY+1); printf(Creat file %s fail.,FileNameBlock);getch();exit(2);gotoxy(1,MAXY+1); printf( ); fputc(home.xxx,fp_block);fputc(home.yyy,fp_block);fputc(food.xxx,fp_blo

13、ck);fputc(food.yyy,fp_block);for(i=0;i=MAXX;i+ for(j=0;j=MAXY;j+) fputc(blockij,fp_block);fclose(fp_block); void LoadBlock(void)FILE *fp_block;char FileNameBlock20;int i,j,k;gotoxy(1,MAXY+1); printf( ); gotoxy(1,MAXY+1);printf(Load file.,FileNameBlock);gets(FileNameBlock);if(FileNameBlock0=0) strcpy

14、(FileNameBlock,Ant.ant);else strcat(FileNameBlock,.ant);if (fp_block = fopen(FileNameBlock, rb) = NULL)gotoxy(1,MAXY+1); printf(Open file %s fail.,FileNameBlock);getch();exit(2);clrscr();home.xxx = fgetc(fp_block);home.yyy = fgetc(fp_block);food.xxx = fgetc(fp_block);food.yyy = fgetc(fp_block);gotox

15、y(home.xxx,home.yyy); putch(HOME_CHAR); gotoxy(food.xxx,food.yyy); putch(FOOD_CHAR); food.amount = random(MAX_FOOD/3)+2*MAX_FOOD/3+1; home.amount = 0; home.TargetFood = (food.amountTARGET_FOOD)?food.amount:TARGET_FOOD;for(AntNow=0;AntNowMAX_ANT;AntNow+) AntInitial();for(i=0;i=MAXX;i+) for(j=0;j=MAXY

16、;j+) blockij = fgetc(fp_block); if(blockij) gotoxy(i,j); putch(BLOCK_CHAR); for(k=0;k=1;k+) for(i=0;i=MAXX;i+) for(j=0;j=MAXY;j+) Smellkij = 0; SmellGoneTimer = 0; gettime(&starttime); SmellDispFlag = 0; CanFindFood = 0; HardtoFindPath = 0; fclose(fp_block); void HomeFoodInitial(void)int randnum; in

17、t homeplace; randnum = random(100); if(randnum=25&randnum=50&randnum75) homeplace = 3; else homeplace = 4; switch(homeplace) case 1: home.xxx = random(MAXX/3)+1;home.yyy = random(MAXY/3)+1;food.xxx = random(MAXX/3)+2*MAXX/3+1; food.yyy = random(MAXY/3)+2*MAXY/3+1; break;case 2: home.xxx = random(MAX

18、X/3)+1;home.yyy = random(MAXY/3)+2*MAXY/3+1; food.xxx = random(MAXX/3)+2*MAXX/3+1; food.yyy = random(MAXY/3)+1; break; case 3: home.xxx = random(MAXX/3)+2*MAXX/3+1; home.yyy = random(MAXY/3)+1; food.xxx = random(MAXX/3)+1; food.yyy = random(MAXY/3)+2*MAXY/3+1; break; case 4: home.xxx = random(MAXX/3

19、)+2*MAXX/3+1; home.yyy = random(MAXY/3)+2*MAXY/3+1; food.xxx = random(MAXX/3)+1; food.yyy = random(MAXY/3)+1; break; food.amount = random(MAX_FOOD/3)+2*MAX_FOOD/3+1; home.amount = 0; home.TargetFood = (food.amountTARGET_FOOD)?food.amount:TARGET_FOOD;if(home.xxxMAXX|home.yyyMAXY| food.xxxMAXX|food.yy

20、yMAXY| food.amount=0) gotoxy(1,MAXY+1); printf(World initial fail, any key to exit.); getch(); exit(2); gotoxy(home.xxx,home.yyy); putch(HOME_CHAR); gotoxy(food.xxx,food.yyy); putch(FOOD_CHAR);void AntInitial(void)/* initial antAntNow */ int randnum; int i; antAntNow.xxx = home.xxx; antAntNow.yyy =

21、home.yyy; randnum = random(100); if(randnum=25&randnum=50&randnum75) antAntNow.dir = LEFT; else antAntNow.dir = RIGHT; antAntNow.speed = 2*(random(INI_SPEED/2)+1); antAntNow.SpeedTimer = 0; antAntNow.food = 0; antAntNow.SmellAmountSMELL_TYPE_FOOD = 0; antAntNow.SmellAmountSMELL_TYPE_HOME = MAX_SMELL

22、; antAntNow.IQ = 1;for(i=0;i=SMELL_GONE_SPEED) SmellGoneTimer = 0; for(k=0;k=1;k+)for(i=1;i=MAXX;i+)for(j=1;j=30000|smelldisp9) putch(#); else putch(smelldisp+0); Smellkij-= 1+(Smellkij*SMELL_GONE_RATE); if(Smellkij0) Smellkij = 0; if(SmellDispFlag)if(Smellkij=2) gotoxy(i,j);putch(SPACE); void AntMo

23、ve(void)int antx,anty; int smelltodrop,smellnow;for(AntNow=0;AntNow=antAntNow.speed)antAntNow.SpeedTimer = 0;gotoxy(antAntNow.xxx,antAntNow.yyy); putch(SPACE); AntOneStep();gotoxy(antAntNow.xxx,antAntNow.yyy);if(AntNow=0) textcolor(0xd);if(antAntNow.food) putch(ANT_CHAR_FOOD); else putch(ANT_CHAR_EM

24、PTY); if(AntNow=0) textcolor(0x7);antAntNow.tracexantAntNow.TracePtr = antAntNow.xxx;antAntNow.traceyantAntNow.TracePtr = antAntNow.yyy;if(+(antAntNow.TracePtr)=TRACE_REMEMBER) antAntNow.TracePtr = 0; /* drop smell */ antx = antAntNow.xxx; anty = antAntNow.yyy; if(antAntNow.food) /* have food, looki

25、ng for home */ if(antAntNow.SmellAmountSMELL_TYPE_FOOD) smellnow = SmellSMELL_TYPE_FOODantxanty; smelltodrop = antAntNow.SmellAmountSMELL_TYPE_FOOD*SMELL_DROP_RATE; if(smelltodropsmellnow) SmellSMELL_TYPE_FOODantxanty = smelltodrop; /* else Smell. = smellnow */ antAntNow.SmellAmountSMELL_TYPE_FOOD-=

26、 smelltodrop; if(antAntNow.SmellAmountSMELL_TYPE_FOODsmellnow) SmellSMELL_TYPE_HOMEantxanty = smelltodrop; /* else Smell. = smellnow */ antAntNow.SmellAmountSMELL_TYPE_HOME-= smelltodrop; if(antAntNow.SmellAmountSMELL_TYPE_HOME0) putch(FOOD_CHAR); else putch(FOOD_CHAR2); textcolor(7); gotoxy(1,MAXY+

27、1); printf(Food %d, Home %d ,food.amount,home.amount);void AntOneStep(void) int ddir,tttx,ttty; int i; ddir = antAntNow.dir; tttx = antAntNow.xxx; ttty = antAntNow.yyy; ddir = AntNextDir(tttx,ttty,ddir); switch(ddir) case UP: ttty-; break; case DOWN: ttty+; break; case LEFT: tttx-; break; case RIGHT

28、: tttx+; break; default: break; /* of switch dir */ antAntNow.dir = ddir; antAntNow.xxx = tttx; antAntNow.yyy = ttty; if(antAntNow.food) /* this ant carry with food, search for home */ if(tttx=home.xxx&ttty=home.yyy) home.amount+; AntInitial(); if(tttx=food.xxx&ttty=food.yyy) antAntNow.SmellAmountSM

29、ELL_TYPE_FOOD = MAX_SMELL; /* of search for home */ else /* this ant is empty, search for food */ if(tttx=food.xxx&ttty=food.yyy) if(food.amount0) antAntNow.food = 1; food.amount-; antAntNow.SmellAmountSMELL_TYPE_FOOD = MAX_SMELL; antAntNow.SmellAmountSMELL_TYPE_HOME = 0; antAntNow.dir = TurnBack(an

30、tAntNow.dir); for(i=0;iTRACE_REMEMBER;i+) antAntNow.tracexi = 0; antAntNow.traceyi = 0; antAntNow.TracePtr = 0; CanFindFood = 1; /* of still have food */ if(tttx=home.xxx&ttty=home.yyy) antAntNow.SmellAmountSMELL_TYPE_HOME = MAX_SMELL; /* of search for food */void DealKey(char key) int i; switch(key

31、) case p: gettime(&endtime); DispPlayTime(); getch(); gotoxy(1,MAXY+1); for(i=1;i=MAXX-1;i+) putch(SPACE); break; case t: if(SmellDispFlag) SmellDispFlag=0; ClearSmellDisp(); else SmellDispFlag = 1; break; case 1: DispSmell(SMELL_TYPE_FOOD); getch(); ClearSmellDisp(); break; case 2: DispSmell(SMELL_

32、TYPE_HOME); getch(); ClearSmellDisp();break;case 3: DispSmell(2);getch(); ClearSmellDisp();break;case s: SaveBlock();break; case l: LoadBlock();break; default: gotoxy(1,MAXY+1); for(i=1;i=MAXX-1;i+) putch(SPACE); void ClearSmellDisp(void)int k,i,j; for(k=0;k=1;k+) for(i=1;i=MAXX;i+)for(j=1;j=MAXY;j+

33、) if(Smellkij) gotoxy(i,j); putch(SPACE); void DispSmell(int type) int k,i,j; int fromk,tok; int smelldisp; switch(type) case 0: fromk = 0; tok = 0; break; case 1: fromk = 1; tok = 1; break; case 2: fromk = 0; tok = 1; break; default:fromk = 0; tok = 1; break; SmellGoneTimer = 0; for(k=fromk;k=tok;k

34、+) /* SMELL TYPE FOOD and HOME */ for(i=1;i=MAXX;i+) for(j=1;j=30000|smelldisp9) putch(#); else putch(smelldisp+0); int AntNextDir(int xxx,int yyy,int ddir)int randnum; int testdir; int CanGoState; int cangof,cangol,cangor; int msf,msl,msr,maxms; int type; CanGoState = CanGo(xxx,yyy,ddir); if(CanGoState=0|CanGoState=2|CanGoState=3|CanGoState=6) cangof = 1; else cangof = 0; if(CanGoState=0|CanGoState=1|CanGoState=3|CanGoState=5) cangol = 1; else cangol = 0; if(CanGoState=0|CanGoState=1|CanGoState=2|CanGoState=4) cangor = 1; else cangor = 0; if(antAntNow.food)

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!