应用:推箱子游戏

本文分享了一个使用C语言编写的推箱子游戏源代码。通过简单的控制台界面实现了游戏的基本功能,包括移动人物、推箱子等操作,并展示了如何用代码实现这一经典游戏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推箱子游戏


跟着视频慢慢敲出来的,虽然游戏简单,但运行成功的那一刻还是蛮有成就感的。

#include <stdio.h>

#define ROW 10

#define COL 11


/**

 *  打印地图

 *

 *  @param map 传入的地图

 */

void printMap(char map[ROW][COL]){

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

        printf("%s\n", map [i]);

    }

}


/**

 *  移动到下一位置

 *

 *  @param map  地图

 *  @param oldX 移动前x

 *  @param oldY 移动前y

 *  @param newX 移动后x

 *  @param newY 移动后y

 */

void move1(char map[ROW][COL], int oldX, int oldY, int newX, int newY){

    // 交换位置

    int temp;

    temp = map[oldX][oldY];

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

    map[newX][newY] = temp;

    

    

}

int main(int argc, const char * argv[]) {

    

    //********** 定义变量 *************

    // 定义地图

    char map[ROW][COL] ={

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

        "#O ####  #",

        "# X####  #",

        "#        #",

        "######   #",

        "#  ####  #",

        "#        #",

        "#   ######",

        "#         ",

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

        

    };

    

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

    // 定义小人当前位置

    int personX = 1;

    int personY = 1;

    

    // 定义小人下一位置

    int personNextX = personX;

    int personNextY = personY;

    

    // 定义箱子当前位置

    int boxX = 2;

    int boxY = 2;

    

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

    char direction;

    

    // 定义路

    char street = ' ';

    

    // 定义箱子

    char box = 'X';

    

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

    // 打印一遍地图

    printMap(map);

    

    //********** 循环控制 *************

    // 提示用户输入指令

    printf("请输入指令:w.  s.  a.  d.  q.退出\n");

    

    // 进行循环控制

    while (1) {

        

        

        // 接收用户输入的指令

        scanf("%c", &direction);

        getchar(); // 用来吸收多余的‘\n’

        

        // 判断用户输入的指令

        switch (direction) {

            case 'w':

            case 'W':

                personNextX --;

                break;

                

            case 's':

            case 'S':

                personNextX ++;

                break;

                

            case 'a':

            case 'A':

                personNextY --;

                break;

                

            case 'd':

            case 'D':

                personNextY ++;

                break;

                

            case 'q':

            case 'Q':

                printf("程序已经退出。");

                return 0;

                

            default:

                break;

        }

        

        //********* 判断移动情况 ***********

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

        if (map[personNextX][personNextY] == street) {

            // 如果是路,先让小人移动

            move1(map, personX, personY, personNextX, personNextY);

            // 重新保存小人位置

            personX = personNextX;

            personY = personNextY;

        } else if (map[personNextX][personNextY] == box){ // 如果不是路,再判断是否是箱子

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

            int boxNextX = boxX + (boxX - personX);

            int boxNextY = boxY + (boxY - personY);

            

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

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

                // 如果箱子的下一位置是路,移动箱子和小人

                move1(map, boxX, boxY, boxNextX, boxNextY); // 先移动箱子到箱子的下一位置

                move1(map, personX, personY, personNextX, personNextY); // 然后移动小人到箱子的位置

                

                // 重新保存箱子和小人的位置

                personX = personNextX;

                personY = personNextY;

                boxX = boxNextX;

                boxY = boxNextY;

            }

        } else { // 如果不是路也不是箱子,那就是墙壁

            // 小人保持当前位置不变

            personNextX = personX;

            personNextY = personY;

        }

        

        //********* 重绘地图 **************

        // 重绘地图

        printMap(map);

        

        //********* 判断箱子是否移出 *******

        // 判断箱子是否推出

        if (boxY == COL - 2) {

            printf("你推出来了!");

            break;

        }

    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值