C语言写个推箱子

写了一个小小的推箱子,
大体过程是:
当按下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);
}

如果有什么小问题可以说一下,感谢各位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值