? ? ? ? 推箱子小游戏,把所有箱子推到指定地点即可通关
# 代表墙壁,@代表小人儿,&代表箱子,$代表目标点
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
//定义地图
char map[8][8]={
{0,0,1,1,1,1,0,0},
{0,0,1,4,4,1,0,0},
{0,1,1,0,4,1,1,0},
{0,1,0,0,3,4,1,0},
{1,1,0,3,0,0,1,1},
{1,0,0,1,3,3,0,1},
{1,0,0,2,0,0,0,1},
{1,1,1,1,1,1,1,1},
};
//定义人的坐标和步数
int x=6,y=3;
int n=0;
unsigned int a,b,c,d;
//进入死循环
for(;;)
{
//清屏
system("clear");
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
switch(map[i][j])
{
case 0:printf(" ");break;
case 1:printf("# ");break;
case 2:printf("@ ");break;
case 3:printf("& ");break;
case 4:printf("$ ");break;
}
}
printf("\n");
}
//判断是否完成任务
if (map[1][3]==3&&map[1][4]==3&&map[2][4]==3&&map[3][5]==3)
{
printf("任务完成!");
printf("您一共走了%d步",n);
return 0;
}
//获取方向键并处理
switch(getch())
{
case 183:
if(map[x-1][y]==0||map[x-1][y]==4)
{
map[x][y]=0;
map[x-1][y]=2;
x--;
n++;
}
else if(map[x-1][y]==3)
{
if(map[x-2][y]==0||map[x-2][y]==4)
{
map[x][y]=0;
map[x-1][y]=2;
map[x-2][y]=3;
x--;
n++;
}
}
if(map[1][3]==0)
map[1][3]=4;
if(map[1][4]==0)
map[1][4]=4;
if(map[2][4]==0)
map[2][4]=4;
if(map[3][5]==0)
map[3][5]=4;
break;
case 184:
if(map[x+1][y]==0||map[x+1][y]==4)
{
map[x][y]=0;
map[x+1][y]=2;
x++;
n++;
}
else if(map[x+1][y]==3)
{
if(map[x+2][y]==0||map[x+2][y]==4)
{
map[x][y]=0;
map[x+1][y]=2;
map[x+2][y]=3;
x++;
n++;
}
}
if(map[1][3]==0)
map[1][3]=4;
if(map[1][4]==0)
map[1][4]=4;
if(map[2][4]==0)
map[2][4]=4;
if(map[3][5]==0)
map[3][5]=4;
break;
case 185:
if(map[x][y+1]==0||map[x][y+1]==4)
{
map[x][y]=0;
map[x][y+1]=2;
y++;
n++;
}
else if(map[x][y+1]==3)
{
if(map[x][y+2]==0||map[x][y+2]==4)
{
map[x][y]=0;
map[x][y+1]=2;
map[x][y+2]=3;
y++;
n++;
}
}
if(map[1][3]==0)
map[1][3]=4;
if(map[1][4]==0)
map[1][4]=4;
if(map[2][4]==0)
map[2][4]=4;
if(map[3][5]==0)
map[3][5]=4;
break;
case 186:
if(map[x][y-1]==0||map[x][y-1]==4)
{
map[x][y]=0;
map[x][y-1]=2;
y--;
n++;
}
else if(map[x][y-1]==3)
{
if(map[x][y-2]==0||map[x][y-2]==4)
{
map[x][y]=0;
map[x][y-1]=2;
map[x][y-2]=3;
y--;
n++;
}
}
if(map[1][3]==0)
map[1][3]=4;
if(map[1][4]==0)
map[1][4]=4;
if(map[2][4]==0)
map[2][4]=4;
if(map[3][5]==0)
map[3][5]=4;
break;
}
}
}
由于有大段重复代码,可以进行优化
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
//定义地图
char map[8][8]={
{0,0,1,1,1,1,0,0},
{0,0,1,4,4,1,0,0},
{0,1,1,0,4,1,1,0},
{0,1,0,0,3,4,1,0},
{1,1,0,3,0,0,1,1},
{1,0,0,1,3,3,0,1},
{1,0,0,2,0,0,0,1},
{1,1,1,1,1,1,1,1},
};
//定义人的坐标和步数
int x=6,y=3;
int n=0;
int a,b;
//进入死循环
for(;;)
{
//清屏
system("clear");
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
switch(map[i][j])
{
case 0:printf(" ");break;
case 1:printf("# ");break;
case 2:printf("@ ");break;
case 3:printf("& ");break;
case 4:printf("$ ");break;
}
}
printf("\n");
}
//判断是否完成任务
if (map[1][3]==3&&map[1][4]==3&&map[2][4]==3&&map[3][5]==3)
{
printf("任务完成!");
printf("您一共走了%d步",n);
return 0;
}
//获取方向键并处理
switch(getch())
{
case 183:
a=-1;
b=0;
break;
case 184:
a=1;
b=0;
break;
case 185:
a=0;
b=1;
break;
case 186:
a=0;
b=-1;
break;
}
if(map[x+a][y+b]==0||map[x+a][y+b]==4)
{
map[x][y]=0;
map[x+a][y+b]=2;
x+=a;
y+=b;
n++;
}
else if(map[x+a][y+b]==3)
{
if(map[x+a*2][y+b*2]==0||map[x+a*2][y+b*2]==4)
{
map[x][y]=0;
map[x+a][y+b]=2;
map[x+a*2][y+b*2]=3;
x+=a;
y+=b;
n++;
}
}
if(map[1][3]==0)
map[1][3]=4;
if(map[1][4]==0)
map[1][4]=4;
if(map[2][4]==0)
map[2][4]=4;
if(map[3][5]==0)
map[3][5]=4;
}
}
优化后可以减少三分之一的代码量
|