目录
  • 1.前言
  • 2.游戏效果展示
  • 3.项目分析
  • 4.地图实现
    • 4.1存储地图
    • 4.2打印地图
  • 5.控制角色移动
    • 5.1找到控制的角色
    • 5.2实现移动
  • 6.判断胜利
    • 总结

      1.前言

      首先推箱子是c语言的一个经典的项目,本篇文字将会介绍如何从零开始实现c语言如何实现推箱子

      2.游戏效果展示

      详解C语言实现推箱子的基本功能

      3.项目分析

      游戏元素:

      • 空地 0
      • 墙壁 1
      • 角色 2
      • 箱子 3
      • 胜利点 4

      游戏目的:

      玩家控制角色在地图的空地上进行移动,通过推动箱子躲避障碍,将所有的箱子推至胜利点即可成功。

      详解C语言实现推箱子的基本功能

      4.地图实现

      4.1存储地图

      首先存储地图我们使用数组来进行存储,为什么我们会用到char而不是int?是因为int普遍为4字节,char为1字节,我们就可以大大减少存储地图所需要的内存。如果要写多张地图的话,仅仅将数组扩充至三维即可,作者将会在之后的文章进行说明。

      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, 0, 0, 1, 1, 0, 0, 1 }, 
          { 1, 0, 0, 0, 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 } 
      };

      4.2打印地图

      对应地图的打印我们则需要对地图进行遍历,利用switch语句将地图打印在控制台上面。

      for (size_t i = 0; i < 10; i++) 
      { 
          for (size_t j = 0; j < 10; 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"); 
      }

      5.控制角色移动

      5.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; 
                  //找到角色,记录其所在的x轴和y轴的坐标
              } 
          } 
      } 

      5.2实现移动

      // 控制(键盘:WSAD(上下左右)) 
      // 需要从键盘获取按键(字符) 
      switch (getch()) // getch()该方法需要在开头导入#include <conio.h>
      {
          case 'w': 
          case 'W': 
              printf("向上\n"); 
              /*
              向上逻辑: 
              改变数组元素的值 
              以人为参考 
              上面可能是: 
              空地 移动 
              墙壁 不动 
              成功点 移动 
              箱子 判断箱子上面是个啥 
              空地 移动 
              成功点 移动 
              墙壁 不动 
              另一个箱子 不动 
              */
              // 上面是空地或成功点 map[posX][posY]:主角所在的位置 
              if (0 == map[posX - 1][posY] || 4 == map[posX - 1][posY]) 
              { 
                  // 当前位置人离开 
                  map[posX][posY] -= 2; 
                  // 上面位置人过来 
                  map[posX - 1][posY] += 2; 
              }
              // 上面是箱子(将箱子从点上推走) 
              else if (3 == map[posX - 1][posY] || 3 + 4 == map[posX - 1][posY]) 
              { 
                  // 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置 
                  if (0 == map[posX - 2][posY] || 4 == map[posX - 2][posY]) 
                  { 
                      // 当前位置人离开 
                      map[posX][posY] -= 2; 
                      // 上面位置人过来 
                      map[posX - 1][posY] += 2; 
                      // 上面位置箱子离开 
                      map[posX - 1][posY] -= 3; 
                      // 上面的上面箱子过来 
                      map[posX - 2][posY] += 3; 
                  } 
              }
              break; 
          case 's': 
          case 'S': 
              printf("向下\n"); 
              break; 
          case 'a': 
          case 'A': 
              printf("向左\n"); 
              break; 
          case 'd': 
          case 'D': 
              printf("向右\n"); 
              break; 
          default: 
              break; 
      }

      6.判断胜利

      对地图遍历搜索,如果发现没有箱子的话,就可以判断为胜利。(size_t是C++里面的东西,size_t相当于unsigned int,这里仅做理解即可,可以用int来代替size_t)

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

      总结

      本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!       

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。