【C语言-推箱子】

推箱子小游戏,C语言实现。

只有一关,但是有点难,想要挑战的可以试一试。
运行截图:
在这里插入图片描述
游戏源代码如下:

#include <conio.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

#define ROWMAX 12
#define COLUMNMAX 9
#define BLOCKTYPENUM 7

typedef enum {
    BLANKS,
    _WALL_,
    _BOXS_,
    TARGET,
    ARRIVE,
    PEOPLE,
    PEOTAR
} BLOCKTYPE;

char* displayImage[BLOCKTYPENUM] = {" ", "☒", "☐", "♖", "♜", "♘", "♞"};

typedef struct {
    int peopleCoordX;
    int peopleCoordY;
    int remainingTargets;
    int steps;
    int CoordX_Change;
    int CoordY_Change;
} GameData;

int levelOne[ROWMAX][COLUMNMAX] = {
    {BLANKS, BLANKS, _WALL_, _WALL_, _WALL_, _WALL_, _WALL_, BLANKS, BLANKS},
    {BLANKS, BLANKS, _WALL_, BLANKS, TARGET, BLANKS, _WALL_, BLANKS, BLANKS},
    {_WALL_, _WALL_, _WALL_, _BOXS_, BLANKS, _BOXS_, _WALL_, _WALL_, _WALL_},
    {_WALL_, BLANKS, BLANKS, _BOXS_, BLANKS, _BOXS_, BLANKS, BLANKS, _WALL_},
    {_WALL_, BLANKS, TARGET, BLANKS, TARGET, BLANKS, TARGET, BLANKS, _WALL_},
    {_WALL_, _WALL_, _WALL_, BLANKS, _BOXS_, BLANKS, _WALL_, _WALL_, _WALL_},
    {BLANKS, BLANKS, _WALL_, BLANKS, _BOXS_, BLANKS, _WALL_, BLANKS, BLANKS},
    {BLANKS, BLANKS, _WALL_, _BOXS_, TARGET, _BOXS_, _WALL_, BLANKS, BLANKS},
    {BLANKS, BLANKS, _WALL_, BLANKS, TARGET, BLANKS, _WALL_, BLANKS, BLANKS},
    {BLANKS, BLANKS, _WALL_, _BOXS_, TARGET, _BOXS_, _WALL_, BLANKS, BLANKS},
    {BLANKS, BLANKS, _WALL_, BLANKS, PEOPLE, BLANKS, _WALL_, BLANKS, BLANKS},
    {BLANKS, BLANKS, _WALL_, _WALL_, _WALL_, _WALL_, _WALL_, BLANKS, BLANKS}};

void GameDisplay();
void DrawGameMap(int* ptr, int number, GameData* GData);
void InitGameData(GameData* GData);
void SetMoveEvent(GameData* GData);
void MoveEventHandler(GameData* GData);
bool JudgeGameIsSuccess(GameData* GData);

int main() {
    system("chcp 65001");
    GameData G1 = {0};
    InitGameData(&G1);
    GameDisplay();
    while (true) {
        system("cls");
        DrawGameMap(levelOne[0], sizeof(levelOne) / sizeof(levelOne[0][0]),
                    &G1);
        if (JudgeGameIsSuccess(&G1)) {
            printf("你赢了\n");
            return 0;
        }
        MoveEventHandler(&G1);
    }
    return 0;
}

void GameDisplay() {
    system("cls");
    printf("|=============================|\n");
    printf("|===========推箱子============|\n");
    printf("|W、S、A、D 控制移动,P退出游戏|\n");
    printf("|=========按任意键开始========|\n");
    printf("|=============================|\n");
    getch();
}

void DrawGameMap(int* ptr, int number, GameData* GData) {
    int flag = 0;
    while (number--) {
        printf("%s  ", displayImage[*ptr++]);
        if (COLUMNMAX == ++flag) {
            printf("\n");
            flag = 0;
        }
    }
    printf("当前步数:%d", GData->steps);
}

void InitGameData(GameData* GData) {
    GData->steps = 0;
    GData->CoordX_Change = 0;
    GData->CoordY_Change = 0;
    for (int i = 0; i < ROWMAX; i++) {
        for (int j = 0; j < COLUMNMAX; j++) {
            switch (levelOne[i][j]) {
                case TARGET:
                    GData->remainingTargets++;
                    break;
                case PEOPLE:
                    GData->peopleCoordX = i;
                    GData->peopleCoordY = j;
                    break;
                default:
                    break;
            }
        }
    }
}

void SetMoveEvent(GameData* GData) {
    char c;
    c = getch();
    if (c == 'w' || c == 'W') {
        GData->CoordX_Change = -1;
        GData->CoordY_Change = 0;
    } else if (c == 's' || c == 'S') {
        GData->CoordX_Change = 1;
        GData->CoordY_Change = 0;
    } else if (c == 'a' || c == 'A') {
        GData->CoordX_Change = 0;
        GData->CoordY_Change = -1;
    } else if (c == 'd' || c == 'D') {
        GData->CoordX_Change = 0;
        GData->CoordY_Change = 1;
    } else if (c == 'p' || c == 'P') {
        exit(-1);
    }
}

void MoveEventHandler(GameData* GData) {
    SetMoveEvent(GData);
    int MoveOneTimesX = GData->peopleCoordX + GData->CoordX_Change;
    int MoveOneTimesY = GData->peopleCoordY + GData->CoordY_Change;
    int MoveTwoTimesX = GData->peopleCoordX + GData->CoordX_Change * 2;
    int MoveTwoTimesY = GData->peopleCoordY + GData->CoordY_Change * 2;
    int lastStep = GData->steps;
    if (levelOne[MoveOneTimesX][MoveOneTimesY] == BLANKS) {
        GData->steps++;
        levelOne[MoveOneTimesX][MoveOneTimesY] = PEOPLE;
    } else if (levelOne[MoveOneTimesX][MoveOneTimesY] == TARGET) {
        GData->steps++;
        levelOne[MoveOneTimesX][MoveOneTimesY] = PEOTAR;
    } else if (levelOne[MoveOneTimesX][MoveOneTimesY] == _BOXS_) {
        if (levelOne[MoveTwoTimesX][MoveTwoTimesY] == BLANKS) {
            levelOne[MoveOneTimesX][MoveOneTimesY] = PEOPLE;
            levelOne[MoveTwoTimesX][MoveTwoTimesY] = _BOXS_;
            GData->steps++;
        } else if (levelOne[MoveTwoTimesX][MoveTwoTimesY] == TARGET) {
            GData->remainingTargets--;
            GData->steps++;
            levelOne[MoveOneTimesX][MoveOneTimesY] = PEOPLE;
            levelOne[MoveTwoTimesX][MoveTwoTimesY] = ARRIVE;
        }
    } else if (levelOne[MoveOneTimesX][MoveOneTimesY] == ARRIVE) {
        if (levelOne[MoveTwoTimesX][MoveTwoTimesY] == BLANKS) {
            GData->steps++;
            GData->remainingTargets++;
            levelOne[MoveOneTimesX][MoveOneTimesY] = PEOTAR;
            levelOne[MoveTwoTimesX][MoveTwoTimesY] = _BOXS_;
        } else if (levelOne[MoveTwoTimesX][MoveTwoTimesY] == TARGET) {
            GData->steps++;
            levelOne[MoveOneTimesX][MoveOneTimesY] = PEOTAR;
            levelOne[MoveTwoTimesX][MoveTwoTimesY] = ARRIVE;
        }
    }
    if (lastStep != GData->steps) {
        if (levelOne[GData->peopleCoordX][GData->peopleCoordY] == PEOPLE) {
            levelOne[GData->peopleCoordX][GData->peopleCoordY] = BLANKS;
        } else if (levelOne[GData->peopleCoordX][GData->peopleCoordY] ==
                   PEOTAR) {
            levelOne[GData->peopleCoordX][GData->peopleCoordY] = TARGET;
        }
        GData->peopleCoordX += GData->CoordX_Change;
        GData->peopleCoordY += GData->CoordY_Change;
    }
}

bool JudgeGameIsSuccess(GameData* GData) {
    if (!GData->remainingTargets) {
        return true;
    } else {
        return false;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值