AI
来源:互联网 发布:linux和windows的优劣 编辑:程序博客网 时间:2024/06/10 17:38
void DFS(Object s[18][18],int book[18][18],int visit[18][18],int x,int y){ int a[]={-1,-2,0,0,1,2,0,0};//左下右上,每一次都是先一步再两步,然后换方向 int b[]={0,0,-1,-2,0,0,1,2}; int i,j,ok; for (i=1;i<=7;i++) { if (i%2==0)//如果是每一个方向的第一步 ok=1;//先默认好走,如果中间有东西挡着,到不了第二步,ok=0就不会执行下一个循环 if (x+a[i]>=1)&&(x+a[i]<=15)&&(y+b[i]>=1)&&(y+b[i]<=15)&&ok&&(!visit[x+a[i]][y+b[j]]) { if (s[x+a[i]][y+b[i]].type==blank) { book[x+[a[i]][y+b[i]]=0; visit[x+a[i]][y+b[i]]=1; } else if (s[x+a[i]][y+b[i]].type==BOMB) { book[x+a[i]][y+b[i]]=0; visit[x+a[i]][y+b[i]]=1; ok=0;//没有必要继续搜了 DFS(s,book,visit,x+a[i],y+b[i]); } else//除了炸弹和空地,其余情况该点无法到达第二步,但是也不用往下走了。 { visit[x+a[i]][y+b[i]]=1; book[x+a[i]][y+b[i]]=0; ok=0; } } }}void GetBloodGap(int id,Object s[18][18],Player p[PLAYER_NUM],Player p2[PLAYER_NUM],int BloodGap[3][3]){ int i,j; for (i=0;i<PLAYER_NUM;i++) for (j=0;j<PLAYER_NUM;j++) BloodGap[i][j]=p[i].life_value-p2[j]fe_value; if (s[1][6].home.group==id) BloodGap[i][j]=s[1][6].home.power-s[15][6].home.power; else BloodGap[i][j]=s[15][6].home.power-s[1][6].home.power;}int GetRestWood(Object s[18][18]){ int i,j,sum; sum=0; for (j=1;j<=15;j++) for (i=1;i<=15;i++) if (s[j][i].type==WOOD) sum++; return sum;}int GetRestTime(){ static int number;//记录当前是第几个回合 if ((number<0)||(number>=512)) number=1; else number=number+2; return 512-number;}void GetBook(Object s[18][18],int book[18][18])//GetBook{ int visit[18][18];//判断哪些点被访问过 int i,j; memset(visit,0,sizeof(visit));//将visit数组清零 for (j=1;j<=15;j++) for (i=1;i<=15;i++) if ((s[j][i].type==BOMB)&&(s[j][i].bomb.TTL==1)&&(!visit[j][i]))//如果是炸弹并且爆炸事件为1,并且没有被访问过 { book[j][i]=0; visit[j][i]=1; DFS(s,book,visit,i,j); } return;}int GetRestBomb(Player p[PLAYER_NUM],RestBomb[4])//是否可以换成炸弹数量之差{ int i; for (i=0;i<PLAYER_NUM;i++) RestBomb[i]=p[i].bomb_num;}void GetDistance(Object s[18][18],Player p[PLAYER_NUM],Player p2[PLAYER_NUM],int book[18][18],int id,int Distance[PLAYER_NUM][20])//先求到自己基地的距离,再求到别人基地的距离.{ typedef struct node { int x; int y; int step; }node; queue<node>q; int i,j,num; node start,temp1,temp2,end; int a[]={-1,1,0,0}; int b[]={0,0,1,-1}; int visit[18][18]; memset(visit,0,sizeof(visit)); num=0; for (i=0;i<3;i++) { start.x=p[i].pos.x; start.y=p[i].pos.y; start.step=0; q.push(start); if (s[1][6].home.group==id) { end.x=s[1][6].pos.x; end.y=s[1][6].pos.y; } else { end.x=s[15][6].pos.x; end.y=s[15][6].pos.y; } while(!q.empty()) { temp1=q.front(); q.pop(); if ((temp1.x==end.x)&&(temp2.x==end.y)) { Distance[num++]=temp1.step; break; } for (i=0;i<=3;i++) { if ((temp1.x+a[i]>=1)&&(temp1.x+a[i]<=15)&&(temp1.y+b[i]>=1)&&(temp1.y+b[i]<=15)&&(book[x+a[i]][y+b[i]])&&(!visit[x+a[i]][y+b[i]]))//如果符合范围,并且没有被爆炸所波及,并且没有被访问过 { visit[x+a[i]][y+b[i]]; temp2.x=temp1.x+a[i]; temp2.y=temp1.y+b[i]; temp2.step=temp1.step+1; q.push(temp2); } } } memset(visit,0,sizeof(visit)); } for (i=0;i<3;i++) { start.x=p[i].pos.x; start.y=p[i].pos.y; start.step=0; if (s[1][6].home.group==id) { end.x=s[15][6].pos.x; end.y=s[15][6].pos.y; } else { end.x=s[1][6].pos.x; end.y=s[1][6].pos.y; } q.push(start); while(!q.empty()) { temp1=q.front(); if ((temp1.x==end.x)&&(temp2.x==end.y)) { Distance[num++]=temp1.step; break; } for (i=0;i<=3;i++) { if ((temp1.x+a[i]>=1)&&(temp1.x+a[i]<=15)&&(temp1.y+b[i]>=1)&&(temp1.y+b[i]<=15)&&(book[x+a[i]][y+b[i]])&&(!visit[x+a[i]][y+b[i]]))//如果符合范围,并且没有被爆炸所波及,并且没有被访问过 { visit[x+a[i]][y+b[i]]; temp2.x=temp1.x+a[i]; temp2.y=temp1.y+b[i]; temp2.step=temp1.step+1; q.push(temp2); } } } memset(visit,0,sizeof(visit)); }}int DFS2(Object s,int x,int y,int visit){ int a[]={-1,-2,0,0,1,2,0,0}; int b[]={0,0,-1,-2,0,0,1,2}; int i,j,ok,sum; sum=0; for (i=0;i<=7;i++) { if (i%2==0) ok=1; if ((x+a[i]>=1)&&(x+a[i]<=15)&&(y+b[i]>=1)&&(y+b[i]<=15)&&ok&&(!visit[x+a[i]][y+b[i]])) { visit[x+a[i]][y+b[i]]=1; if (s[x+a[i]][y+b[i]].type==WOOD) { ok=0;//不可以继续往下走 sum++; } else if (s[x+a[i]][y+b[i]].type==BOMB) { sum=sum+DFS2(S,x+a[i],y+b[i],visit); } } } return sum;}void GetScoreGap(Object s,Player p[PLAYER_NUM],p2[PLAYER_NUM],int Scoregap,int id,int book[18][18]);//得到一步的得分差{ int i,j,sum1,sum2; int visit[18][18]; sum1,sum2=0; memset(visit,0,sizeof(visit)); for (j=1;j<=15;j++) for (i=1;i<=15;i++) if ((s[j][i].type==BOMB)&&(s[j][i].bomb.TTL==1)&&(!visit[j][i])) { visit[j][i]=1; if (s[i][j].bomb.host==id)//如果是我们家的 sum1=sum1+DFS2(s,i,j,visit); else sum2=sum2+DFS2(a,i,j,visit); } Scoregap=sum1-sum2;}void GetActiveRegion(Object s[18][18],Player p[PLAYER_NUM],int ActiveRegion[3],int book[18][18]){ int i,j,num; int x1; int y1; int a[]={-1,1,0,0,0}; int b[]={0,0,1,-1,0}; num=0; for (i=0;i<=2;i++) ActiveRegion[i]=0; for (i=0;i<3;i++) { x1=p[i].pos.x; y1=p[i].pos.y; num=0; for (i=0;i<=4;i++) { if ((x1+a[i]>=1)&&(x1+a[i]<=15)&&(y1+b[i]>=1)&&(y1+b[i]<=15)&&(book[x+a[i]][y+b[i]])) { ActiveRegion[num]++; } } num++; }}void ChangeMap(Object s[18][18],int book[18][18]){ int j,i; for (j=1;j<=15;j++) for (i=1;i<=15;i++) if (!book[j][i]) s[j][i].type=blank; else if ((s[j][i].type==BOMB)&&(s[j][i].bomb.TTL==2)) s[j][i].bomb.TTL=1;}void AI(const Game *game, Operator op[PLAYER_NUM])//所有的函数名均是在变量名前加Get{ int id=game->grpid;//队伍的编号 Player p[PLAYER_NUM]=game->group.player;//我们家的炸弹人 Player p2[PLAYER_NUM]=game->group.player;//对面家的炸弹人 Object s[18][18]=game->map;//当前AI地图 int book[18][18];//标记安全范围 int BloodGap[4][4];//血量差(计算公式我方某一个-对方某一个总血量),最后一个为基地血量差 int ScoreGap[3];//1,2步的得分差 int RestWood;//寻找当前剩余的木头 int ActiveRegion[3];//活动范围(与安全范围的区别是不仅安全且可到达) int Distance[3][6];//0,1,2为与自己家的距离,下标3,4,5为与别人家的距离 int RestBomb[4];//剩余炸弹 int RestTime;//剩余时间 int AccelerateBomb; for (j=1;j<=15;j++) for (i=1;i<=15;i++) book[j][i]=1;//初始化book数组,表示全部不会受炸弹影响 GetBook(s,book);//判断在下一步哪些格子是安全的(因为考虑炸弹的TTL为1) GetBloodGap(id,p,p2,BloodGap);//得到血量差 GetScoreGap(s,p,ScoreGap[1],id,book);//得到一步的得分差 RestWood=GetRestWood(s);//得到当前剩余的木头 GetActiveRegion(s,p,p2,ActiveRegion,id,book);//返回每一个点的可到达的地点 GetDistance(s,p,p2,book,id,Distance);//得到每一个点到老家和对面老家的距离 GetRestBomb(p,RestBomb);//返回每一个炸弹人剩余的炸弹 RestTime=GetRestTime();//返回剩余的时间 ChangeMap(s,book);//更改地图 memset(book,0,sizeof(book)); GetBook(s,book); GetScoreGap(s,p,ScoreGap[2],id,book); return;}
0 0
- AI
- ai
- ai
- AI
- ai
- ai
- ai
- ai
- ai
- ai
- ai
- AI
- AI
- ai...
- AI
- AI
- Ai
- AI
- androidstudio Error:(1, 1) 错误: 非法字符: '\ufeff' 解决办法
- android studio连接不上真机
- 常用纹理和纹理压缩格式
- Intellij idea搭建maven+springMVC开发项目(一)
- vi下如何删除当前行至后面所有的行
- AI
- const修饰的常量值 http://www.nowcoder.com/test/question/done?tid=2198842&qid=15952#summary
- 为什么用Yarn来做Docker容器调度引擎
- tuzicms二级导航栏目地址URL问题bug修复包
- STL源码——list sort:归并排序的非递归实现
- Remove Duplicate Letters
- [笔记] 大型网站技术架构——核心原理与案例分析 [六]
- linux环境变量配置
- ORM-对象关系映射