自动贪吃蛇求助
  • 板块灌水区
  • 楼主ljy05
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/10/28 16:30
  • 上次更新2023/11/2 11:03:28
查看原帖
自动贪吃蛇求助
629740
ljy05楼主2023/10/28 16:30

用A*写的自动贪吃蛇,但运行一会后就会把自己困住然后RE,求改正

//in c++11
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
struct nde{
	int x,y,d;
};
string f[50][50],f2[50][50];
int c[50][50],c2[50][50];
int dpt[50][50];
int dx[]={-1,0,0,1};
int dy[]={0,1,-1,0};
string ch[]={"^^",">>","<<","vv"};
int fx=2,fy=1;
int hx,hy;
int siz=30;
mt19937 rnd(time(NULL));
bool operator < (nde x,nde y){
	return abs(x.x-fx)+abs(x.y-fy)+x.d>abs(y.x-fx)+abs(y.y-fy)+y.d;
}
void gotoXY(int a,int b){   
   COORD ll;
   ll.X=b;
   ll.Y=a;
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),ll);
   return ;
}
void ini(){
	system("mode con cols=64 lines=32");
	for(int i=0;i<=siz+1;i++){
		gotoXY(i,siz*2+2);
		printf("||");
		gotoXY(i,0);
		printf("||");
	}
	gotoXY(siz,0);
	for(int i=1;i<=siz;i++){
		gotoXY(siz+1,i*2);
		printf("--");
		gotoXY(0,i*2);
		printf("--");
	}
	dpt[1][1]=1;
	hx=hy=1;
	return ;
}
void rd(){
	for(int i=1;i<=siz;i++){
		for(int j=1;j<=siz;j++){
			f[i][j]="  ";
			c[i][j]=0;
			if(dpt[i][j]!=0){
				for(int k=0;k<4;k++){
					if(dpt[i+dx[k]][j+dy[k]]==dpt[i][j]+1) f[i][j]=ch[k];
				}
				c[i][j]=32;
			}
		}
	}
	f[hx][hy]="xx";
	c[hx][hy]=64;
	f[fx][fy]="bb";
	c[fx][fy]=48;
	for(int i=1;i<=siz;i++){
		for(int j=1;j<=siz;j++){
			if(f[i][j]!=f2[i][j]||c[i][j]!=c2[i][j]){
				gotoXY(i,j*2);
				gotoXY(i,j*2);
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c[i][j]);
				printf("%s",f[i][j].c_str());
			}
			f2[i][j]=f[i][j];
			c2[i][j]=c[i][j];
		}
	}
	return ;
}
int bfs(int sx,int sy){
	if(sx==0||sx==siz+1||sy==0||sy==siz+1) return INT_MAX;
	bool vis[50][50][120]={};
	priority_queue<nde> pq;
	pq.push(nde{sx,sy,0});
	while(!pq.empty()){
		int tx=pq.top().x,ty=pq.top().y,td=pq.top().d;
		pq.pop();
		if(tx==0||tx==siz+1||ty==0||ty==siz+1||vis[tx][ty][td]==1||dpt[tx][ty]-td-1>0) continue;
		if(tx==fx&&ty==fy) return td;
		vis[tx][ty][td]=1;
		for(int i=0;i<4;i++) pq.push(nde{tx+dx[i],ty+dy[i],td+1});
	}
	return INT_MAX;
}
void ms(){
	while(1){
		int tx=0,ty=0,m=INT_MAX,l=INT_MAX,f=0;
		for(int i=0;i<4;i++){
			tx=hx+dx[i];
			ty=hy+dy[i];
			if(bfs(tx,ty)<m){
				m=bfs(tx,ty);
				l=i;
			}
		}
		tx=hx+dx[l];
		ty=hy+dy[l];
		dpt[tx][ty]=dpt[hx][hy]+1;
		hx=tx;
		hy=ty;
		if(tx==fx&&ty==fy){
			f=1;
			do{
				fx=rnd()%siz+1;
				fy=rnd()%siz+1;
			}while(dpt[fx][fy]!=0);
		}
		if(f==0){
			for(int i=1;i<=siz;i++){
				for(int j=1;j<=siz;j++) dpt[i][j]=max(0,dpt[i][j]-1);
			}
		}
		break;
	}
	return ;
}
int main(){
	ini();
	while(1){
		clock_t cl=clock();
		rd();
		ms();
		while(clock()-cl<10);
	}
	return 0;
}
2023/10/28 16:30
加载中...