关闭

c实现 推箱子游戏

标签: 推箱子游戏c语言
258人阅读 评论(0) 收藏 举报

#define kRows 10

#define kCols 11


/*

    打印地图

    @param map 地图的数组

 */

void printMap(char map[kRows][kCols]){

    for (int i=0; i<kRows; i++) {

        printf("%s\n",map[i]);  // 由于map[i]代表每一行的首地址,遇到\0结束

    }


}


/*

    移动的函数

 

 */

void move1(char map[kRows][kCols],int oldX,int oldY,int newX,int newY){

    // 交换两个位置的字符

    char temp;

    temp = map[oldX][oldY];

    map[oldX][oldY] = map[newX][newY];

    map[newX][newY] = temp;

}


/*

    推箱子游戏

 */

int demo8(){

    

    // ******** 定义变量,保存地图,位置信息 ********

    

    //1、定义地图

    char map[kRows][kCols]={

        "##########",

        "#0 ####  #",

        "# X####  #",

        "#        #",

        "######   #",

        "#  ####  #",

        "#        #",

        "#   ######",

        "#         ",

        "##########",

        

    };

    

    //定义变量保存位置信息

    

    //定义小人当前位置信息

    int personX = 1;

    int personY = 1;

    //小人将要移动的下一个位置信息

    int personNestX = personX;

    int personNestY = personY;

    

    //定义箱子的当前位置

    int boxX = 2;

    int boxY = 2;

    

    //定义变量接收用户输入方向

    char direction;

    

    //定义路的字符

    char street = ' ';

    

    //定箱子的字符

    char box ='X';

    

    // ******** 打印地图 ********

    //2、打印一边地图

    printMap(map);

    

    printf("请控制小人移动:w= s= s= d= q=退出\n");

    

    // ******** 编写循环控制程序 ********

    while (1) {

        

    //3,接收用户输入的方向

        scanf("%c",&direction);

        getchar();  //获取一个字符 吸收回车符

        

        //防止穿墙

        personNestX = personX;

        personNestY = personY;

        

    //4、判断方向

        switch (direction) {

            case 'w':

            case 'W':

                //下一个位置 -1

                personNestX--;

                

                break;

            case 's':

            case 'S':

                personNestX++;

                

                break;

            case 'a':

            case 'A':

                personNestY--;

                

                break;

            case 'd':

            case 'D':

                personNestY++;

                

                break;

            case 'q':

            case 'Q':

                return 0;

                break;

            default:

                break;


        }

    

    

    //5、根据用户输入的方向 判断如何移动

        

        //      先判断小人的下个位置 是否是路

        

        //          是路:先让小人移动

        

        if(map[personNestX][personNestY]==street){

            //移动,让小人和路进行交换

            move1(map,personX,personY,personNestX,personNestY);

            

            //重新调整小人的位置

            personX = personNestX;

            personY = personNestY;

            

        }else if(map[personNestX][personNestY]==box){

         

    

    //          不是路:

    // ******** 判断模块 ********

    //                  再次判断是否是箱子

    //                      如果是箱子,计算箱子的下一个位置

            int boxNextX = boxX + (boxX - personX);

            int boxNextY = boxY + (boxY - personY);

            

    //                          再次判断箱子的下一个位置是否是路

            if (map[boxNextX][boxNextY]==street) {

    //                              如果是路,要移动小人和箱子

    //                                  如何移动小人和箱子?

    //                                  1)移动箱子到箱子的下一个位置

                move1(map, boxX, boxY, boxNextX, boxNextY);

    //                                  2)让小人移动到箱子原来的位置

                move1(map, personX, personY, boxX, boxY);

                

                //重新调整 箱子和小人的位置

                personX = personNestX;

                personY = personNestY;

                

                boxX = boxNextX;

                boxY = boxNextY;

            }

    //                      如果不是箱子,什么也不干

        }

    

    

    

    // ******** 刷新地图 ********

        printMap(map);

    // ******** 判断是否走出来 ********

        if(boxY == kCols-2){

            printf("哈哈!你成功完成任务!\n");

            break;

        }

    }

    

    return 0;

    

    

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10708次
    • 积分:425
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章存档