改改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;
}