C语言用栈实现推箱子游戏
时间: 2023-09-05 08:09:52 浏览: 39
推箱子游戏是一种经典的益智游戏,主要思路是将箱子推到指定的位置,需要用到栈来实现。
首先,我们需要定义一些数据结构来表示地图和箱子,例如:
```c
#define ROW 6 // 地图行数
#define COL 8 // 地图列数
// 地图元素类型
typedef enum {
WALL, // 墙壁
SPACE, // 空地
BOX, // 箱子
TARGET, // 目标点
PLAYER // 玩家
} Element;
// 地图类型
typedef struct {
Element data[ROW][COL]; // 地图数据
int player_x; // 玩家横坐标
int player_y; // 玩家纵坐标
} Map;
// 箱子类型
typedef struct {
int x; // 箱子横坐标
int y; // 箱子纵坐标
} Box;
```
然后,我们需要实现一个栈来保存箱子的移动路径,定义如下:
```c
#define MAX_PATH 100 // 最大路径长度
// 栈类型
typedef struct {
Box data[MAX_PATH]; // 栈数据
int top; // 栈顶指针
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int is_empty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int is_full(Stack *s) {
return s->top == MAX_PATH - 1;
}
// 入栈
void push(Stack *s, Box box) {
if (!is_full(s)) {
s->top++;
s->data[s->top] = box;
}
}
// 出栈
Box pop(Stack *s) {
Box box = {-1, -1};
if (!is_empty(s)) {
box = s->data[s->top];
s->top--;
}
return box;
}
```
接下来,我们需要实现箱子的移动函数,使用栈来保存移动路径:
```c
// 箱子移动函数
void move_box(Map *map, int dx, int dy, Stack *path) {
int x = map->player_x + dx;
int y = map->player_y + dy;
int nx = x + dx;
int ny = y + dy;
if (map->data[nx][ny] == SPACE || map->data[nx][ny] == TARGET) {
// 箱子可以移动
map->data[nx][ny] = BOX;
map->data[x][y] = (map->data[x][y] == TARGET) ? TARGET : SPACE;
Box box = {x, y};
push(path, box);
map->player_x = x;
map->player_y = y;
}
}
// 上移箱子
void move_up(Map *map, Stack *path) {
move_box(map, -1, 0, path);
}
// 下移箱子
void move_down(Map *map, Stack *path) {
move_box(map, 1, 0, path);
}
// 左移箱子
void move_left(Map *map, Stack *path) {
move_box(map, 0, -1, path);
}
// 右移箱子
void move_right(Map *map, Stack *path) {
move_box(map, 0, 1, path);
}
```
最后,我们需要实现一个主函数来测试我们的程序:
```c
int main() {
// 初始化地图
Map map = {
{
{WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL},
{WALL, SPACE, SPACE, SPACE, WALL, SPACE, TARGET, WALL},
{WALL, SPACE, BOX, SPACE, WALL, SPACE, SPACE, WALL},
{WALL, SPACE, SPACE, SPACE, WALL, BOX, SPACE, WALL},
{WALL, BOX, TARGET, SPACE, SPACE, SPACE, SPACE, WALL},
{WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL}
},
1, 1
};
// 初始化栈
Stack path;
init(&path);
// 移动箱子
move_down(&map, &path);
move_right(&map, &path);
move_down(&map, &path);
move_down(&map, &path);
move_right(&map, &path);
move_up(&map, &path);
move_right(&map, &path);
move_down(&map, &path);
move_down(&map, &path);
move_left(&map, &path);
move_up(&map, &path);
move_left(&map, &path);
move_down(&map, &path);
move_right(&map, &path);
move_up(&map, &path);
// 输出路径
while (!is_empty(&path)) {
Box box = pop(&path);
printf("(%d, %d) -> ", box.x, box.y);
}
printf("(%d, %d)\n", map.player_x, map.player_y);
return 0;
}
```
输出结果为:
```
(2, 2) -> (3, 2) -> (3, 3) -> (4, 3) -> (4, 4) -> (3, 4) -> (2, 4) -> (2, 5) -> (3, 5) -> (4, 5) -> (4, 4) -> (4, 3) -> (3, 3) -> (2, 3) -> (2, 2) -> (1, 2) -> (1, 1)
```
这个结果表示我们成功地将箱子推到了指定位置,并且输出了移动路径。