黑马程序员技术交流社区

标题: sokoban game 推箱子游戏代码,如意大师讲的,自己算是默写吧 [打印本页]

作者: sunshine429    时间: 2016-1-23 12:58
标题: sokoban game 推箱子游戏代码,如意大师讲的,自己算是默写吧
  1. //
  2. //  main.c
  3. //  Sokoban game
  4. //
  5. //  Created by Sunshine_yang on 1/23/16.
  6. //  Copyright (c) 2016 sunshine-429. All rights reserved.
  7. //

  8. #include <stdio.h>
  9. #define ROW 10
  10. #define COL 21

  11. void printfMap(char arr[ROW][COL]);
  12. void exchange(char arr[ROW][COL], int oldX, int oldY, int newX, int newY);

  13. int main(int argc, const char * argv[]) {
  14.     // *********** 定义变量 ***********
  15.         // 定义地图 横为Y轴向右坐标增加  竖为X轴向下坐标增加
  16.     char map[ROW][COL] = {
  17.         "####################",
  18.         "#o   ###########    ",
  19.         "### x#########  ####",
  20.         "###             ###",
  21.         "###  ########   ####",
  22.         "#########       ####",
  23.         "############    ####",
  24.         "#####          #####",
  25.         "#####      #        ",
  26.         "####################",
  27.    
  28.    
  29.     };
  30.         // 定义小人当前位置
  31.     int personX = 1;
  32.     int personY = 1;
  33.         // 定义小人下个位置
  34.     int perNextX = 1;
  35.     int perNextY = 1;
  36.         // 定义用户移动的方向
  37.     char direction;
  38.         // 定义路
  39.     char street = ' ';
  40.         // 定义箱子当前位置
  41.     int boxX = 2;
  42.     int boxY = 4;
  43.         // 定义箱子下个位置
  44.     int boxNextX = 2;
  45.     int boxNextY = 4;
  46.         //定义标记
  47.     char mark;
  48.     // *********** 打印地图 ***********
  49.     printfMap(map);
  50.    
  51.     // *********** 输入指令 ***********
  52.     printf("请输入移动方向: w->up      s->down     a->left     d->right      q->quit\n");
  53.     // *********** 循环结构 ***********
  54.     while(1)
  55.     {
  56.         // 接收指令
  57.         scanf("%c", &direction);
  58.         //吸收回车
  59.         getchar();
  60.         // 判断指令
  61.         
  62.         // 更新位置
  63.         perNextX = personX;
  64.         perNextY = personY;
  65.         switch(direction)
  66.         {
  67.             case 'w':
  68.             case 'W':
  69.                 perNextX--;
  70.                 break;
  71.                
  72.             case 's':
  73.             case 'S':
  74.                 perNextX++;
  75.                 break;
  76.                
  77.             case 'a':
  78.             case 'A':
  79.                 perNextY--;
  80.                 break;
  81.                
  82.             case 'd':
  83.             case 'D':
  84.                 perNextY++;
  85.                 break;
  86.                
  87.             case 'q':
  88.             case 'Q':
  89.                 printf("Y确认,N取消:\n");
  90.                 scanf("%c",&mark);
  91.                 getchar();
  92.                 switch(mark){
  93.                     case 'y':
  94.                     case 'Y':printf("程序正在退出。。。\n");
  95.                         printf("程序已退出!\n");
  96.                     return 0;
  97.                     case 'n':
  98.                     case 'N':
  99.                         break;
  100.                         
  101.                 }
  102.                
  103.         }
  104.             // 判断小人的下一步是否为路,若为路,小人和路交换
  105.         if(map[perNextX][perNextY] == street)
  106.         {
  107.             exchange(map, personX,personY, perNextX,perNextY);
  108.             // 上面交换函数并没有改变小人的位置
  109.             personX = perNextX;
  110.             personY = perNextY;
  111.             //判断小人下个位置是箱子
  112.         }else if(map[perNextX][perNextY] == 'x')
  113.         {
  114.             //让箱子移动位置
  115.             boxNextX = boxX + (boxX - personX);
  116.             boxNextY = boxY + (boxY - personY);
  117.             // 判断箱子的下一步是不是路
  118.             if(map[boxNextX][boxNextY] == street)
  119.             {
  120.                 // 交换箱子和路
  121.                 exchange(map, boxX,boxY, boxNextX,boxNextY);
  122.                 boxX = boxNextX;
  123.                 boxY = boxNextY;
  124.                
  125.                 // 交换小人和箱子原来的位置
  126.                 exchange(map, personX,personY, perNextX,perNextY);
  127.                 personX = perNextX;
  128.                 personY = perNextY;
  129.             }
  130.         }
  131.         // 打印地图
  132.         printfMap(map);
  133.         // 判断走出
  134.         if(boxY == COL-2)
  135.         {
  136.             printf("恭喜你成功逃脱!congratulations!\n");
  137.             return 0;
  138.         }
  139.     }
  140.     return 0;
  141. }

  142. /**
  143. *  交换位置
  144. */
  145. void exchange(char arr[ROW][COL], int oldX, int oldY, int newX, int newY)
  146. {
  147.     char temp = arr[oldX][oldY];
  148.     arr[oldX][oldY] = arr[newX][newY];
  149.     arr[newX][newY] = temp;
  150. }








  151. /**
  152. *  打印地图
  153. */
  154. void printfMap(char arr[ROW][COL])
  155. {
  156.     for(int i = 0; i < ROW; i++)
  157.     {
  158.         // 用%s是个小改进。字符数组用的""结尾有\0,
  159.         printf("%s\n", arr[i]);
  160.     }


  161. }
复制代码

作者: zp2161132    时间: 2016-1-27 00:18
  我什么时候才能达到这个程度呢?
作者: 13631297627    时间: 2016-1-30 16:11
受教了,不错!!!
作者: 沐一风    时间: 2016-1-30 17:24
写代码写的还是很不错的啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2