C语言实现简单的推箱子小游戏攻略
简介
推箱子游戏是一种经典的益智类小游戏。本攻略将介绍如何使用C语言实现简单的推箱子游戏。
程序大致流程
- 定义地图,使用数组保存地图信息。
- 根据地图信息输出地图。
- 玩家输入移动命令,判断是否合法。
- 移动箱子,更新地图信息。
- 输出更新后的地图。
- 判断是否通关。
- 如过关,输出相应信息,游戏结束。
程序具体实现
定义地图
首先要定义游戏地图。使用二维数组来存储每个格子的信息,使用数字表示不同的格子类型。如下所示:
#define WIDTH 10
#define HEIGHT 10
int map[HEIGHT][WIDTH] = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,2,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},
};
其中,1表示墙,0表示空地,2表示箱子,3表示目标点。
显示地图
接下来,编写显示地图的函数:
void print_map()
{
for(int i=0; i<HEIGHT; i++) {
for(int j=0; j<WIDTH; j++) {
switch(map[i][j]) {
case 0: // 空地
printf(" ");
break;
case 1: // 墙
printf("#");
break;
case 2: // 箱子
printf("$");
break;
case 3: // 目标点
printf(".");
break;
case 4: // 箱子在目标点
printf("*");
break;
case 5: // 玩家
printf("@");
break;
case 6: // 玩家在目标点
printf("+");
break;
}
}
printf("\n");
}
}
玩家移动
接下来编写玩家移动的函数。首先,定义一个结构体来表示坐标:
struct point {
int x;
int y;
};
然后,编写移动函数:
void move_player(int dx, int dy)
{
struct point player_pos; // 玩家当前位置
struct point next_pos; // 玩家要移动到的位置
struct point box_pos; // 箱子的位置
// 找到玩家和箱子的位置
for(int i=0; i<HEIGHT; i++) {
for(int j=0; j<WIDTH; j++) {
if(map[i][j] == 5 || map[i][j] == 6) {
player_pos.x = j;
player_pos.y = i;
}
if(map[i][j] == 2 || map[i][j] == 4) {
box_pos.x = j;
box_pos.y = i;
}
}
}
next_pos.x = player_pos.x + dx;
next_pos.y = player_pos.y + dy;
// 判断是否越界
if(next_pos.x < 0 || next_pos.x >= WIDTH || next_pos.y < 0 || next_pos.y >= HEIGHT) {
return;
}
// 判断目标位置是否可以移动到
if(map[next_pos.y][next_pos.x] == 1) { // 目标位置是墙
return;
}
if(map[next_pos.y][next_pos.x] == 2 || map[next_pos.y][next_pos.x] == 4) { // 目标位置是箱子
struct point next_box_pos;
next_box_pos.x = box_pos.x + dx;
next_box_pos.y = box_pos.y + dy;
// 判断箱子是否越界
if(next_box_pos.x < 0 || next_box_pos.x >= WIDTH || next_box_pos.y < 0 || next_box_pos.y >= HEIGHT) {
return;
}
// 判断箱子下一个位置是否可以移动到
if(map[next_box_pos.y][next_box_pos.x] == 1 || map[next_box_pos.y][next_box_pos.x] == 2 || map[next_box_pos.y][next_box_pos.x] == 4) {
return;
}
// 更新箱子和玩家的位置
if(map[next_box_pos.y][next_box_pos.x] == 3) { // 箱子要移到目标点上
map[next_box_pos.y][next_box_pos.x] = 4;
} else {
map[next_box_pos.y][next_box_pos.x] = 2;
}
if(map[box_pos.y][box_pos.x] == 4) { // 箱子原来在目标点上
map[box_pos.y][box_pos.x] = 3;
} else {
map[box_pos.y][box_pos.x] = 0;
}
if(map[player_pos.y][player_pos.x] == 6) { // 玩家原来在目标点上
map[player_pos.y][player_pos.x] = 3;
} else {
map[player_pos.y][player_pos.x] = 0;
}
if(map[next_pos.y][next_pos.x] == 3) { // 玩家要移到目标点上
map[next_pos.y][next_pos.x] = 6;
} else {
map[next_pos.y][next_pos.x] = 5;
}
} else { // 直接移动玩家
if(map[player_pos.y][player_pos.x] == 6) { // 玩家原来在目标点上
map[player_pos.y][player_pos.x] = 3;
} else {
map[player_pos.y][player_pos.x] = 0;
}
if(map[next_pos.y][next_pos.x] == 3) { // 玩家要移到目标点上
map[next_pos.y][next_pos.x] = 6;
} else {
map[next_pos.y][next_pos.x] = 5;
}
}
}
判断是否通关
判断是否通关的函数十分简单,只需遍历整个地图,判断是否还有箱子没有放到目标点上:
int check_win()
{
for(int i=0; i<HEIGHT; i++) {
for(int j=0; j<WIDTH; j++) {
if(map[i][j] == 2) { // 发现有一个箱子没有放到目标点上
return 0;
}
}
}
return 1; // 没有箱子没有放到目标点上,通关
}
示例
下面给出两个玩家移动的示例。
假设当前的地图如下所示:
int map[HEIGHT][WIDTH] = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,0,2,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,2,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},
};
玩家输入w键(上移),游戏状态将变成:
int map[HEIGHT][WIDTH] = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,2,1,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,2,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},
};
玩家输入a键(左移),游戏将变成:
int map[HEIGHT][WIDTH] = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,2,0,1,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,2,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},
};
以上就是实现简单的推箱子小游戏的攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现简单的推箱子小游戏 - Python技术站