WHO CAN HELP ME!!!
  • 板块灌水区
  • 楼主Moss345512
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/8/9 09:12
  • 上次更新2024/8/9 10:05:35
查看原帖
WHO CAN HELP ME!!!
1251715
Moss345512楼主2024/8/9 09:12

谁能帮我改改下面的代码?

改改creeper的代码,以及search函数。

#include<bits/stdc++.h>
int world[64][512][512],rea_wor[512][512],borin_wor[512][512],animal_map[64][512][512],blo_arr[9][2];
int x=1,y=128,z=128,life=20,num_of_wat=10;

struct step_pair{
	int steps,sides;
};

step_pair search(int x1,int y1,int z1,int x2,int y2,int z2){
	step_pair retn;
	if(abs(x1-x2)>8 || abs(y1-y2)>8 || abs(z1-z2)>8){
		retn.sides=0;
		retn.steps=512;
		return retn;
	}
	world[x1][y1][z1]=64;
	if(x1>x2 && y1==y2 && z1==z2){
		retn.sides=0;
		retn.steps=1;
		return retn;
	}
	step_pair ret[8];
	for(int i=0;i<8;i++)ret[i].steps=1024;
	int num_step=512,num_s;
	if(world[x1][y1+1][z1]!=0 && world[x1][y1-1][z1]!=0 && world[x1][y1][z1+1]!=0 && world[x1][y1][z1-1]!=0 && world[x1-1][y1][z1]!=0)return retn;
	if(world[x1][y1+1][z1]==0)ret[0]=search(x1,y1+1,z1,x2,y2,z2);
	else if(world[x1-1][y1+1][z1]==0 && world[x1-1][y1][z1]!=0)ret[1]=search(x1-1,y1+1,z1,x2,y2,z2);
	if(world[x1][y1][z1+1]==0)ret[2]=search(x1,y1,z1+1,x2,y2,z2);
	else if(world[x1-1][y1][z1+1]==0 && world[x1-1][y1][z1]!=0)ret[3]=search(x1-1,y1,z1+1,x2,y2,z2);
	if(world[x1][y1-1][z1]==0)ret[4]=search(x1,y1-1,z1,x2,y2,z2);
	else if(world[x1-1][y1-1][z1]==0 && world[x1-1][y1][z1]!=0)ret[5]=search(x1-1,y1-1,z1,x2,y2,z2);
	if(world[x1][y1][z1-1]==0)ret[6]=search(x1,y1,z1-1,x2,y2,z2);
	else if(world[x1-1][y1][z1-1]==0 && world[x1-1][y1][z1]!=0)ret[7]=search(x1-1,y1,z1-1,x2,y2,z2);
	for(int i=0;i<8;i++){
		if(num_step>ret[i].steps)num_step=ret[i].steps,num_s=i;
	}
	return ret[num_s];
}

struct creeper{
	int clife=20,cx,cy,cz;
	void born(){
		clife=20;
		do{
			cx=rand()%63;
			cy=rand()%512;
			cz=rand()%512;
		}while(world[cx][cy][cz]!=0);
	}
	void move(){
		if(abs(cx-x)+abs(cy-y)+abs(cz-z)<=4){
			for(int i=cx-2;i<=cx+2;i++){
				for(int j=cy-2;j<=cy+2;j++){
					for(int k=cz-2;k<=cz+2;k++){
						world[i][j][k]=0;
					}
				}
			}
			clife=0;
			life-=16;
		}
		else if(abs(cx-x)+abs(cy-y)+abs(cz-z)<=15){
			step_pair tmp;
			tmp=search(cx,cy,cz,x,y,z);
			if(tmp.sides==0)cy++;
			else if(tmp.sides==1)cx--,cy++;
			if(tmp.sides==2)cz++;
			else if(tmp.sides==3)cx--,cz++;
			if(tmp.sides==4)cy--;
			else if(tmp.sides==5)cx--,cy--;
			if(tmp.sides==6)cz++;
			else if(tmp.sides==7)cx--,cz--;
			for(int i=0;i<64;i++)for(int j=0;j<256;j++)for(int k=0;k<256;k++)if(world[i][j][k]==64)world[i][j][k]=0;
		}
		else{
			int tmp=rand()%4;
			if(tmp==0){
				if(world[cx][cy+1][cz]==0)cy++;
				else if(world[cx-1][cy+1][cz]==0 && world[cx-1][cy][cz]!=0)cx--,cy++;
			}
	        if(tmp==1){
				if(world[cx][cy-1][cz]==0)cy++;
				else if(world[cx-1][cy-1][cz]==0 && world[cx-1][cy][cz]!=0)cx--,cy--;
			}
			if(tmp==2){
				if(world[cx][cy][cz+1]==0)cy++;
				else if(world[cx-1][cy][cz+1]==0 && world[cx-1][cy][cz]!=0)cx--,cz++;
			}
			if(tmp==3){
				if(world[cx][cy][cz-1]==0)cy++;
				else if(world[cx-1][cy][cz-1]==0 && world[cx-1][cy][cz]!=0)cx--,cy--;
			}
		}
		int cre_fal_hig=0;
	    while(cx<63 && (world[cx+1][cy][cz]==0 || world[cx+1][cy][cz]==3 || world[cx+1][cy][cz]==4)){
	    	cx++;
    		cre_fal_hig++;
	    }
	    if(cre_fal_hig>3 && world[cx][cy][cz]!=3)clife-=cre_fal_hig-3;
	    if(world[cx][cy][cz]==4)clife=0;
	    if(clife<=0)born();
	    animal_map[cx][cy][cz]=2;
	}
}cre[40];


void make_world(){
	for(int i=0;i<512;i++){ //随机 
		for(int j=0;j<512;j++){
			rea_wor[i][j]=rand()%12+10;
		}
	}
	for(int i=0;i<512;i++){ //柏林优化 
		for(int j=0;j<512;j++){
			borin_wor[i][j]=rea_wor[i][j];
		}
	}
	for(int i=1;i<511;i++){
		for(int j=1;j<511;j++){
			borin_wor[i][j]=(rea_wor[i][j]+rea_wor[i-1][j]+rea_wor[i+1][j]+rea_wor[i][j-1]+rea_wor[i][j+1])/5;
		}
	}
	for(int i=12;i<63;i++){ //生成世界 
		for(int j=0;j<512;j++){
			for(int k=0;k<512;k++){
				if(i>=17)world[i][j][k]=3;
				if(i>=borin_wor[j][k])world[i][j][k]=1;
				if(i>=borin_wor[j][k]+3)world[i][j][k]=2;
				if(world[i][j][k]==2 && rand()%18==0)world[i][j][k]=7;
				if(world[i][j][k]==2 && rand()%27==0)world[i][j][k]=8;
				if(world[i][j][k]==2 && rand()%54==0)world[i][j][k]=10;
				if(i>=60)world[i][j][k]=9;
			}
		}
	}
	for(int i=0;i<96;i++){ //生成矿洞 
		int xr,yr,zr;
		xr=rand()%40+16;
		yr=rand()%480+16;
		zr=rand()%480+16;
		for(int i=xr-3;i<=xr+3;i++){
			for(int j=yr-8;j<=yr+8;j++){
				for(int k=zr-8;k<=zr+8;k++){
					if(rand()%6==0)world[i][j][k]=0;
					if(rand()%16==0){
						world[i][j][k]=4;
						if(world[i-1][j][k]==3)world[i-1][j][k]=2;
						if(world[i+1][j][k]==3)world[i+1][j][k]=2;
						if(world[i][j-1][k]==3)world[i][j-1][k]=2;
						if(world[i][j+1][k]==3)world[i][j+1][k]=2;
						if(world[i][j][k-1]==3)world[i][j][k-1]=2;
						if(world[i][j][k+1]==3)world[i][j][k+1]=2;
					}
					if(rand()%12==0)world[i][j][k]=7;
					if(rand()%24==0)world[i][j][k]=8;
					if(rand()%96==0)world[i][j][k]=10;
				}
			}
		}
	}
	for(int i=0;i<96;i++){
		int xr=0,yr=0,zr=0;
		while(world[xr][yr][zr]!=1 && world[xr-1][yr][zr]!=0){
			xr=rand()%6+14;
		    yr=rand()%480+16;
		    zr=rand()%480+16;
		}
		for(int j=xr-5;j<=xr-3;j++){
			for(int k=yr-2;k<=yr+2;k++){
				for(int l=zr-1;l<=zr+1;l++){
					world[j][k][l]=6;
				}
			}
			for(int k=yr-1;k<=yr+1;k++){
				for(int l=zr-2;l<=zr+2;l++){
					world[j][k][l]=6;
				}
			}
		}
		for(int j=yr-1;j<=yr+1;j++){
			for(int k=zr-1;k<=zr+1;k++){
				world[xr-6][j][k]=6;
			}
		}
		for(int j=1;j<=5;j++){
			world[xr-1][yr][zr]=5;
		}
	}
	return;
}

void show_world(){
	printf("\n");
	for(int i=(y+480)%512;i<(y+32)%512;i++){
		for(int j=(z+480)%512;j<(z+32)%512;j++){
			if(i==y&&j==z)printf("A");
			else if(animal_map[x][i][j]==2)printf("C"); //Creeper
			else if(world[x][i][j]!=0 && world[x][i][j]!=3)printf(" "); //不可行走的位置 
			else if(world[x+1][i][j]==1)printf("."); //草方块
			else if(world[x+1][i][j]==2)printf("#"); //圆石
			else if(world[x+1][i][j]==3)printf("~"); //水
			else if(world[x+1][i][j]==4)printf("m"); //岩浆 
			else if(world[x+1][i][j]==5)printf("|"); //原木
			else if(world[x+1][i][j]==6)printf("*"); //树叶 
			else if(world[x+1][i][j]==7)printf("\""); //铁矿石 
			else if(world[x+1][i][j]==8)printf("'"); //金矿石
			else if(world[x+1][i][j]==9)printf("+"); //基岩
			else if(world[x+1][i][j]==10)printf("%"); //钻石矿石
			else if(world[x+1][i][j]==0)printf(" "); //虚空
		}
		printf("\n");
	}
	return;
}

void ask_pos(){
	char a;
	int be_kil,tep;
	printf("X:%d  Y:%d  Z:%d   LIFE:%d   ",x,y,z,life);
	if(num_of_wat>0)printf("AIR:%d",num_of_wat);
	printf("\nYou Have:");
	for(int i=0;i<9;i++){
		if(blo_arr[i][0]!=1 && blo_arr[i][0]!=2 && blo_arr[i][0]!=4 && blo_arr[i][0]!=5 && blo_arr[i][0]!=6 && blo_arr[i][0]!=7 && blo_arr[i][0]!=8 && blo_arr[i][0]!=10){
			blo_arr[i][0]=0;
			blo_arr[i][1]=0;
			continue;
		}
		printf("  %d: %d ",i,blo_arr[i][1]);
		switch(blo_arr[i][0]){
			case 1:
				printf("grass   ");
				break;
			case 2:
				printf("stone   ");
				break;
			case 5:
				printf("wood   ");
				break;
			case 6:
				printf("leave   ");
				break;
			case 7:
				printf("lion   ");
				break;
			case 8:
				printf("gold   ");
				break;
			case 10:
				printf("diamond   ");
				break;
		}
	}
	printf("\nWhat Will You Do?\n");
	scanf(" %c",&a);
	if(a=='A'){
		if(world[x][y][(z+511)%512]==0 || world[x][y][(z+511)%512]==3 || world[x][y][(z+511)%512]==4)z=(z+511)%512;
		else if(world[x][y][(z+511)%512]!=9)be_kil=world[x][y][(z+511)%512],world[x][y][(z+511)%512]=0;
	}
	if(a=='W'){
		if(world[x][(y+511)%512][z]==0 || world[x][(y+511)%512][z]==3 || world[x][(y+511)%512][z]==4)y=(y+511)%512;
		else if(world[x][(y+511)%512][z]!=9)be_kil=world[x][(y+511)%512][z],world[x][(y+511)%512][z]=0;
	}
	if(a=='D'){
		if(world[x][y][(z+1)%512]==0 || world[x][y][(z+1)%512]==3 || world[x][y][(z+1)%512]==4)z=(z+1)%512;
		else if(world[x][y][(z+1)%512]!=9)be_kil=world[x][y][(z+1)%512],world[x][y][(z+1)%512]=0;
	}
	if(a=='S'){
		if(world[x][(y+1)%512][z]==0 || world[x][(y+1)%512][z]==3 || world[x][(y+1)%512][z]==4)y=(y+1)%512;
		else if(world[x][(y+1)%512][z]!=9)be_kil=world[x][(y+1)%512][z],world[x][(y+1)%512][z]=0; 
	}
	if(a=='Q' && x>1){
		if(world[x-1][y][z]!=0){
			if(world[x-1][y][z]!=9)be_kil=world[x-1][y][z],world[x-1][y][z]=0;
		}
		else {
			scanf("%d",&tep);
			if((world[x-1][y][z]==0 || world[x-1][y][z]==3 || world[x-1][y][z]==4) && blo_arr[tep][1]>0){
			    world[x][y][z]=blo_arr[tep][0];
		        x--;
		        blo_arr[tep][1]--;
		        if(blo_arr[tep][1]==0)blo_arr[tep][0]=0;
	        }
		}
	}
	if(a=='Z' && x<59)be_kil=world[x+1][y][z],world[x+1][y][z]=0;
	if(a=='O'){
		for(int i=(y+416)%512;i<(y+96)%512;i++){
			for(int j=(z+416)%512;j<(y+96)%512;j++){
				int k=1;
				while(world[k][i][j]==0)k++;
				if(world[k][i][j]==1)printf("."); //草方块
			    else if(world[k][i][j]==2)printf("#"); //圆石
			    else if(world[k][i][j]==3)printf("~"); //水
			    else if(world[k][i][j]==4)printf("m"); //岩浆 
			    else if(world[k][i][j]==5)printf("|");
			    else if(world[k][i][j]==6)printf("*");
			    else if(world[k][i][j]==7)printf("\""); //铁矿石 
			    else if(world[k][i][j]==8)printf("'"); //金矿石
			    else if(world[k][i][j]==9)printf("+"); //基岩 
			    else if(world[k][i][j]==10)printf("%");
			    else if(world[k][i][j]==0)printf(" "); //虚空
			}
			printf("\n");
		}
		printf("64*512*512WORLD\n\n\n");
	}
	if(world[x][y][z]==3)num_of_wat--;
	else num_of_wat+=2;
	if(num_of_wat>10)num_of_wat=10;
	int i;
	for(i=0;i<9;i++){
		if(blo_arr[i][0]==0)break;
		if(blo_arr[i][0]==be_kil && blo_arr[i][1]<64)break;
	}
	blo_arr[i][0]=be_kil;
	blo_arr[i][1]++;
	return;
}

void move_water(){
	for(int i=0;i<64;i++){
		for(int j=0;j<512;j++){
			for(int k=0;k<512;k++){
				if(world[i][j][k]==3){
					if(world[i+1][j][k]==0)world[i+1][j][k]=3;
					if(world[i][j+1][k]==0)world[i][j+1][k]=3;
					if(world[i][j-1][k]==0)world[i][j-1][k]=3;
					if(world[i][j][k+1]==0)world[i][j][k+1]=3;
					if(world[i][j][k-1]==0)world[i][j][k-1]=3;
				}
				else if(world[i][j][k]==4 && (world[i-1][j][k]==3 || world[i+1][j][k]==3 || world[i][j-1][k]==3 || world[i][j+1][k]==3 || world[i][j][k-1]==3 || world[i][j][k+1]==3))world[i][j][k]=2;
				else if(world[i][j][k]==4){
					if(world[i+1][j][k]==0)world[i+1][j][k]=4;
					if(world[i][j+1][k]==0)world[i][j+1][k]=4;
					if(world[i][j-1][k]==0)world[i][j-1][k]=4;
					if(world[i][j][k+1]==0)world[i][j][k+1]=4;
					if(world[i][j][k-1]==0)world[i][j][k-1]=4;
				}
			}
		}
	}
}

int mode=3;
int main(){
	srand(time(0));
	int fal_hig;
	printf("MINECRAFT 0.0.30\n\n");
	make_world();
	while(x<63 && (world[x+1][y][z]==0 || world[x+1][y][z]==3 || world[x+1][y][z]==4))x++;
	while(true){
		show_world();
		ask_pos();
		if(x>62){printf("GAME OVER!!!\nSTEVE FELL OUT OF THE WORLD!!!");break;}
		if(world[x][y][z]==4){printf("GAME OVER!!!\nSTEVE TRY TO SWIM IN THE LAVA!!!");break;}
		fal_hig=0;
		while(x<63 && (world[x+1][y][z]==0 || world[x+1][y][z]==3 || world[x+1][y][z]==4)){
			x++;
			fal_hig++;
		}
		if(fal_hig>3 && world[x][y][z]!=3){
			life-=fal_hig-3;
			if(life<=0){printf("GAME OVER!!!\nSTEVE FELL DOWN OF A HIGH PLACE!!!");break;}
		}
		if(num_of_wat<0){printf("GAME OVER!!!\nSTEVE LEFT AIR!!!");break;}
		if(mode==1){
		    memset(animal_map,0,sizeof(animal_map));
		    for(int i=0;i<16+mode*8;i++){
		    	cre[i].born();
		    	cre[i].move();
		    } 
		}
	}
	return 0;
}
2024/8/9 09:12
加载中...