| 
 
| #include <stdio.h> #define Lod 11
 #define Kod 10
 //定义打印地图函数
 
 void printfMap(char map[Kod][Lod]){
 
 for (int i = 0; i < Kod; i++) {
 printf("%s\n",map[i]);
 }
 
 }
 
 //定义移动函数
 void Move(char map[Kod][Lod],int nowX, int nowY,int nextX, int nextY){
 
 char t;
 t = map[nowX][nowY];
 map[nowX][nowY] = map[nextX][nextY];
 map[nextX][nextY] = t;
 
 }
 
 
 int main(int argc, const char * argv[]) {
 //定义地图
 char map[Kod][Lod]={
 "##########",
 "#0  ###  #",
 "#  X###  #",
 "#        #",
 "######   #",
 "#  ####  #",
 "#        #",
 "#   ######",
 "#         ",
 "##########"
 };
 //打印地图
 printfMap(map);
 
 //定义变量,小人位置,路
 int wzX = 1;
 int wzY = 1;
 int nextwzX = wzX;
 int nextwzY = wzY;
 char lu = ' ';
 char fx =0;
 char ch;
 int box = 'X';
 int boxX = 2;
 int boxY = 3;
 int nextboxX = boxX;
 int nextboxY = boxY;
 //进入循环
 while (1) {
 printf("请控制小人移动:w:上 s:下 a:左 d:右 q:退出\n");
 scanf("%c",&fx);
 scanf("%c",&ch);
 
 nextwzX = wzX;
 nextwzY = wzY;
 //进入switch分支,判断方向
 switch (fx) {
 case 'w':
 case 'W':
 {
 nextwzX--;
 
 break;
 }
 case 's':
 case 'S':
 {
 nextwzX++;
 
 break;
 }
 case 'a':
 case 'A':
 {
 nextwzY--;
 
 break;
 }
 case 'd':
 case 'D':
 {
 nextwzY++;
 break;
 }
 case 'q':
 case 'Q':
 printf("游戏已退出");
 return 0;
 default:
 continue;
 }
 //  如果小人要移动的位置是路
 if (map[nextwzX][nextwzY] == lu) {
 //移动小人位置
 Move( map,wzX,wzY,nextwzX,nextwzY);
 //从新保存小人位置
 wzX = nextwzX;
 wzY = nextwzY;
 //如果是箱子,就推动箱子
 }else if (map[nextwzX][nextwzY] == box){
 //计算箱子的下一位置
 nextboxX = boxX + (boxX - wzX);
 nextboxY = boxY + (boxY - wzY);
 
 //如果箱子的下一个位置是路
 if (map[nextboxX][nextboxY] == lu){
 //移动箱子
 Move(map, boxX, boxY, nextboxX, nextboxY);
 //移动小人
 Move( map,wzX,wzY,boxX,boxY);
 
 //重新定义小人和箱子的位置
 wzX = nextwzX;
 wzY = nextwzY;
 
 boxX = nextboxX;
 boxY = nextboxY;
 }
 }
 
 //重新打印地图
 printfMap(map);
 
 //如果boxY == 9,即走出了迷宫,跳出循环
 if (boxY == 9) {
 printf("恭喜你走出来了!!!");
 return 0;
 }
 
 
 }
 return 0;
 }
 
 
 
 BUG:一次输入多个方向会被储存在SCANF缓存区,影响下次移动  求大神解决
 | 
 |