温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用C语言实现推箱子

发布时间:2022-02-18 13:41:57 来源:亿速云 阅读:145 作者:iii 栏目:开发技术

这篇文章主要介绍“怎么用C语言实现推箱子”,在日常操作中,相信很多人在怎么用C语言实现推箱子问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现推箱子”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    地图代码修改成函数

    注意:每次打印地图的时候要在前面加入system("cls")语句来清除刷新地图,该方法需要用到#include <Windows.h>的头文件。

    对上篇文章的推箱子的地图代码进行函数封装,成果如下:

    void drawMap()  {      system("CLS");      // 使用循环,遍历数组(将游戏数据图形化)      for (size_t i = 0; i < 10; i++)      {          for (size_t j = 0; j < 10; j++)          {              /*printf("%2d", map[i][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;                  default:                      break;                  }          }         printf("\n");      }  }

    而存储地图的地方可以放在主函数体外面来进行声明。

    在这之后如果推到成功点和人走到成功点上仅需要加上case 2+4和case 3+4两个条件即可,具体代码如最后源码所示。

    角色移动修改成函数

    对角色移动的函数我们需要分为2个函数,一个是来控制角色移动的函数,另一个则是来寻找角色所在位置的坐标。

    1寻找角色函数

    在该函数中,我们需要对寻找角色,以及判断箱子能否推动做两个功能封装为一个函数,在该函数中,我们要先找到角色的位置,然后对移动的位置进行判断。

    // 移动逻辑 参数:int X,int Y X和Y方向的偏移量  void move(int X,int Y)  {      // 1 找人      int posX = 0, posY = 0;      for (size_t i = 0; i < 10; i++)      {          for (size_t j = 0; j < 10; j++)          {              if (2 == map[i][j] || 2 + 4 == map[i][j])              {                  posX = i;                  posY = j;                  break;              }         }      }     // 空地或成功点 map[posX][posY]:主角所在的位置      if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y])      {      map[posX][posY] -= 2;      map[posX + X][posY + Y] += 2;      }     // 箱子(将箱子从点上推走)      else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y])      {          // 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置          if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)])          {              // 当前位置人离开              map[posX][posY] -= 2;              map[posX + X][posY + Y] += 2;              map[posX + X][posY + Y] -= 3;              map[posX + (X * 2)][posY + (Y * 2)] += 3;          }      }  }

    2角色移动函数

    该函数对键盘输入进行处理,并且通过传入2个参数来一次性对移动进行操作,不需要四个方向都需要在写一遍函数,以下写法可以防止用户开大写而移动不了角色。

    void heroMove()  {      // 控制人物移动      // 2 控制(键盘:WSAD(上下左右))      // 需要从键盘获取按键(字符)      switch (getch())     {         case 'w':          case 'W':              move(-1, 0);              break;          case 's':          case 'S':              move(1, 0);              break;          case 'a':          case 'A':              move(0, -1);              break;          case 'd':          case 'D':              move(0, 1);              break;          default:              break;      }  }

    判断胜利修改成函数

    这里用到了C++的bool类型,c语言也是可以使用,如果不想用这种函数,改成int也是可以使用的。

    bool isWin()  {      for (size_t i = 0; i < 10; i++)      {          for (size_t j = 0; j < 10; j++)          {              if (map[i][j] == 3)              {                  return false;              }          }      }     return true; }

    主体函数的实现

    这里的思想是,先绘制地图,然后对移动进行判断,直到判断所有的箱子没有后,判定玩家胜利。

    int main()  {      while (!isWin()) // 游戏主循环      {          drawMap();          heroMove();      }     drawMap();      return 0;  }

    推箱子能实现基本功能的源码

    #include <stdio.h>  #include <conio.h>  #include <Windows.h>  char map[10][10] =  {      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },      { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },      { 1, 0, 0, 0, 0, 1, 4, 0, 0, 1 },      { 1, 0, 0, 4, 0, 1, 1, 0, 0, 1 },      { 1, 0, 0, 3, 0, 1, 0, 0, 0, 1 },      { 1, 0, 0, 2, 0, 0, 0, 0, 0, 1 },     { 1, 1, 1, 1, 0, 0, 3, 0, 0, 1 },      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },      { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }  }; /* 函数声明 */  void drawMap();  void heroMove();  void move(int X, int Y);  bool isWin(); int main()  {      while (!isWin()) // 游戏主循环      {          drawMap();          heroMove();      }     drawMap();      return 0;  } /* 函数定义 */  // 绘制地图  void drawMap()  {      system("CLS");      // 使用循环,遍历数组(将游戏数据图形化)      for (size_t i = 0; i < 10; i++)      {          for (size_t j = 0; j < 10; j++)          {              /*printf("%2d", map[i][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;                  case 2 + 4:                      printf("♀");                     break;                  case 3 + 4:                      printf("★");                      break;                  default:                      break;                  }          }         printf("\n");      }  } void heroMove()  {      // 控制人物移动      // 2 控制(键盘:WSAD(上下左右))      // 需要从键盘获取按键(字符)      switch (getch())     {         case 'w':          case 'W':              move(-1, 0);              break;          case 's':          case 'S':              move(1, 0);              break;          case 'a':          case 'A':              move(0, -1);              break;          case 'd':          case 'D':              move(0, 1);              break;          default:              break;      }  } // 移动逻辑 参数:int X,int Y X和Y方向的偏移量  void move(int X,int Y)  {      // 1 找人      int posX = 0, posY = 0;      for (size_t i = 0; i < 10; i++)      {          for (size_t j = 0; j < 10; j++)          {              if (2 == map[i][j] || 2 + 4 == map[i][j])              {                  posX = i;                  posY = j;                  break;              }         }      }     // 空地或成功点 map[posX][posY]:主角所在的位置      if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y])      {      map[posX][posY] -= 2;      map[posX + X][posY + Y] += 2;      }     // 箱子(将箱子从点上推走)      else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y])      {          // 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置          if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)])          {              // 当前位置人离开              map[posX][posY] -= 2;              map[posX + X][posY + Y] += 2;              map[posX + X][posY + Y] -= 3;              map[posX + (X * 2)][posY + (Y * 2)] += 3;          }      }  } //判断胜利 bool isWin()  {      for (size_t i = 0; i < 10; i++)      {          for (size_t j = 0; j < 10; j++)          {              if (map[i][j] == 3)              {                  return false;              }          }      }     return true; }

    到此,关于“怎么用C语言实现推箱子”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI