求助,实时游戏AI计算过慢!
  • 板块灌水区
  • 楼主JoeBiden2020
  • 当前回复10
  • 已保存回复10
  • 发布时间2021/10/30 11:34
  • 上次更新2023/11/4 01:56:45
查看原帖
求助,实时游戏AI计算过慢!
432183
JoeBiden2020楼主2021/10/30 11:34

深搜寻路,搜到或者步数过多就退出,地图开到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);
	}
2021/10/30 11:34
加载中...