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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#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缓存区,影响下次移动  求大神解决

1 个回复

倒序浏览
char map[Kod][Lod]={
        "##########",
        "#0  ###          #",
        "#  X###         #",
        "#                      #",
        "######       #",
        "#  ####        #",
        "#                     #",
        "#      ######",
        "#                         ",
        "##########"
    };


地图自己调一下   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马