- //
 
 - //  main.c
 
 - //  Sokoban game
 
 - //
 
 - //  Created by Sunshine_yang on 1/23/16.
 
 - //  Copyright (c) 2016 sunshine-429. All rights reserved.
 
 - //
 
  
- #include <stdio.h>
 
 - #define ROW 10
 
 - #define COL 21
 
  
- void printfMap(char arr[ROW][COL]);
 
 - void exchange(char arr[ROW][COL], int oldX, int oldY, int newX, int newY);
 
  
- int main(int argc, const char * argv[]) {
 
 -     // *********** 定义变量 ***********
 
 -         // 定义地图 横为Y轴向右坐标增加  竖为X轴向下坐标增加
 
 -     char map[ROW][COL] = {
 
 -         "####################",
 
 -         "#o   ###########    ",
 
 -         "### x#########  ####",
 
 -         "###             ###",
 
 -         "###  ########   ####",
 
 -         "#########       ####",
 
 -         "############    ####",
 
 -         "#####          #####",
 
 -         "#####      #        ",
 
 -         "####################",
 
 -     
 
 -     
 
 -     };
 
 -         // 定义小人当前位置
 
 -     int personX = 1;
 
 -     int personY = 1;
 
 -         // 定义小人下个位置
 
 -     int perNextX = 1;
 
 -     int perNextY = 1;
 
 -         // 定义用户移动的方向
 
 -     char direction;
 
 -         // 定义路
 
 -     char street = ' ';
 
 -         // 定义箱子当前位置
 
 -     int boxX = 2;
 
 -     int boxY = 4;
 
 -         // 定义箱子下个位置
 
 -     int boxNextX = 2;
 
 -     int boxNextY = 4;
 
 -         //定义标记
 
 -     char mark;
 
 -     // *********** 打印地图 ***********
 
 -     printfMap(map);
 
 -     
 
 -     // *********** 输入指令 ***********
 
 -     printf("请输入移动方向: w->up      s->down     a->left     d->right      q->quit\n");
 
 -     // *********** 循环结构 ***********
 
 -     while(1)
 
 -     {
 
 -         // 接收指令
 
 -         scanf("%c", &direction);
 
 -         //吸收回车
 
 -         getchar();
 
 -         // 判断指令
 
 -         
 
 -         // 更新位置
 
 -         perNextX = personX;
 
 -         perNextY = personY;
 
 -         switch(direction)
 
 -         {
 
 -             case 'w':
 
 -             case 'W':
 
 -                 perNextX--;
 
 -                 break;
 
 -                 
 
 -             case 's':
 
 -             case 'S':
 
 -                 perNextX++;
 
 -                 break;
 
 -                 
 
 -             case 'a':
 
 -             case 'A':
 
 -                 perNextY--;
 
 -                 break;
 
 -                 
 
 -             case 'd':
 
 -             case 'D':
 
 -                 perNextY++;
 
 -                 break;
 
 -                 
 
 -             case 'q':
 
 -             case 'Q':
 
 -                 printf("Y确认,N取消:\n");
 
 -                 scanf("%c",&mark);
 
 -                 getchar();
 
 -                 switch(mark){
 
 -                     case 'y':
 
 -                     case 'Y':printf("程序正在退出。。。\n");
 
 -                         printf("程序已退出!\n");
 
 -                     return 0;
 
 -                     case 'n':
 
 -                     case 'N':
 
 -                         break;
 
 -                         
 
 -                 }
 
 -                 
 
 -         }
 
 -             // 判断小人的下一步是否为路,若为路,小人和路交换
 
 -         if(map[perNextX][perNextY] == street)
 
 -         {
 
 -             exchange(map, personX,personY, perNextX,perNextY);
 
 -             // 上面交换函数并没有改变小人的位置
 
 -             personX = perNextX;
 
 -             personY = perNextY;
 
 -             //判断小人下个位置是箱子
 
 -         }else if(map[perNextX][perNextY] == 'x')
 
 -         {
 
 -             //让箱子移动位置
 
 -             boxNextX = boxX + (boxX - personX);
 
 -             boxNextY = boxY + (boxY - personY);
 
 -             // 判断箱子的下一步是不是路
 
 -             if(map[boxNextX][boxNextY] == street)
 
 -             {
 
 -                 // 交换箱子和路
 
 -                 exchange(map, boxX,boxY, boxNextX,boxNextY);
 
 -                 boxX = boxNextX;
 
 -                 boxY = boxNextY;
 
 -                 
 
 -                 // 交换小人和箱子原来的位置
 
 -                 exchange(map, personX,personY, perNextX,perNextY);
 
 -                 personX = perNextX;
 
 -                 personY = perNextY;
 
 -             }
 
 -         }
 
 -         // 打印地图
 
 -         printfMap(map);
 
 -         // 判断走出
 
 -         if(boxY == COL-2)
 
 -         {
 
 -             printf("恭喜你成功逃脱!congratulations!\n");
 
 -             return 0;
 
 -         }
 
 -     }
 
 -     return 0;
 
 - }
 
  
- /**
 
 -  *  交换位置
 
 -  */
 
 - void exchange(char arr[ROW][COL], int oldX, int oldY, int newX, int newY)
 
 - {
 
 -     char temp = arr[oldX][oldY];
 
 -     arr[oldX][oldY] = arr[newX][newY];
 
 -     arr[newX][newY] = temp;
 
 - }
 
  
 
 
 
 
 
 
 
- /**
 
 -  *  打印地图
 
 -  */
 
 - void printfMap(char arr[ROW][COL])
 
 - {
 
 -     for(int i = 0; i < ROW; i++)
 
 -     {
 
 -         // 用%s是个小改进。字符数组用的""结尾有\0,
 
 -         printf("%s\n", arr[i]);
 
 -     }
 
  
 
- }
 
  复制代码 |   
        
 
    
    
    
     
 
 |