您的位置:首页 > 其它

应用:推箱子游戏

2015-05-18 23:59 176 查看
推箱子游戏

跟着视频慢慢敲出来的,虽然游戏简单,但运行成功的那一刻还是蛮有成就感的。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: