黑马程序员技术交流社区

标题: 李伟的推箱子(加注释) [打印本页]

作者: Django小虾米    时间: 2015-12-30 23:35
标题: 李伟的推箱子(加注释)
  1. #include<stdio.h>
  2. #include<string.h>
  3. /**
  4. *  打印地图
  5. *
  6. *  @param row 2维数组的行数
  7. *  @param col 2为数组的列数
  8. *  @param map 2维数组名
  9. */
  10. void printMap(int row,int col,char map[][col]);
  11. /**
  12. *  交换两个字符
  13. *
  14. *  @param a 字符1
  15. *  @param b 字符2
  16. */
  17. void change(char *a,char *b);

  18. int main()
  19. {
  20.     char map[10][11]={
  21.         "##########",
  22.         "#O ####  #",
  23.         "# X####  #",
  24.         "#        #",
  25.         "######   #",
  26.         "#  ####  #",
  27.         "#        #",
  28.         "#   ######",
  29.         "#         ",
  30.         "##########"};
  31.    
  32.     char direction;
  33.     int personX = 1;
  34.     int personY = 1;//小人的位置
  35.     int boxX = 2;
  36.     int boxY = 2;//箱子的位置
  37.     int personNextX = personX;
  38.     int personNextY = personY;//小人下一步的位置
  39.     int boxNextX = boxX;
  40.     int boxNextY = boxY;//箱子下一步的位置
  41.    
  42.     printMap(10,11,map);//打印地图
  43.    
  44.     while (1)
  45.     {
  46.         printf("请控制小人移动:A.左 D.右 W.上 S.下 Q.退出\t");
  47.         scanf("%c",&direction);
  48.                
  49.         personNextX = personX;
  50.         personNextY = personY;//不要这两句,小人可以穿墙,不信你试试,嘿嘿
  51.         
  52.         switch (direction) {
  53.             case 'a':
  54.                 personNextY--;
  55.                 break;
  56.                
  57.             case 'd':
  58.                 personNextY++;
  59.                 break;
  60.                
  61.             case 'w':
  62.                 personNextX--;
  63.                 break;
  64.                
  65.             case 's':
  66.                 personNextX++;
  67.                 break;
  68.                
  69.             case 'q':
  70.                 printf("程序已退出\n");
  71.                 return 0;
  72.         }
  73.    
  74.         if (map[personNextX][personNextY] == ' ')//如果小人的下一个位置是路
  75.         {
  76.             change(&map[personNextX][personNextY],&map[personX][personY]);
  77.             //交换小人当前位置和下一个位置的两个字符
  78.             personX = personNextX;
  79.             personY = personNextY;
  80.             //刷新小人的位置
  81.         }
  82.         else if(map[personNextX][personNextY] == 'X')//如果小人的下一个位置是箱子
  83.         {
  84.             boxNextX = boxX+(boxX-personX);
  85.             boxNextY = boxY+(boxY-personY);//计算箱子的下一步位置
  86.             if (map[boxNextX][boxNextY] == ' ')//如果箱子的下一个位置是路
  87.             {
  88.                 change(&map[boxNextX][boxNextY],&map[boxX][boxY]);
  89.                 //交换箱子当前位置下下一步位置的字符
  90.                 change(&map[personX][personY],&map[boxX][boxY]);
  91.                 //交换小人当前位置和箱子当前位置的字符
  92.                 personX = personNextX;
  93.                 personY = personNextY;//刷新小人的位置
  94.                 boxX = boxNextX;
  95.                 boxY = boxNextY;//刷新箱子的位置
  96.             }
  97.         }
  98.         
  99.         if (boxY ==9)//判断箱子到了出口
  100.         {
  101.             printf("哎哟不错哦,你把箱子推出来了哟~\n");
  102.             return 0;
  103.         }
  104.         
  105.         printMap(10,11,map);//打印地图
  106.         
  107.     }
  108.    
  109.     return 0;
  110. }

  111. void printMap(int row,int col,char map[][col])
  112. {
  113.     for (int i=0; i<row; i++)
  114.     {
  115.         printf("%s",map[i]);
  116.         printf("\n");
  117.     }
  118. }

  119. void change(char *a,char *b)
  120. {
  121.     char temp = *a;
  122.     *a = *b;
  123.     *b = temp;
  124. }






复制代码





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