推箱子小游戏,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;
}
}