c实现 推箱子游戏
2015-07-09 13:55
701 查看
#define kRows 10
#define kCols 11
/*
打印地图
@param map 地图的数组
*/
void printMap(char map[kRows][kCols]){
for (int i=0; i<kRows; i++) {
printf("%s\n",map[i]);
// 由于map[i]代表每一行的首地址,遇到\0结束
}
}
/*
移动的函数
*/
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 demo8(){
// ******** 定义变量,保存地图,位置信息 ********
//1、定义地图
char map[kRows][kCols]={
"##########",
"#0 #### #",
"# X#### #",
"# #",
"###### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########",
};
//定义变量保存位置信息
//定义小人当前位置信息
int personX =
1;
int personY =
1;
//小人将要移动的下一个位置信息
int personNestX = personX;
int personNestY = personY;
//定义箱子的当前位置
int boxX =
2;
int boxY =
2;
//定义变量接收用户输入方向
char direction;
//定义路的字符
char street =
' ';
//定箱子的字符
char box ='X';
// ******** 打印地图 ********
//2、打印一边地图
printMap(map);
printf("请控制小人移动:w=上 s=下
s=左 d=右 q=退出\
4000
n");
// ******** 编写循环控制程序 ********
while (1) {
//3,接收用户输入的方向
scanf("%c",&direction);
getchar();
//获取一个字符
吸收回车符
//防止穿墙
personNestX = personX;
personNestY = personY;
//4、判断方向
switch (direction) {
case
'w':
case
'W':
//下一个位置 -1
personNestX--;
break;
case
's':
case
'S':
personNestX++;
break;
case
'a':
case
'A':
personNestY--;
break;
case
'd':
case
'D':
personNestY++;
break;
case
'q':
case
'Q':
return
0;
break;
default:
break;
}
//5、根据用户输入的方向
判断如何移动
// 先判断小人的下个位置
是否是路
//
是路:先让小人移动
if(map[personNestX][personNestY]==street){
//移动,让小人和路进行交换
move1(map,personX,personY,personNestX,personNestY);
//重新调整小人的位置
personX = personNestX;
personY = personNestY;
}else
if(map[personNestX][personNestY]==box){
// 不是路:
// ******** 判断模块 ********
//
再次判断是否是箱子
//
如果是箱子,计算箱子的下一个位置
int boxNextX = boxX + (boxX - personX);
int boxNextY = boxY + (boxY - personY);
//
再次判断箱子的下一个位置是否是路
if (map[boxNextX][boxNextY]==street) {
//
如果是路,要移动小人和箱子
//
如何移动小人和箱子?
// 1)移动箱子到箱子的下一个位置
move1(map, boxX, boxY, boxNextX, boxNextY);
// 2)让小人移动到箱子原来的位置
move1(map, personX, personY, boxX, boxY);
//重新调整
箱子和小人的位置
personX = personNestX;
personY = personNestY;
boxX = boxNextX;
boxY = boxNextY;
}
//
如果不是箱子,什么也不干
}
// ******** 刷新地图 ********
printMap(map);
// ******** 判断是否走出来 ********
if(boxY ==
kCols-2){
printf("哈哈!你成功完成任务!\n");
break;
}
}
return
0;
}
#define kCols 11
/*
打印地图
@param map 地图的数组
*/
void printMap(char map[kRows][kCols]){
for (int i=0; i<kRows; i++) {
printf("%s\n",map[i]);
// 由于map[i]代表每一行的首地址,遇到\0结束
}
}
/*
移动的函数
*/
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 demo8(){
// ******** 定义变量,保存地图,位置信息 ********
//1、定义地图
char map[kRows][kCols]={
"##########",
"#0 #### #",
"# X#### #",
"# #",
"###### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########",
};
//定义变量保存位置信息
//定义小人当前位置信息
int personX =
1;
int personY =
1;
//小人将要移动的下一个位置信息
int personNestX = personX;
int personNestY = personY;
//定义箱子的当前位置
int boxX =
2;
int boxY =
2;
//定义变量接收用户输入方向
char direction;
//定义路的字符
char street =
' ';
//定箱子的字符
char box ='X';
// ******** 打印地图 ********
//2、打印一边地图
printMap(map);
printf("请控制小人移动:w=上 s=下
s=左 d=右 q=退出\
4000
n");
// ******** 编写循环控制程序 ********
while (1) {
//3,接收用户输入的方向
scanf("%c",&direction);
getchar();
//获取一个字符
吸收回车符
//防止穿墙
personNestX = personX;
personNestY = personY;
//4、判断方向
switch (direction) {
case
'w':
case
'W':
//下一个位置 -1
personNestX--;
break;
case
's':
case
'S':
personNestX++;
break;
case
'a':
case
'A':
personNestY--;
break;
case
'd':
case
'D':
personNestY++;
break;
case
'q':
case
'Q':
return
0;
break;
default:
break;
}
//5、根据用户输入的方向
判断如何移动
// 先判断小人的下个位置
是否是路
//
是路:先让小人移动
if(map[personNestX][personNestY]==street){
//移动,让小人和路进行交换
move1(map,personX,personY,personNestX,personNestY);
//重新调整小人的位置
personX = personNestX;
personY = personNestY;
}else
if(map[personNestX][personNestY]==box){
// 不是路:
// ******** 判断模块 ********
//
再次判断是否是箱子
//
如果是箱子,计算箱子的下一个位置
int boxNextX = boxX + (boxX - personX);
int boxNextY = boxY + (boxY - personY);
//
再次判断箱子的下一个位置是否是路
if (map[boxNextX][boxNextY]==street) {
//
如果是路,要移动小人和箱子
//
如何移动小人和箱子?
// 1)移动箱子到箱子的下一个位置
move1(map, boxX, boxY, boxNextX, boxNextY);
// 2)让小人移动到箱子原来的位置
move1(map, personX, personY, boxX, boxY);
//重新调整
箱子和小人的位置
personX = personNestX;
personY = personNestY;
boxX = boxNextX;
boxY = boxNextY;
}
//
如果不是箱子,什么也不干
}
// ******** 刷新地图 ********
printMap(map);
// ******** 判断是否走出来 ********
if(boxY ==
kCols-2){
printf("哈哈!你成功完成任务!\n");
break;
}
}
return
0;
}
相关文章推荐
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 探讨C语言的那些小秘密之断言
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- C语言进制转换代码分享
- 基于C语言fflush()函数的使用详解
- C语言单链队列的表示与实现实例详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy
- Lua教程(四):在Lua中调用C语言、C++的函数
- C语言求幂计算的高效解法
- C语言实现输入一颗二元查找树并将该树转换为它的镜像
- 12个关于C语言的有趣问答