c实现 推箱子游戏

#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;

    

    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值