深搜寻路,搜到或者步数过多就退出,地图开到24*24,12个AI一步算好几秒.
void AiDfs(long long p,long long x,long long y,long long dx,long long dy,long long steps,bool endflag) {
steps++;
if(x>mSize||y>mSize||x<1||y<1||landVis[x][y]||endflag||steps>1000)return;
if(gMap[x][y].landKind==mountLand)return;
if(x==dx&&y==dy) {
endflag=1;
return;
}
if(endflag)return;
landVis[x][y]=1;
aiPath[p].push_front((moveUnit) {
x+1,y
});
AiDfs(p,x+1,y,dx,dy,steps,endflag);
aiPath[p].pop_front();
aiPath[p].push_front((moveUnit) {
x-1,y
});
AiDfs(p,x-1,y,dx,dy,steps,endflag);
aiPath[p].pop_front();
aiPath[p].push_front((moveUnit) {
x,y-1
});
AiDfs(p,x+1,y,dx,dy,steps,endflag);
aiPath[p].pop_front();
aiPath[p].push_front((moveUnit) {
x,y+1
});
AiDfs(p,x-1,y,dx,dy,steps,endflag);
aiPath[p].pop_front();
landVis[x][y]=0;
}
void AiFindPath(long long p,long long x,long long y,long long dx,long long dy) {
memset(landVis,0,sizeof(landVis));
AiDfs(p,x,y,dx,dy,0,0);
}
void AiSuddenAttack(long long p) {
long long maxarmy=-1,maxx=0,maxy=0;
for(long long i=1; i<=mSize; i++) {
for(long long j=1; j<=mSize; j++) {
if(gMap[i][j].armyCount>maxarmy&&gMap[i][j].ownPlayer==p) {
maxarmy=gMap[i][j].armyCount;
maxx=i;
maxy=j;
}
}
}
for(long long i=1; i<=playerCount; i++) {
if(i==p)continue;
if(gMap[capitalX[i]][capitalY[i]].armyCount<0.75*maxarmy) {
AiFindPath(p,maxx,maxy,capitalX[i],capitalY[i]);
return;
}
}
}
void AiCheckCapital(long long p) {
bool danger=0;
long long dis=0,maxarmy=0,fromx=-1,fromy=-1,dis1=0;
for(long long l1=capitalX[p]-6; l1<=capitalX[p]+6; l1++) {
for(long long l2=capitalY[p]-6; l2<=capitalY[p]+6; l2++) {
if(l1<1||l2<1||l1>mSize||l2>mSize||danger)continue;
if(gMap[l1][l2].ownPlayer!=p&&gMap[l1][l2].armyCount>
gMap[capitalX[p]][capitalY[p]].armyCount*1.2) {
danger=1;
dis=abs(l1-capitalX[p])+abs(l2-capitalY[p]);
while(!aiPath[p].empty())aiPath[p].pop_back();
}
}
}
if(danger) {
for(long long l1=capitalX[p]-6; l1<=capitalX[p]+5; l1++) {
for(long long l2=capitalY[p]-6; l2<=capitalY[p]+5; l2++) {
if(l1<1||l2<1||l1>mSize||l2>mSize||(l1==capitalX[p]&&l2==capitalY[p]))continue;
if(gMap[l1][l2].ownPlayer==p&&gMap[l1][l2].armyCount>maxarmy) {
dis1=abs(l1-capitalX[p])+abs(l2-capitalY[p]);
if(dis1>dis)continue;
maxarmy=gMap[l1][l2].armyCount;
fromx=l1;
fromy=l2;
}
}
}
}
if(fromx!=-1&&fromy!=-1){
AiFindPath(p,fromx,fromy,capitalX[p],capitalY[p]);
}
}
void DoAiQueue(long long p) {
long long aiMoveCount=0;
if(!aiPath[p].empty()) {
while(!aiPath[p].empty()&&aiMoveCount<=aiLevel*3) {
moveUnit temp=aiPath[p].back();
aiPath[p].pop_back();
ArmyMove(temp.x,temp.y,aiPath[p].back().x,aiPath[p].back().y);
aiMoveCount++;
}
}
}
void AiExband(long long k) {
long long aiEndFlag=0;
for(long long i=1; i<=mSize; i++) {
if(aiEndFlag>=aiLevel)break;
for(long long j=1; j<=mSize; j++) {
if(gMap[i][j].ownPlayer!=k)continue;
if(gMap[i][j].armyCount>150*citySpeed&&RandPer(10))BuildLand(i,j,1);
if(gMap[i][j].armyCount>150*citySpeed&&RandPer(10))BuildLand(i,j,2);
else {
if(gMap[i+1][j].ownPlayer!=k&&gMap[i][j].armyCount>gMap[i+1][j].armyCount&&RandPer(i+j/1.3)) {
ArmyMove(i,j,i+1,j);
aiEndFlag+=1;
continue;
}
if(gMap[i-1][j].ownPlayer!=k&&gMap[i][j].armyCount>gMap[i-1][j].armyCount&&RandPer(j/1.3)) {
ArmyMove(i,j,i-1,j);
aiEndFlag+=1;
continue;
}
if(gMap[i][j+1].ownPlayer!=k&&gMap[i][j].armyCount>gMap[i][j+1].armyCount&&RandPer(i+j/1.3-1)) {
ArmyMove(i,j,i,j+1);
aiEndFlag+=1;
continue;
}
if(gMap[i][j-1].ownPlayer!=k&&gMap[i][j].armyCount>gMap[i][j-1].armyCount&&RandPer(j/1.3-1)) {
ArmyMove(i,j,i,j-1);
aiEndFlag+=1;
continue;
}
}
}
}
for(long long i=1; i<=mSize; i++) {
if(aiEndFlag>=aiLevel)break;
for(long long j=1; j<=mSize; j++) {
for(long long len=1; len<=mSize/5; len++) {
if(gMap[i][j].ownPlayer!=k)continue;
else {
if(gMap[i+len][j].ownPlayer==k&&gMap[i][j].armyCount>gMap[i+len][j].armyCount&&RandPer(i/1.2)) {
ArmyMove(i,j,i+len,j);
aiEndFlag+=1;
continue;
}
if(gMap[i-len][j].ownPlayer==k&&gMap[i][j].armyCount>gMap[i-len][j].armyCount&&RandPer(i/1.2)) {
ArmyMove(i,j,i-len,j);
aiEndFlag+=1;
continue;
}
if(gMap[i][j+len].ownPlayer==k&&gMap[i][j].armyCount>gMap[i][j+len].armyCount&&RandPer(i+j/1.2)) {
ArmyMove(i,j,i,j+len);
aiEndFlag+=1;
continue;
}
if(gMap[i][j-len].ownPlayer==k&&gMap[i][j].armyCount>gMap[i][j-len].armyCount&&RandPer(i/1.2)) {
ArmyMove(i,j,i,j-len);
aiEndFlag+=1;
continue;
}
}
}
}
}
}
void AiDecide() {
for(long long i=2; i<=playerCount; i++) {
DoAiQueue(i);
AiExband(i);
AiCheckCapital(i);
DoAiQueue(i);
AiSuddenAttack(i);
DoAiQueue(i);
}