AI

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值