写了一个小小的推箱子,
大体过程是:
当按下asdw移动后开始计算,每一个坐标下对应的数字(相当于箱子,墙,人);然后用Function_show显示出来移动后的图。
#include <stdio.h>
#define width 10//地图(数组x)宽
#define high 10//地图(数组y)高
int pan(int d[][width],int b[][2]);
//判断有多少箱子,这里返回一个数gong来判断是否通关
void Function_show(int mag[][width]);
//显示移动过后的图
void Function_succ(int succ,int flg);
//判断是否推进所有箱子,并且用了多少步
int main()
{ char k_akex;//接受wasd
int mag1[high][width]={0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,0,0,0,
0,0,0,1,3,0,1,0,0,0,
0,1,1,1,2,0,1,1,1,0,
0,1,3,2,4,0,2,3,1,0,
0,1,0,0,0,0,0,0,1,0,
0,1,1,1,2,0,1,1,1,0,
0,0,0,1,3,0,1,0,0,0,
0,0,0,1,0,0,1,0,0,0,
0,0,0,1,1,1,1,0,0,0};
//0为空白,1为墙,2为箱子,3为终点,4为人。
int ry,rx,flg=0,gong,i=0,equiv;//他们的意义在第一次出现我都写在下面
int a[high][2];//储存终点坐标
gong=pan(mag1,a);
//共计有多少终点,并且当其为0时指所有箱子都成功推进,过关
equiv=gong;//相同
for(int y=0;y<high;++y){
for(int x=0;x<width;++x){
if(mag1[y][x]==1)
printf("口");
else if(mag1[y][x]==3)
printf("终");
else if(mag1[y][x]==2)
printf("箱");
else if(mag1[y][x]==4){
printf("人");
rx=x;//rx为当前人物x坐标
ry=y;}//ry为当前人物y坐标
else
printf(" ");
}
printf("\n");}
到这里地图基本图形与坐标就出来了,
我就用一个for来不断获取键盘的移动信息asdw这种
我这只有个移动过程,当通关后退出还是下一关我就没写了,要写也很简单,用个判断句就ok,
for(;1;)
{
k_akex=getch(); //接受asdw
system("cls");//清屏
if(k_akex=='d')
{ flg+=1;//每移动一次加1,步数
if(mag1[ry][rx+1]!=1&&mag1[ry][rx+1]!=2){
//d移动相当于x轴+1,当不为墙1与箱子2时直接移动
mag1[ry][rx+1]=4;//此时新坐标为人物
mag1[ry][rx]=0;//旧坐标为空
rx=rx+1;//更新人物坐标
}
else if(mag1[ry][rx+1]!=1&&mag1[ry][rx+1]==2&&mag1[ry][rx+2]!=1&&mag1[ry][rx+2]!=2){
//当+1不是墙而是箱子时,人推动箱子,需要再判断后一个+2是不是1或是2,
mag1[ry][rx+1]=4;//+1坐标为人物
mag1[ry][rx+2]=2;//+2坐标为箱子
mag1[ry][rx]=0;//原坐标为空
rx=rx+1;
}
for(int x=0;x<equiv;++x)//用于判断箱子是否推进终点
{
if(mag1[a[i][0]][a[i][1]]!=2&&mag1[a[i][0]][a[i][1]]!=4)
mag1[a[i][0]][a[i][1]]=3;//只要不是箱子与人在终点坐标那么此坐标显示终点
else if(mag1[a[i][0]][a[i][1]]==2){
gong=gong-1;//如果终点是被箱子占据,终点—1,为0时通关,每移动一次都需要重新计算
}
i=i+1;//终点个数,全部罗列出来并计算
}
i=0;//每移动一次都有重新计算,所以为0
Function_show(mag1);
}//右移
else if(k_akex=='a')
{ flg+=1;
if(mag1[ry][rx-1]!=1&&mag1[ry][rx-1]!=2){
mag1[ry][rx-1]=4;
mag1[ry][rx]=0;
rx=rx-1;
}
else if(mag1[ry][rx-1]!=1&&mag1[ry][rx-1]==2&&mag1[ry][rx-2]!=1&&mag1[ry][rx-2]!=2){
mag1[ry][rx-1]=4;
mag1[ry][rx-2]=2;
mag1[ry][rx]=0;
rx=rx-1;
}
for(int x=0;x<equiv;++x)
{
if(mag1[a[i][0]][a[i][1]]!=2&&mag1[a[i][0]][a[i][1]]!=4)
mag1[a[i][0]][a[i][1]]=3;
else if(mag1[a[i][0]][a[i][1]]==2){
gong=gong-1;
}
i=i+1;
}
i=0;
Function_show(mag1);
}//左移
else if(k_akex=='a')
{ flg+=1;
if(mag1[ry][rx-1]!=1&&mag1[ry][rx-1]!=2){
mag1[ry][rx-1]=4;
mag1[ry][rx]=0;
rx=rx-1;
}
else if(mag1[ry][rx-1]!=1&&mag1[ry][rx-1]==2&&mag1[ry][rx-2]!=1&&mag1[ry][rx-2]!=2){
mag1[ry][rx-1]=4;
mag1[ry][rx-2]=2;
mag1[ry][rx]=0;
rx=rx-1;
}
for(int x=0;x<equiv;++x)
{
if(mag1[a[i][0]][a[i][1]]!=2&&mag1[a[i][0]][a[i][1]]!=4)
mag1[a[i][0]][a[i][1]]=3;
else if(mag1[a[i][0]][a[i][1]]==2){
gong=gong-1;
}
i=i+1;
}
i=0;
Function_show(mag1);
}//左移
else if(k_akex=='w')
{ flg+=1;
if(mag1[ry-1][rx]!=1&&mag1[ry-1][rx]!=2){
mag1[ry-1][rx]=4;
mag1[ry][rx]=0;
ry=ry-1;
}
else if(mag1[ry-1][rx]!=1&&mag1[ry-1][rx]==2&&mag1[ry-2][rx]!=1&&mag1[ry-2][rx]!=2){
mag1[ry-1][rx]=4;
mag1[ry-2][rx]=2;
mag1[ry][rx]=0;
ry=ry-1;
}
for(int x=0;x<equiv;++x)
{
if(mag1[a[i][0]][a[i][1]]!=2&&mag1[a[i][0]][a[i][1]]!=4)
mag1[a[i][0]][a[i][1]]=3;
else if(mag1[a[i][0]][a[i][1]]==2){
gong=gong-1;
}
i=i+1;
}
i=0;
Function_show(mag1);
}//上移
else if(k_akex=='s')
{ flg+=1;
if(mag1[ry+1][rx]!=1&&mag1[ry+1][rx]!=2){
mag1[ry+1][rx]=4;
mag1[ry][rx]=0;
ry=ry+1;
}
else if(mag1[ry+1][rx]!=1&&mag1[ry+1][rx]==2&&mag1[ry+2][rx]!=1&&mag1[ry+2][rx]!=2){
mag1[ry+1][rx]=4;
mag1[ry+2][rx]=2;
mag1[ry][rx]=0;
ry=ry+1;
}
for(int x=0;x<equiv;++x)
{
if(mag1[a[i][0]][a[i][1]]!=2&&mag1[a[i][0]][a[i][1]]!=4)
mag1[a[i][0]][a[i][1]]=3;
else if(mag1[a[i][0]][a[i][1]]==2){
gong=gong-1;
}
i=i+1;
}
i=0;
Function_show(mag1);
}//下移
Function_succ(gong,flg);
gong=equiv;//前面gong已经被减了,但是要重新计算,所以又为终点个数
}
}
主体基本完成。
接下来就是三个函数。
第一
判断有多少箱子,这里返回一个数gong来判断是否通关
int pan(int d[][width],int b[][2])
{
int i=0;
for(int y=0;y<high;++y)
for(int x=0;x<width;++x)
{
if(d[y][x]==3)
{
b[i][0]=y;
b[i][1]=x;
i+=1;
}
}
return i;
}
第二
显示移动过后的图
void Function_show(int mag1[][width])
{
for(int y=0;y<high;++y){
for(int x=0;x<width;++x){
if(mag1[y][x]==1)
printf("口");
else if(mag1[y][x]==3)
printf("终");
else if(mag1[y][x]==2)
printf("箱");
else if(mag1[y][x]==4)
printf("人");
else
printf(" ");
}
printf("\n");}
}
第三
判断所有箱子是否在终点,并且用了多少步
void Function_succ(int succ,int flg)
{
if(succ==0)
printf("通关了!!!!你用了%d步!",flg);
}
如果有什么小问题可以说一下,感谢各位。