AI

来源:互联网 发布:linux和windows的优劣 编辑:程序博客网 时间:2024/04/27 07:41
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