黑马程序员技术交流社区
标题:
《推箱子》游戏
[打印本页]
作者:
堕落天使
时间:
2015-9-17 19:46
标题:
《推箱子》游戏
代码稍微多一些的一个小游戏,也可以说是《迷宫》游戏的升级版。注意数组名当函数参数是地址传递。
#include <stdio.h>
#define kRows 10
#define kCols 11
/**
* 打印地图
*
* @param map 地图数组
*/
void map1(char map[kRows][kCols]){
for (int i =0; i<10; i++) {
printf("%s\n",map[i]);
}
}
/**
* 移动小人,或者箱子
*
* @param map 地图数组
* @param oldX 当前的位置x
* @param oldY 当前位置y
* @param newX 移动后位置x
* @param newY 移动后位置y
*/
void move1(char map[kRows][kCols],int oldX,int oldY,int newX,int newY){
char temp;
temp=map[oldX][oldY];
map[oldX][oldY]=map[newX][newY];
map[newX][newY]=temp;
}
int main(int argc, const char * argv[]) {
char map[kRows][kCols]={
"##########",
"#o #### #",
"# X#### #",
"# #",
"###### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########",};
int personX=1;
int personY=1;
int personNextX =1;
int personNextY =1;
char direction,ch1;
char street = ' ';
char box = 'X';
int boxX=2;
int boxY=2;
int boxNextX,boxNextY;
printf("请控制小人移动:w上,s下,a左,d右!\n");
while (1) {
map1(map);
scanf("%c,%c",&direction,&ch1);//ch1接受回车符。
//防止小人碰到墙之后,无法正常移动小人。
personNextX=personX;
personNextY=personY;
switch (direction) {
case 'w':
case 'W':
personNextX=personX-1;
break;
case 's':
case 'S':
personNextX=personX+1;
break;
case 'a':
case 'A':
personNextY=personY-1;
break;
case 'd':
case 'D':
personNextY=personY+1;
break;
case 'q':
case 'Q':
printf("你退出了游戏!\n");
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){
boxNextX=boxX+(boxX-personX);
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;
}
}
if (boxY==kCols-2) {
printf("你出来了!\n");
break;
}
}
return 0;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2