坦克大战(tankcraft)AI源代码


#include "Tank.h" #include <string.h> #include <stdlib.h> #include <time.h> #include <queue> #include <cassert> #define CLOCKS_PER_SEC ((clock_t)1000) clock_t start,finish; //请勿修改以上头文件 /* 您可以在这里添加您所需头文件 */ /* 您可以在这里添加您的自定义函数 */ //平台0回合时调用此函数获取AI名称及坦克类型信息,请勿修改此函数声明。 #include<iostream> #define INF 500000 #define MY 450 using namespace std; int d[100][100],tankID[10],PtankID[10]; int nearest_friend[10],Pnearest_friend[10]; int match[20],ans_match[20],ans,Pans,Pans_match[20],Pmatch[20]; int get_hurt[23][23],make_hurt[23][23]; int dd[23][23][23][23]; int stop[11]; bool is_added[30]; Point Fire_at[20]; int tot_Fire; bool no_way_out[23][23]; bool used[20],Pused[20]; bool visited[23][23]; bool is_see[23][23]; int weight[23][23]; struct direction { int x,y; OrderType type; }; struct pt { int x,y,dist; bool operator <(const pt &rhs) const { if (dist>rhs.dist) return true; else return false; } }; direction dir[7]; Order tp[5]; int sc_aimed[30]; int tp_now,sc_num,Psc_num; int dist[20][20],l,Pdist[20][20]; DataForAI dt,predt,dt_now,temp_dt; //GOUP,GODOWN,GOLEFT,GORIGHT extern "C" InitiateInfo chooseType() { int i; dir[0].x=-1;dir[0].y=0;dir[0].type=GOUP; dir[1].x=1;dir[1].y=0;dir[1].type=GODOWN; dir[2].x=0;dir[2].y=-1;dir[2].type=GOLEFT; dir[3].x=0;dir[3].y=1;dir[3].type=GORIGHT; dir[4].x=0;dir[4].y=0;dir[4].type=STOP; InitiateInfo Info; memset(dd,-1,sizeof(dd)); Info.tank[0]=Sniper; Info.tank[1]=Sniper; Info.tank[2]=Sniper; Info.tank[3]=Sniper; Info.tank[4]=Sniper;//Striker Sniper Pioneer srand(time(NULL)); for(i=0;i<10;i++ ) stop[i]=0; tp_now=0;l=5; strcpy(Info.aiName,"SwordHoly's AI_3"); //AI名请勿使用中文。 return Info; } //平台从第1回合开始调用此函数获得每回合指令,请勿修改此函数声明。 int min(int x,int y) { if (x<y) return x; else return y; } bool in_map(int x,int y) { if ( (x>=1)&&(x<=21)&&(y>=1)&&(y<=21) ) return true; else return false; } bool can_walk(int x,int y) { if (dt.map[x][y].type==0) return true; else return false; } Point is_attack(int tankID) { TankData myTank=dt.tank[tankID]; int i,j,hp=INF; Point res; res.row=-1; Point now; now.row=myTank.row; now.col=myTank.col; for(i=-myTank.range;i<=myTank.range;i++) for(j=-myTank.range;j<=myTank.range;j++) if (abs(i)+abs(j)<=myTank.range) { if (in_map(now.row-i,now.col-j)) if (dt.map[now.row-i][now.col-j].whoIsHere!=-1) { int whoIsHere=dt.map[now.row-i][now.col-j].whoIsHere; if ((dt.tank[whoIsHere].flag!=myTank.flag)&&(dt.tank[whoIsHere].life<hp) ) { hp=dt.tank[whoIsHere].life; res.row=now.row-i; res.col=now.col-j; } } } return res; } int calc(int x,int y) { if (!(in_map(x,y))) return INF; if (dt.map[x][y].type==PERVIOUS) return 1; if (dt.map[x][y].type==BREAKBRICK) return 2; if (dt.map[x][y].type==BRICK) return 3; else return 1; } struct que { int s,t; pt a[23*23*23*23*23]; void init(){s=1;t=0;} pt top(){return a[s];} pt pop(){return a[s++];} void push(pt p){a[++t]=p;} bool empty() { if (s>t) return true; else return false; } }; que q; int dis(int sx,int sy,int tx,int ty) { int i,j,min_d,min_x,min_y,xx,yy; //priority_queue<pt> q; // cout<<sx<<' '<<sy<<' '<<tx<<' '<<ty<<' '<<endl; for(i=1;i<=21;i++) for(j=1;j<=21;j++) { d[i][j]=INF; visited[i][j]=false; } //memset(visited,false,sizeof(visited)); pt temp,now,next; temp.x=sx;temp.y=sy;temp.dist=0; d[sx][sy]=0; //while(!q.empty()) q.pop(); q.init(); q.push(temp); while( (!visited[tx][ty])&&(!q.empty()) ) { now=q.top(); q.pop(); if (visited[now.x][now.y]) continue; min_d=now.dist; min_x=now.x; min_y=now.y; if (min_d<INF) { d[min_x][min_y]=min_d; visited[min_x][min_y]=true; for(i=0;i<4;i++) { xx=min_x+dir[i].x; yy=min_y+dir[i].y; if ( (in_map(xx,yy))&&(dt.map[xx][yy].type!=STONE) ) { next.x=xx;next.y=yy; next.dist=d[min_x][min_y]+calc(xx,yy); q.push(next); } } } else return INF; } // assert(d[tx][ty]<INF); return d[tx][ty]; } bool source_more(int id)//判断是否需要占领更多的矿 { int i,j,tot; tot=0; Point now; now.row=dt.tank[id].row; now.col=dt.tank[id].col; for(i=-6;i<=6;i++) for(j=-6;j<=6;j++) if (abs(i)+abs(j)==6) if ( in_map(now.row+i,now.col+j) ) if (dt.map[now.row+i][now.col+j].whoIsHere!=-1) if ( (dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].flag!=dt.myFlag)&&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].type==Sniper)) { tot++; } if (tot>=2) return false; if (dt.myFlag==BLUE) { if ( ((1000-dt.redGoldNum)*dt.blueSource)<=((1000-dt.blueGoldNum)*dt.redSource) ) return true; else return false; } else { if ( ((1000-dt.blueGoldNum)*dt.redSource)<=((1000-dt.redGoldNum)*dt.blueSource) )return true; else return false; } } Order walk_to_sc(Point now,int min_sc,int tankID) { int min_dd,min_ord,xx,yy,shft,i,t,min_shft,x; Order order; order.type=STOP; if ((now.row==dt.source[min_sc].row)&&(now.col==dt.source[min_sc].col) ) return order; //return order; int RP=rand()%2; min_dd=INF; min_ord=0; x=5; if ((stop[tankID]>=3)&&(source_more(tankID))) {x=4;} if (RP==0) for(i=0;i<x;i++) { xx=now.row+dir[i].x; yy=now.col+dir[i].y; if (in_map(xx,yy)) { if (dt.map[xx][yy].type==PERVIOUS) shft=0; if (dt.map[xx][yy].type==STONE) shft=INF; if (dt.map[xx][yy].type==BRICK) shft=2; if (dt.map[xx][yy].type==BREAKBRICK) shft=1; if ((get_hurt[xx][yy]<dt.tank[dt.map[now.row][now.col].whoIsHere].life)||(shft==1)||(shft==2)||((stop[tankID]>=3)&&(source_more(tankID))) ) if ( (t=dis(xx,yy,dt.source[min_sc].row,dt.source[min_sc].col))+shft<min_dd) { min_dd=t+shft; min_ord=i; min_shft=shft; } } } else for(i=x-1;i>=0;i--) { xx=now.row+dir[i].x; yy=now.col+dir[i].y; if (in_map(xx,yy)) { if (dt.map[xx][yy].type==PERVIOUS) shft=0; if (dt.map[xx][yy].type==STONE) shft=INF; if (dt.map[xx][yy].type==BRICK) shft=2; if (dt.map[xx][yy].type==BREAKBRICK) shft=1; if ((get_hurt[xx][yy]<dt.tank[dt.map[now.row][now.col].whoIsHere].life)||(shft==1)||(shft==2)||((stop[tankID]>=3)&&(source_more(tankID))) ) if ( (t=dis(xx,yy,dt.source[min_sc].row,dt.source[min_sc].col))+shft<min_dd) { min_dd=t+shft; min_ord=i; min_shft=shft; } } } if ((min_shft==1)||(min_shft==2)) { order.type=FIRE; order.row=now.row+dir[min_ord].x; order.col=now.col+dir[min_ord].y; } else order.type=dir[min_ord].type; return order; } int Pdis(int sx,int sy,int tx,int ty) { int i,j,min_d,min_x,min_y,xx,yy; //priority_queue<pt> q; // cout<<sx<<' '<<sy<<' '<<tx<<' '<<ty<<' '<<endl; for(i=1;i<=21;i++) for(j=1;j<=21;j++) { d[i][j]=INF; visited[i][j]=false; } //memset(visited,false,sizeof(visited)); pt temp,now,next; temp.x=sx;temp.y=sy;temp.dist=0; d[sx][sy]=0; //while(!q.empty()) q.pop(); q.init(); q.push(temp); while( (!visited[tx][ty])&&(!q.empty()) ) { now=q.top(); q.pop(); if (visited[now.x][now.y]) continue; min_d=now.dist; min_x=now.x; min_y=now.y; if (min_d<INF) { d[min_x][min_y]=min_d; visited[min_x][min_y]=true; for(i=0;i<4;i++) { xx=min_x+dir[i].x; yy=min_y+dir[i].y; if ( (in_map(xx,yy))&&(dt.map[xx][yy].type!=STONE) ) { next.x=xx;next.y=yy; next.dist=d[min_x][min_y]+calc(xx,yy); q.push(next); } } } else return INF; } return d[tx][ty]; } Order Pwalk_to_sc(Point now,int min_sc,int tankID) { int min_dd,min_ord,xx,yy,shft,i,t,min_shft,x; Order order; order.type=GODOWN; //return order; int RP=rand()%2; min_dd=INF; min_ord=0;min_shft=0; for(i=0;i<4;i++) { xx=now.row+dir[i].x; yy=now.col+dir[i].y; if ( (in_map(xx,yy))&&(!is_see[xx][yy]) ) { if (predt.map[xx][yy].type==PERVIOUS) shft=0; if (predt.map[xx][yy].type==STONE) shft=INF; if (predt.map[xx][yy].type==BRICK) shft=2; if (predt.map[xx][yy].type==BREAKBRICK) shft=1; if ( (shft<=2) ) if ( (t=dis(xx,yy,dt.source[min_sc].row,dt.source[min_sc].col))+shft<min_dd) { // assert(shft<=2); min_dd=t+shft; min_ord=i; min_shft=shft; } } } //assert(min_dd<INF); if ((min_shft==1)||(min_shft==2)) { order.type=FIRE; order.row=now.row+dir[min_ord].x; order.col=now.col+dir[min_ord].y; } else { xx=now.row+dir[min_ord].x; yy=now.col+dir[min_ord].y; if (dt.map[xx][yy].type==STONE) { cout<<"in_Pwalk_to_sc:"; cout<<min_ord<<endl; cout<<xx<<' '<<yy<<' '<<predt.map[xx][yy].type<<endl; cout<<min_dd<<endl; cout<<min_shft<<endl; cout<<dt.map[now.row][now.col].type<<endl; } order.type=dir[min_ord].type; } return order; } Order Pwalk_to_sc2(Point now,int min_sc,int tankID) { int min_dd,min_ord,xx,yy,shft,i,t,min_shft,x; Order order; order.type=GODOWN; //return order; int RP=rand()%2; min_dd=INF; min_ord=0;min_shft=0; for(i=0;i<4;i++) { xx=now.row+dir[i].x; yy=now.col+dir[i].y; if ( (in_map(xx,yy)) ) { if (predt.map[xx][yy].type==PERVIOUS) shft=0; if (predt.map[xx][yy].type==STONE) shft=INF; if (predt.map[xx][yy].type==BRICK) shft=2; if (predt.map[xx][yy].type==BREAKBRICK) shft=1; if ( (shft<=2) ) if ( (t=dis(xx,yy,dt.source[min_sc].row,dt.source[min_sc].col))+shft<min_dd) { // assert(shft<=2); min_dd=t+shft; min_ord=i; min_shft=shft; } } } //assert(min_dd<INF); if ((min_shft==1)||(min_shft==2)) { order.type=FIRE; order.row=now.row+dir[min_ord].x; order.col=now.col+dir[min_ord].y; } else { xx=now.row+dir[min_ord].x; yy=now.col+dir[min_ord].y; if (dt.map[xx][yy].type==STONE) { cout<<"in_Pwalk_to_sc:"; cout<<min_ord<<endl; cout<<xx<<' '<<yy<<' '<<predt.map[xx][yy].type<<endl; cout<<min_dd<<endl; cout<<min_shft<<endl; cout<<dt.map[now.row][now.col].type<<endl; } order.type=dir[min_ord].type; } return order; } Order walk_away(int sx,int sy,int tx,int ty,int fx,int fy) { int min_dd,min_ord,xx,yy,shft,i,t,min_shft,tt,hurt; Order order; tt=dis(sx,sy,fx,fy); order.type=GODOWN; min_dd=0; min_ord=-1; hurt=INF; for(i=0;i<4;i++) { xx=sx+dir[i].x; yy=sy+dir[i].y; if ( (in_map(xx,yy)) &&(dt.map[xx][yy].whoIsHere==-1) &&(!no_way_out[xx][yy]) &&(get_hurt[xx][yy]<dt.tank[dt.map[sx][sy].whoIsHere].life) &&(get_hurt[xx][yy]<hurt) &&(dis(xx,yy,fx,fy)<tt) ) //往最近的友军跑 { if ( (t=dis(xx,yy,tx,ty))>=min_dd) { hurt=get_hurt[xx][yy]; min_dd=t; min_ord=i; } } } if ( (min_dd<=1)||(min_ord==-1) ) // 不能往最近的友军跑就随便跑吧 for(i=0;i<4;i++) { xx=sx+dir[i].x; yy=sy+dir[i].y; if ( (in_map(xx,yy)) &&(dt.map[xx][yy].whoIsHere==-1) &&(!no_way_out[xx][yy]) &&(get_hurt[xx][yy]<dt.tank[dt.map[sx][sy].whoIsHere].life) &&(get_hurt[xx][yy]<hurt) ) { if ( (t=dis(xx,yy,tx,ty))>min_dd) { hurt=get_hurt[xx][yy]; min_dd=t; min_ord=i; } } } if ( (min_dd<=1)||(min_ord==-1) ) {order.type=STOP;return order;} order.type=dir[min_ord].type; return order; } Order Pwalk_away(int sx,int sy,int tx,int ty,int fx,int fy) { int min_dd,min_ord,xx,yy,shft,i,t,min_shft,tt,hurt; Order order; tt=dis(sx,sy,fx,fy); order.type=GODOWN; min_dd=0; min_ord=-1; hurt=INF; for(i=0;i<4;i++) { xx=sx+dir[i].x; yy=sy+dir[i].y; if ( (in_map(xx,yy))&&(!is_see[xx][yy]) &&(dt.map[xx][yy].whoIsHere==-1) &&(!no_way_out[xx][yy]) // &&(get_hurt[xx][yy]<dt.tank[dt.map[sx][sy].whoIsHere].life) // &&(get_hurt[xx][yy]<hurt) &&(dis(xx,yy,fx,fy)<tt) ) //往最近的友军跑 { if ( (t=dis(xx,yy,tx,ty))>=min_dd) { // hurt=get_hurt[xx][yy]; min_dd=t; min_ord=i; } } } if ( (min_dd<=1)||(min_ord==-1) ) // 不能往最近的友军跑就随便跑吧 for(i=0;i<4;i++) { xx=sx+dir[i].x; yy=sy+dir[i].y; if ( (in_map(xx,yy))&&(!is_see[xx][yy]) &&(dt.map[xx][yy].whoIsHere==-1) &&(!no_way_out[xx][yy]) // &&(get_hurt[xx][yy]<dt.tank[dt.map[sx][sy].whoIsHere].life) // &&(get_hurt[xx][yy]<hurt) ) { if ( (t=dis(xx,yy,tx,ty))>min_dd) { // hurt=get_hurt[xx][yy]; min_dd=t; min_ord=i; } } } if ( (min_dd<=1)||(min_ord==-1) ) {order.type=STOP;return order;} order.type=dir[min_ord].type; return order; } void Get_match(int dep) { int sum,i,j; if (dep==5) { sum=0; for(i=0;i<5;i++) sum+=dist[i][match[i]]; if (sum<ans) { ans=sum; for(i=0;i<5;i++) ans_match[i]=match[i]; } return ; } for(i=0;i<sc_num;i++) if (!used[i]) { used[i]=true; match[dep]=i; Get_match(dep+1); used[i]=false; } } void PGet_match(int dep) { int sum,i,j; if (dep==5) { sum=0; for(i=0;i<5;i++) sum+=Pdist[i][Pmatch[i]]; if (sum<Pans) { Pans=sum; for(i=0;i<5;i++) Pans_match[i]=Pmatch[i]; } return ; } for(i=0;i<Psc_num;i++) if (!Pused[i]) { Pused[i]=true; Pmatch[dep]=i; PGet_match(dep+1); Pused[i]=false; } } void calc_damage(int tankID) { int i,j,range; Point now; TankData myTank=dt.tank[tankID]; now.row=myTank.row;now.col=myTank.col; // cout<<tankID<<' '<<now.row<<' '<<now.col<<endl; range=myTank.range; for(i=-range;i<=range;i++) for(j=-range;j<=range;j++) if (abs(i)+abs(j)<=myTank.range) { if (in_map(now.row-i,now.col-j)) get_hurt[now.row-i][now.col-j]+=myTank.attack; } } int ways(int x,int y) { int i,j,k,res,xx,yy; res=1; for(i=0;i<4;i++) { xx=x+dir[i].x;yy=y+dir[i].y; if (in_map(xx,yy)&&(dt.map[xx][yy].type==PERVIOUS)&&(dt.map[xx][yy].whoIsHere==-1)) res++; } return res; } void calc_noway(int x,int y) { int i,xx,yy; if (no_way_out[x][y]==true) return ; if (ways(x,y)<=2) { no_way_out[x][y]=true; for(i=0;i<4;i++) { xx=x+dir[i].x;yy=y+dir[i].y; if (in_map(xx,yy)&&(dt.map[xx][yy].type==PERVIOUS)&&(dt.map[xx][yy].whoIsHere==-1)) calc_noway(xx,yy); } } } void calc_hurt() { int i,j; memset(get_hurt,0,sizeof(get_hurt)); memset(no_way_out,false,sizeof(no_way_out)); memset(make_hurt,0,sizeof(make_hurt)); for(i=1;i<=21;i++) for(j=1;j<=21;j++) { if (dt.map[i][j].type==STONE) get_hurt[i][j]+=INF; if (dt.map[i][j].type==BRICK) get_hurt[i][j]+=2; if (dt.map[i][j].type==BREAKBRICK) get_hurt[i][j]+=1; } for(i=0;i<10;i++) if (dt.tank[i].flag!=dt.myFlag) calc_damage(i); for(i=1;i<=21;i++) for(j=1;j<=21;j++) if ( ways(i,j)==2 ) { calc_noway(i,j); } /* for(i=1;i<=21;i++) { for(j=1;j<=21;j++) cout<<get_hurt[i][j]<<' '; cout<<endl; }*/ } void recover(int id,int row,int col) { if (dt.map[row][col].type==STONE) { cout<<"OH,NO,YOU can't stand on a STONE:"<<row<<' '<<col<<endl; return ; } if ( (row==dt.tank[id].row)&&(col==dt.tank[id].col) ) { return ; } if ( (row<=0)||(col<=0) ) return ; cout<<"in_recover:"<<id<<' '<<row<<' '<<col<<endl; dt.map[row][col].whoIsHere=id; if (dt.tank[id].row>=1) dt.map[dt.tank[id].row][dt.tank[id].col].whoIsHere=-1; dt.tank[id].row=row; dt.tank[id].col=col; } void calc_is_see() { int i,j,k; memset(is_see,false,sizeof(is_see)); for(i=0;i<10;i++) if (dt_now.tank[i].flag==dt.myFlag) { for(k=-4;k<=4;k++) for(j=-4;j<=4;j++) if ( (abs(k)+abs(j)<=4)&&(in_map(dt_now.tank[i].row+k,dt_now.tank[i].col+j)) ) is_see[dt_now.tank[i].row+k][dt_now.tank[i].col+j]=true; } for(i=0;i<sc_num;i++) { for(k=-2;k<=2;k++) for(j=-2;j<=2;j++) if ( (abs(k)+abs(j)<=2)&&(in_map(dt_now.source[i].row+k,dt_now.source[i].col+j)) ) is_see[dt_now.source[i].row+k][dt_now.source[i].col+j]=true; } } void delete_source(int row,int col) { int i; for(i=0;i<MAX_SOURCE_NUM;i++) if ( (dt.source[i].row==row)&&(dt.source[i].col==col) ) { dt.source[i].row=0; dt.source[i].col=0; } } void add_source(int row,int col) { int i; if ( (row==6)&&(col==3) ) cout<<"ok!!!!"<<endl; for(i=0;i<MAX_SOURCE_NUM;i++) if ( (dt.source[i].row==0)&&(dt.source[i].col==0) ) { is_added[i]=true; dt.source[i].row=row; dt.source[i].col=col; return ; } } void analysis_map() { int tz[10],i,j; memset(tz,0,sizeof(tz)); for(i=1;i<=3;i++) for(j=1;j<=21;j++) if (dt.map[i][j].type==STONE) tz[i]++; for(i=0;i<MAX_SOURCE_NUM;i++) is_added[i]=false; if ( (tz[1]==4)&&(tz[2]==4)&&(tz[3]==4) //is_map arena &&(dt.map[1][1].type==STONE)&&(dt.map[2][2].type==STONE)&&(dt.map[3][3].type==STONE) ) { // delete_source(17,11); //add_source(9,8); //delete_source(20,16); //add_source(9,14); return ; } if ( (tz[1]==0)&&(tz[2]==5)&&(tz[3]==1) //is_map maze &&(dt.map[1][1].type!=STONE)&&(dt.map[2][2].type!=STONE)&&(dt.map[3][3].type!=STONE) ) { // delete_source(15,2); // add_source(7,4); // dt.source[12].row=0; // dt.source[12].col=0; // add_source(6,3); return ; } if ( (tz[1]==9)&&(tz[2]==15)&&(tz[3]==7) //is_map prison &&(dt.map[1][1].type==STONE)&&(dt.map[2][2].type==STONE)&&(dt.map[3][3].type!=STONE) ) { // delete_source(16,6); // add_source(7,10); // delete_source(6,8); // add_source(16,9); // add_source(6,3); return ; } } void predict() { int i,Pl,j,fireid; Order order; calc_is_see(); dt=dt_now; if (dt_now.round==1) {predt=dt_now;for(i=0;i<10;i++) if (predt.tank[i].flag!=predt.myFlag) predt.tank[i].revive=0;} // dt=predt;dt.round++; /*for(i=1;i<=21;i++) for(j=1;j<=21;j++) dt.map[i][j].type=dt_now.map[i][j].type;*/ int min_d,min_sc,t,xx,yy,shft,min_dd,min_ord,min_shft; /*for(i=0;i<10;i++) if (dt.tank[i].flag==dt.myFlag) { recover(i,dt_now.tank[i].row,dt_now.tank[i].col); dt.tank[i]=dt_now.tank[i]; }*/ for(i=0;i<tot_Fire;i++) { fireid=predt.map[Fire_at[i].row][Fire_at[i].col].whoIsHere; if ( (fireid!=-1)&&(predt.tank[fireid].life==dt.tank[fireid].life) ) { predt.map[Fire_at[i].row][Fire_at[i].col].whoIsHere=-1; predt.tank[fireid].row=-2;predt.tank[fireid].col=-2; } // if ( (fireid!=-1)&&(predt.tank[fireid].life!=dt.tank[fireid].life) ) } for(i=0;i<10;i++) if ( (dt_now.tank[i].flag!=dt_now.myFlag)) { if ( (dt.tank[i].life>0)&&(predt.tank[i].row!=-2) ) { //cout<<"cover_from_predt"<<endl; recover(i,predt.tank[i].row,predt.tank[i].col); } } // if (dt.round==1) return ;//第一轮不需要预测 Psc_num=0; for(i=1;i<=21;i++) for(j=1;j<=21;j++) if ((dt.map[i][j].isHereSource!=0)) Psc_num++; Pl=0; for(i=0;i<10;i++) if ((dt.tank[i].flag!=dt.myFlag)&&(dt.tank[i].life>0)&&(dt.tank[i].row!=-2)) { PtankID[Pl++]=i; } // cout<<"test-1"<<endl; for(i=0;i<Pl;i++) for(j=0;j<Psc_num;j++) { if (dt.map[dt.source[j].row][dt.source[j].col].isHereSource-1==1-dt.myFlag) Pdist[i][j]=MY+dis(dt.tank[PtankID[i]].row,dt.tank[PtankID[i]].col,dt.source[j].row,dt.source[j].col); else Pdist[i][j]=dis(dt.tank[PtankID[i]].row,dt.tank[PtankID[i]].col,dt.source[j].row,dt.source[j].col); } Pans=INF; memset(Pused,false,sizeof(Pused)); // cout<<"test0"<<endl; PGet_match(0); // cout<<"test1"<<endl; int min_f,f,tt; for(i=0;i<Pl;i++) { min_f=INF;f=-1; for(j=0;j<Pl;j++) if ( (i!=j)&&((tt=dis(dt.tank[PtankID[i]].row,dt.tank[PtankID[i]].col,dt.tank[PtankID[j]].row,dt.tank[PtankID[j]].col))<min_f) ) { min_f=tt;f=j; } Pnearest_friend[i]=f; } int tp; // cout<<"test2"<<endl; //cout<<Pl<<endl; for(tp=0;tp<Pl;tp++) if (dt_now.tank[PtankID[tp]].row==-2) { Point now; now.row=dt.tank[PtankID[tp]].row; now.col=dt.tank[PtankID[tp]].col; Point aim; if (((aim=is_attack(PtankID[tp])).row==-1)||(dt.tank[PtankID[tp]].type==Pioneer) ) { int min_dis,min_sc,i,j; min_dis=INF; for(i=0;i<sc_num;i++) if ( Pdist[tp][i]<min_dis ) { min_dis=Pdist[tp][i]; min_sc=i; } if (min_dis<=2) order=Pwalk_to_sc(now,min_sc,PtankID[tp]); else order=Pwalk_to_sc(now,Pans_match[tp],PtankID[tp]); } else { order.type=FIRE;order.row=aim.row,order.col=aim.col; Order temp=order;; int i,j; if (dt.tank[PtankID[tp]].type==Sniper) for(i=-4;i<=4;i++) for(j=-4;j<=4;j++) if (abs(i)+abs(j)==4) if ( in_map(now.row+i,now.col+j) ) if ( (dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].flag==dt.myFlag)&&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].type==Striker) &&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].life>1) ) { order=walk_away(now.row,now.col,now.row+i,now.col+j,dt.tank[PtankID[Pnearest_friend[tp]]].row,dt.tank[tankID[Pnearest_friend[tp]]].col); } if (dt.tank[tankID[tp]].type!=Pioneer) for(i=-2;i<=2;i++) for(j=-2;j<=2;j++) if (abs(i)+abs(j)<=2) if ( in_map(now.row+i,now.col+j) ) if ( (dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].flag==dt.myFlag)&&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].type==Pioneer) &&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].life>dt.tank[PtankID[tp]].attack) ) { order=walk_away(now.row,now.col,now.row+i,now.col+j,dt.tank[PtankID[Pnearest_friend[tp]]].row,dt.tank[PtankID[Pnearest_friend[tp]]].col); } if (order.type==STOP) order=temp;//没地方跑了就拼了吧^_^ - -! } // cout<<PtankID[tp]<<' '<<order.type<<endl; for(i=0;i<4;i++) if (order.type==dir[i].type) { // cout<<"predict_from:"<<dt.tank[PtankID[tp]].row<<' '<<dt.tank[PtankID[tp]].col<<endl; recover(PtankID[tp],dt.tank[PtankID[tp]].row+dir[i].x,dt.tank[PtankID[tp]].col+dir[i].y); // cout<<"predict_walk_to:"<<dt.tank[PtankID[tp]].row<<' '<<dt.tank[PtankID[tp]].col<<endl; dt.tank[PtankID[tp]].life=dt_now.tank[PtankID[tp]].life; } } // cout<<"test3"<<endl; for(i=0;i<10;i++) if ( (dt_now.tank[i].flag!=dt_now.myFlag)) { if ( (predt.tank[i].revive+1==dt.round) ) { dt.tank[i].revive=-1; recover(i,predt.tank[i].StartRow,predt.tank[i].StartCol); } } for(i=0;i<10;i++) if ( (dt_now.tank[i].row!=-2) ) { recover(i,dt_now.tank[i].row,dt_now.tank[i].col); dt.tank[i]=dt_now.tank[i]; //cout<<"can_see_recover:"<<dt_now.tank[i].row<<' '<<dt_now.tank[i].col<<' '<<dt.map[dt_now.tank[i].row][dt_now.tank[i].col].whoIsHere<<' ' //<<dt.tank[i].row<<' '<<dt.tank[i].row<<' '<<endl; } analysis_map(); // cout<<"test4"<<endl; } bool can_kill(int id) { int i,j,tot,rid; tot=0; for(i=-5;i<=5;i++) for(j=-5;j<=5;j++) if ( (abs(i)+abs(j)<=5)&&(in_map(dt.tank[id].row+i,dt.tank[id].col+j)) ) { rid=dt.map[dt.tank[id].row+i][dt.tank[id].col+j].whoIsHere; if ( (rid!=-1)&&(dt.tank[rid].flag==dt.myFlag)&&(dt.tank[rid].type==Sniper) ) tot++; } cout<<"in can_kill():"; cout<<tot<<' '; cout<<dt.tank[id].life<<endl; if (tot>=dt.tank[id].life) return true; else return false; } bool is_near(int my,int emy) { int min_dis,min_sc,i,j,l0,l1; Point now; now.row=dt.tank[emy].row; now.col=dt.tank[emy].col; Order order; min_dis=INF; for(i=0;i<sc_num;i++) if ( Pdist[emy][i]<min_dis ) { min_dis=Pdist[tp_now][i]; min_sc=i; } l0=abs(now.row-dt.tank[my].row)+abs(now.col-dt.tank[my].col); order=Pwalk_to_sc2(now,min_sc,emy); if (order.type!=FIRE) { if (order.type==GOUP) now.row--; if (order.type==GODOWN) now.row++; if (order.type==GOLEFT) now.col--; if (order.type==GORIGHT) now.col++; } l1=abs(now.row-dt.tank[my].row)+abs(now.col-dt.tank[my].col); // assert(!(l1<l0)); cout<<"l0"<<l0<<endl; cout<<"l1"<<l1<<endl; if (l1<l0) cout<<"near"<<endl; else cout<<"away"<<endl; if (l1<l0) return true; else return false; } extern "C" Order makeOrder(DataForAI data) { int RPP; Order order; Point now; start=clock(); order.type=GODOWN; dt_now=data; cout<<"ROUND:"<<dt_now.round<<endl; if (tp_now==l) tp_now=0; if (tp_now==0) { predict(); tot_Fire=0; // for(int i=1;i<=21;i++) // { // for(int j=1;j<=21;j++) // cout<<dt.map[i][j].whoIsHere<<' '; // cout<<endl; /// } memset(sc_aimed,0,sizeof(sc_aimed)); int i,j,min_d,min_sc,t,xx,yy,shft,min_dd,min_ord,min_shft; calc_hurt(); sc_num=0; for(i=1;i<=21;i++) for(j=1;j<=21;j++) if ((dt.map[i][j].isHereSource!=0)) sc_num++; //for(i=0;i<13;i++) // if (dt.source[i].row!=0) sc_num++; // cout<<"ok???"<<endl; min_sc=0; l=0; for(i=0;i<10;i++) if ((dt.tank[i].flag==dt.myFlag)&&(dt.tank[i].life>0)) { tankID[l++]=i; } for(i=0;i<l;i++) for(j=0;j<sc_num;j++) { if ( (dt.map[dt.source[j].row][dt.source[j].col].isHereSource-1==dt.myFlag) || ( (dt.map[dt.source[j].row][dt.source[j].col].whoIsHere!=-1)&&(dt.tank[dt.map[dt.source[j].row][dt.source[j].col].whoIsHere].flag==dt.myFlag) ) ) { if ( is_added[j]&&(dt.tank[tankID[i]].row==dt.source[j].row)&&(dt.tank[tankID[i]].col==dt.source[j].col) ) dist[i][j]=-INF; else dist[i][j]=MY+dis(dt.tank[tankID[i]].row,dt.tank[tankID[i]].col,dt.source[j].row,dt.source[j].col); } else dist[i][j]=dis(dt.tank[tankID[i]].row,dt.tank[tankID[i]].col,dt.source[j].row,dt.source[j].col); } ans=INF; memset(used,false,sizeof(used)); Get_match(0); int min_f,f,tt; for(i=0;i<l;i++) { min_f=INF;f=-1; for(j=0;j<l;j++) if ( (i!=j)&&((tt=dis(dt.tank[tankID[i]].row,dt.tank[tankID[i]].col,dt.tank[tankID[j]].row,dt.tank[tankID[j]].col))<min_f) ) { min_f=tt;f=j; } nearest_friend[i]=f; } } //cout<<tp_now<<':'<<tankID[tp_now]<<' '<<ans_match[tp_now]<<endl; //for(tp_now=0;tp_now<10;tp_now++) if (tankID[tp_now]==dt.myID) break; now.row=dt.tank[tankID[tp_now]].row; now.col=dt.tank[tankID[tp_now]].col; Point aim; if (((aim=is_attack(tankID[tp_now])).row==-1)||(dt.tank[tankID[tp_now]].type==Pioneer) ) { int min_dis,min_sc,i,j; min_dis=INF; for(i=0;i<sc_num;i++) if ( dist[tp_now][i]<min_dis ) { min_dis=dist[tp_now][i]; min_sc=i; } if ( (min_dis<=2)&&(!is_added[min_sc]) ) order=walk_to_sc(now,min_sc,tankID[tp_now]); else order=walk_to_sc(now,ans_match[tp_now],tankID[tp_now]); if ( (stop[tankID[tp_now]]>=3)&&(source_more(tankID[tp_now])) ) stop[tankID[tp_now]]=0; else if (dt.tank[tankID[tp_now]].type==Sniper) for(i=-6;i<=6;i++) for(j=-6;j<=6;j++) if (abs(i)+abs(j)==6) if ( in_map(now.row+i,now.col+j) ) if (dt.map[now.row+i][now.col+j].whoIsHere!=-1) if ( (dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].flag!=dt.myFlag)//&&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].type!=Sniper) && (is_near(tankID[tp_now],dt.map[now.row+i][now.col+j].whoIsHere) ) ) { order.type=STOP; } } else { order.type=FIRE;order.row=aim.row,order.col=aim.col; Order temp=order;; int i,j; if (dt.tank[tankID[tp_now]].type==Sniper) for(i=-4;i<=4;i++) for(j=-4;j<=4;j++) if (abs(i)+abs(j)==4) if ( in_map(now.row+i,now.col+j) ) if ( (dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].flag!=dt.myFlag)&&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].type==Striker) &&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].life>1)&&(!can_kill(dt.map[now.row+i][now.col+j].whoIsHere)) && (is_near(tankID[tp_now],dt.map[now.row+i][now.col+j].whoIsHere)) ) { order=walk_away(now.row,now.col,now.row+i,now.col+j,dt.tank[tankID[nearest_friend[tp_now]]].row,dt.tank[tankID[nearest_friend[tp_now]]].col); } if (dt.tank[tankID[tp_now]].type!=Pioneer) for(i=-2;i<=2;i++) for(j=-2;j<=2;j++) if (abs(i)+abs(j)<=2) if ( in_map(now.row+i,now.col+j) ) if ( (dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].flag!=dt.myFlag)&&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].type==Pioneer) &&(dt.tank[dt.map[now.row+i][now.col+j].whoIsHere].life>dt.tank[tankID[tp_now]].attack)&&(!can_kill(dt.map[now.row+i][now.col+j].whoIsHere)) && (is_near(tankID[tp_now],dt.map[now.row+i][now.col+j].whoIsHere) ) ) { order=walk_away(now.row,now.col,now.row+i,now.col+j,dt.tank[tankID[nearest_friend[tp_now]]].row,dt.tank[tankID[nearest_friend[tp_now]]].col); } if (order.type==STOP) order=temp;//没地方跑了就拼了吧^_^ - -! } if (order.type==STOP) stop[tankID[tp_now]]++; else stop[tankID[tp_now]]=0; // cout<<tankID[tp_now]<<' '<<stop[tankID[tp_now]]<<' '<<order.type<<endl; predt=dt; cout<<"tankid:"<<tankID[tp_now]<<endl; cout<<"to_source:"<<match[tp_now]<<endl; cout<<"x_y"<<dt.tank[tankID[tp_now]].row<<","<<dt.tank[tankID[tp_now]].col<<endl;; tp_now++; if (order.type==FIRE) { Fire_at[tot_Fire].row=order.row; Fire_at[tot_Fire].col=order.col; tot_Fire++; } finish=clock(); // cout<<finish-start<<"ms"<<endl; return order; }  

你可能感兴趣的:(struct,kill,delete,include,平台,ttf)