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;
}
AI
最新推荐文章于 2024-08-05 19:26:45 发布