A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© LEON27 中级黑马   /  2015-6-24 20:38  /  1487 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

推箱子(入门级)

   一、思考-----实现此游戏的几个重点:
1)小人在移动的时候,如何判断下一步是一个箱子
2)小人推着箱子移动,箱子要移动的下一个位置也是路
3)要记录小人的位置、箱子的位置、箱子要移动的下一个位置
4)计算箱子的下一个位置
5)10*10地图,10*11存储
   虽然这个游戏看着很弱,不过也很开脑洞,对于新手入门,还是挺不错的。
   二、伪代码的实现:
思路://1、定义变量,保存地图、位置信息
      //2、打印地图
      //3、提示玩法
      //4、编写控制程序
      //5、接受玩家输入的方向数据
      //6、判断小人移动的方向
      //7、判断小人将要移动的位置是否是路
      伪代码开始我也觉得很没必要,可是当自己写程序时,丢三拉四,明白了伪代码对于我们新手来说,还是相当重要,可以理清我们的思路。等自己熟悉后自然可以省去。
实现:
#include <stdio.h>
int main(int argc, const char * argv[]) {
//******** 定义变量 **********
    //1、定义地图
          //定义变量保存位置信息
          //定义变量接收用户输入的方向
//*******  打印地图 **********
     //2、打印一遍地图
//*******  编写循环控制程序 *****
     //3、接收用户输入的方向
    //4、判断方向
    //5、根据用户输入的方向 判断如何移动
        //        先判断小人的下一个位置是否 是路
        //        如果是路,先让小人移动
        //        如果不是路,
//*******  判断模块 ***********
    //              再次判断是否是箱子
    //              如果是箱子,计算箱子的下一个位置
    //                 再次判断箱子的下一个位置是否是路
    //                 如果箱子的下一个位置是路,要移动小人和箱子
    //                        如何移动小人和箱子呢?
    //                        1)移动箱子到箱子的下一个位置
    //                        2)让小人移动到箱子的原来的位置
   
    //              如果不是箱子,什么也不干
//******   重绘地图 ***********
    // 6、重绘地图
//*******  判断是否走出来 ******
    // 7、判断箱子是否被推出来了
   
    return 0;
}


     三、推箱子代码实现

  1. #include <stdio.h>
  2. #define kRows 10
  3. #define kCols 11
  4. /**
  5. *  打印地图
  6. *
  7. *  @param map 地图的数组
  8. */
  9. void printMap(char map[kRows][kCols]){

  10.     for (int i=0; i<kRows; i++) {
  11.         printf("%s\n",map[i]);
  12.     }

  13. }


  14. /**
  15. *  移动的函数
  16. *
  17. *  @param map  <#map description#>
  18. *  @param oldX <#oldX description#>
  19. *  @param oldY
  20. *  @param newX <#newX description#><#oldY description#>
  21. *  @param newY <#newY description#>
  22. */
  23. void move1(char map[kRows][kCols],int oldX,int oldY,int newX,int newY){

  24.     //交换两个位置的字符
  25.     char temp;
  26.     temp = map[oldX][oldY];
  27.     map[oldX][oldY] = map[newX][newY];
  28.     map[newX][newY] = temp;

  29. }

  30. int main(int argc, const char * argv[]) {
  31.    
  32.     //******** 定义变量 **********
  33.    
  34.     //1、定义地图
  35.     char map[kRows][kCols]={
  36.         "##########",
  37.         "#O ####  #",
  38.         "# X####  #",
  39.         "#        #",
  40.         "######   #",
  41.         "#  ####  #",
  42.         "#        #",
  43.         "#   ######",
  44.         "#         ",
  45.         "##########"};
  46.    
  47.     //定义变量保存位置信息
  48.     //定义小人当前位置信息
  49.     int personX =1;
  50.     int personY =1;
  51.     //小人将要移动的下一个位置信息
  52.     int personNextX=personX;
  53.     int personNextY=personY;
  54.    
  55.     //定义箱子的当前的位置
  56.     int boxX = 2;
  57.     int boxY = 2;
  58.    
  59.     //定义变量接收用户输入的方向
  60.     char direction;
  61.    
  62.     //定义路的字符
  63.     char street = ' ';
  64.     char box = 'X';
  65.     //*******  打印地图 **********
  66.    
  67.     //2、打印一遍地图
  68.     printMap(map);
  69.     printf("请控制小人移动:w.上  s.下  a.左  d.右  q.退出\n");
  70.     //*******  编写循环控制程序 *****
  71.     while (1) {

  72.     //3、接收用户输入的方向
  73.         scanf("%c",&direction);
  74.         getchar();  //获取一个字符从键盘上
  75.    
  76.         //防止穿墙
  77.         //0
  78.         personNextX = personX;  //1
  79.         personNextY = personY;  //1
  80.         
  81.     //4、判断方向
  82.         switch (direction) {
  83.             case 'w':
  84.             case 'W':
  85.                 //下一个位置-1
  86.                 personNextX--;
  87.                 break;
  88.             case 's':
  89.             case 'S':
  90.                 personNextX++;
  91.                 break;
  92.             case 'a':
  93.             case 'A':
  94.                 personNextY--;
  95.                 break;
  96.             case 'd':
  97.             case 'D':
  98.                 personNextY++;
  99.                 break;
  100.             case 'q':
  101.             case 'Q':
  102.                
  103.                 printf("程序正在退出...\n");
  104.                 printf("程序已经退出!\n");
  105.                 return 0;
  106.                
  107.             default:
  108.                 break;
  109.         }
  110.    
  111.     //5、根据用户输入的方向 判断如何移动
  112.         if (map[personNextX][personNextY] == street) {
  113.             //        先判断小人的下一个位置是否 是路
  114.             
  115.             //        如果是路,先让小人移动
  116.             //移动
  117.             //让小人和路进行交换
  118.             move1(map,personX,personY,personNextX,personNextY);
  119.             
  120.             //重新调整小人的位置
  121.             personX = personNextX;
  122.             personY = personNextY;
  123.             
  124.         }else if (map[personNextX][personNextY] == box){

  125.     //        如果不是路,
  126.     //*******  判断模块 ***********
  127.     //              再次判断是否是箱子
  128.     //              如果是箱子,计算箱子的下一个位置
  129.             
  130.             int boxNextX = boxX+(boxX-personX);
  131.             int boxNextY = boxY+(boxY-personY);
  132.             
  133.     //                 再次判断箱子的下一个位置是否是路
  134.             if (map[boxNextX][boxNextY] == street) {

  135.     //                 如果箱子的下一个位置是路,要移动小人和箱子
  136.     //                        如何移动小人和箱子呢?
  137.     //                        1)移动箱子到箱子的下一个位置
  138.                 move1(map, boxX, boxY, boxNextX, boxNextY);
  139.     //                        2)让小人移动到箱子的原来的位置
  140.                 move1(map, personX, personY, boxX, boxY);
  141.                
  142.                 //重新调整 箱子的位置和小人的位置
  143.                 personX = personNextX;
  144.                 personY = personNextY;
  145.                
  146.                 boxX = boxNextX;
  147.                 boxY = boxNextY;
  148.                
  149.              }
  150.     //              如果不是箱子,什么也不干
  151.         }
  152.    
  153.     //******   重绘地图 ***********
  154.     // 6、重绘地图
  155.         printMap(map);
  156.     //*******  判断是否走出来 ******
  157.     // 7、判断箱子是否被推出来了
  158.         if (boxY==kCols-2) {
  159.             printf("哇哦!你推出来了!\n");
  160.             break;
  161.         }
  162.     //
  163.     }
  164.    
  165.     return 0;
  166. }
复制代码

2 个回复

倒序浏览
怎么可以这么厉害
回复 使用道具 举报
能来面试讲师了吧 我擦   牛啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马