推箱子游戏
跟着视频慢慢敲出来的,虽然游戏简单,但运行成功的那一刻还是蛮有成就感的。
#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;
}