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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

  10.     for (int i = 0; i < Row; i++) {
  11.         for (int j = 0; j < Col; j++) {
  12.             printf("%c",map[i][j]);
  13.         }
  14.         printf("\n");
  15.     }

  16. }
  17. /**
  18. *  移动
  19. *
  20. *  @param map  地图
  21. *  @param oldX 老的横坐标
  22. *  @param oldY 老的纵坐标
  23. *  @param newX 新的横坐标
  24. *  @param newY 新的纵坐标
  25. */
  26. void move1(char map[Row][Col],int oldX,int oldY,int newX,int newY){

  27.     char temp;
  28.     temp = map[oldX][oldY];
  29.     map[oldX][oldY] = map[newX][newY];
  30.     map[newX][newY] = temp;
  31. }
  32. /**
  33. *  主函数
  34. */
  35. int main() {
  36. //    定义变量存储地图,小人现在位置,箱子现在位置,道路,方向
  37.     char map[Row][Col] = {
  38.             "##########",
  39.             "#0 ####  #",
  40.             "# X####  #",
  41.             "#        #",
  42.             "#####    #",
  43.             "#  ####  #",
  44.             "#        #",
  45.             "#   ######",
  46.             "#         ",
  47.             "##########"
  48.     };
  49.     int currentX = 1,currentY = 1,nextX = 1,nextY = 1;
  50.     int personOldX = 1, personOldY = 1, boxOldX = 1, boxOldY = 1;
  51.     int boxX = 2, boxY = 2;
  52.     int boxNextX = 2,boxNextY = 3;
  53.     int flag = 1;
  54.     char direction;
  55.     char street = ' ';
  56.     char box = 'X';
  57. //    打印地图
  58.     printMap(map);
  59.    
  60.     //    提示玩法
  61.     printf("请输入方向:w.上 s.下 a.左 d.右 k.后退\n");
  62. //    循环控制
  63.     while (flag) {
  64. //      每次循环将小人的下一个位置和现在的位置统一,(方向控制以及后续移动的需要)
  65.         nextX = currentX;
  66.         nextY = currentY;
  67.         boxNextX = boxX;
  68.         boxNextY = boxY;
  69. //        接收方向
  70.         scanf("%c",&direction);
  71.         getchar();
  72. //    判断方向
  73.         switch (direction) {
  74. //            按W小人的下一个位置纵坐标(X)减一
  75.             case 'w':
  76.             case 'W':
  77.                 nextX--;
  78.                 break;
  79. //            按S小人的下一个位置纵坐标(X)加一
  80.             case 's':
  81.             case 'S':
  82.                 nextX++;
  83.                 break;
  84. //              按A小人的下一个位置横坐标(X)减一
  85.             case 'a':
  86.             case 'A':
  87.                 nextY--;
  88.                 break;
  89. //              按D小人的下一个位置横坐标(X)加一
  90.             case 'd':
  91.             case 'D':
  92.                 nextY++;
  93.                 break;
  94. //                按Q退出游戏!
  95.             case 'q':
  96.             case 'Q':
  97.                
  98.                 printf("程序正在退出...\n");
  99.                 printf("程序已经推出!\n");
  100.                 return 0;
  101.             case 'k':
  102.             case 'K’:
  103. //  后退一步
  104.                 move1(map, personOldX, personOldY, nextX, nextY);
  105.                 move1(map, boxOldX, boxOldY, boxNextX, boxNextY);
  106.                 nextX = currentX = personOldX;
  107.                 nextY = currentY = personOldY;
  108.                 boxNextX = boxX = boxOldX;
  109.                 boxNextY =  boxY = boxOldY;
  110.                 printMap(map);
  111.                 printf("后退成功!\n");
  112.                
  113.             default:
  114.                 break;
  115.         }
  116. //    判断小人下一个位置是不是路
  117.         //        是路,小人移动
  118.         if (street == map[nextX][nextY]) {
  119.             move1(map, currentX, currentY, nextX, nextY);
  120.             //调整小人的坐标位置
  121.             currentX = nextX;
  122.             currentY = nextY;
  123.                 //    是箱子
  124.         }else if (box == map[nextX][nextY]){
  125.             boxNextX = boxX+(boxX-currentX);
  126.             boxNextY = boxY+(boxY-currentY);
  127.                 //   箱子的下一个位置是不是路
  128.             if (street == map[boxNextX][boxNextY]) {
  129.                 //   是路 推着箱子往前走
  130.                 move1(map, boxX, boxY, boxNextX, boxNextY);
  131.                 move1(map, currentX, currentY, nextX, nextY);

  132.                 personOldX = currentX;
  133.                 personOldY = currentY;
  134.                 boxOldX = boxX;
  135.                 boxOldY = boxY;
  136.                 //                调整小人和箱子的坐标位置
  137.                 currentX = nextX;
  138.                 currentY = nextY;
  139.                 boxX = boxNextX;
  140.                 boxY = boxNextY;
  141.             }
  142.         }
  143.         printMap(map);
  144. //    判断箱子的位置是不是出来了
  145.         //    提示赢了
  146.         if (Col-2 == boxY) {
  147.             printf("恭喜你!");
  148.             flag = 0;
  149. //            如果箱子推到了死角,提示失败,游戏结束
  150.         }else if ((Col-3 == boxY && Row - 4 == boxX)
  151.                 ||(Col-3 == boxY && Row - 9 == boxX)
  152.                 ||(Col-4 == boxY && Row - 9 == boxX)
  153.                 ||(Col-9 == boxY && Row - 5 == boxX)
  154.                 ||(Col-9 == boxY && Row - 9 == boxX)
  155.                 ||(Col-10 == boxY && Row - 7 ==boxX)
  156.                 ||(Col-10 == boxY && Row - 5 ==boxX)
  157.                 ||(Col-10 == boxY && Row - 2 ==boxX)
  158.                 ||(Col-10 == boxY && Row - 9 ==boxX))
  159.         {
  160.             printf("你失败了!");
  161.             flag = 0;
  162.         }

  163.         
  164.     }
  165.     return 0;
  166. }
复制代码

评分

参与人数 1黑马币 +1 收起 理由
38740820 + 1 神马都是浮云

查看全部评分

12 个回复

倒序浏览
我看晕了,感谢大神分享,复习下今天上课内容去
回复 使用道具 举报
回复 使用道具 举报
哎呦 自己优化了 相当不错
回复 使用道具 举报
厉害,,膜拜{:2_42:}
回复 使用道具 举报
楼主可以用一个清屏工具,这样看的就更爽了
回复 使用道具 举报
真是牛人啊
回复 使用道具 举报
哇~好强,我学习下~
回复 使用道具 举报
不只了解,还能优化,楼主真是厉害!
回复 使用道具 举报
很不错!
回复 使用道具 举报
真棒,学习了
回复 使用道具 举报
好的好的 我知道了
回复 使用道具 举报
我是看晕了,厉害。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马