黑马程序员技术交流社区
标题:
推箱子游戏,谁能优化一下,
[打印本页]
作者:
x_starry
时间:
2016-4-14 23:22
标题:
推箱子游戏,谁能优化一下,
按照老师的思路自己巧了下来,看看能不能继续
//推箱子游戏
#include<stdio.h>
#include<stdlib.h>
#define rows 10
#define cols 11
void printMap(char map[rows][cols]);
void go(char map[rows][cols],char currentX,char currentY,char nextX,char nextY);
int main()
{
//定义地图
char theMapOfPushBox[rows][cols] =
{
"##########",
"#0 #### #",
"# X#### #",
"# #",
"###### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########"
};
//定义变量存储小人的当前位置
int personCurrentX = 1;
int personCurrentY = 1;
//定义变量存储小人下一步的位置
int personNextX = personCurrentX;
int personNextY = personCurrentY;
//定义变量存储箱子的当前位置
int boxCurrentX = 2;
int boxCurrentY = 2;
//定义变量存储箱子的下一步位置
int boxNextX = boxCurrentX;
int boxNextY = boxCurrentY;
//定义变量存储用户输入的方向
char direction = '\0';
//定义变量存储是路的标志
char road = ' ';
//定义变量存储墙的标志
char wall = '#';
while(1)
{
//清屏
system("clear");
//调用函数打印地图
printMap(theMapOfPushBox);
//判断箱子的位置是否被推到了出口处
//如果推到了出口处就退出循环,并打印文字
if(boxCurrentX == 8 && boxCurrentY == 9)
{
printf("恭喜你,成功的把箱子推出了迷宫!\n");
break;
}
//从用户获取移动方向
printf("请输入移动方向:w/上 s/下 a/左 d/右 q/退出:\n");
scanf("%c",&direction);
//根据用户输入的方向判断小人应该做出的动作
switch(direction)
{
case 'w':
case 'W':
personNextX = personCurrentX - 1;
break;
case 's':
case 'S':
personNextX = personCurrentX + 1;
break;
case 'a':
case 'A':
personNextY = personCurrentY - 1;
break;
case 'd':
case 'D':
personNextY = personCurrentY + 1;
break;
case 'q':
case 'Q':
printf("笨蛋!你正在退出......\n");
return 0;
}
//根据相应的动作更新地图中的数据
//如果下一步是路
if(theMapOfPushBox[personNextX][personNextY] == road)
{
//那么就直接移动小人
go(theMapOfPushBox,personCurrentX,personCurrentY,personNextX,personNextY);
personCurrentX = personNextX;
personCurrentY = personNextY;
}
//如果下一步是箱子
else if(theMapOfPushBox[personNextX][personNextY] == theMapOfPushBox[boxCurrentX][boxCurrentY])
{
//计算箱子下一步坐标
boxNextX = boxCurrentX + (boxCurrentX - personCurrentX);
boxNextY = boxCurrentY + (boxCurrentY - personCurrentY);
//如果箱子下一步是路
if(theMapOfPushBox[boxNextX][boxNextY] == road)
{
//那么就先移动箱
go(theMapOfPushBox,boxCurrentX,boxCurrentY,boxNextX,boxNextY);
//更新箱子的位置
boxCurrentX = boxNextX;
boxCurrentY = boxNextY;
//再移动小人
go(theMapOfPushBox,personCurrentX,personCurrentY,personNextX,personNextY);
//更新小人的位置
personCurrentX = personNextX;
personCurrentY = personNextY;
}
//如果箱子的下一步是墙,小人和箱子都不能移动到其各自的下一步坐标位置
else if(theMapOfPushBox[boxNextX][boxNextY] == wall)
{
//重置箱子下一步的位置坐标
boxNextX = boxCurrentX;
boxNextY = boxCurrentY;
//重置小人下一步位置的坐标
personNextX = personCurrentX;
personNextY = personCurrentY;
}
}
//如果小人的下一步是墙,那么小人就不能移动到其下一步的坐标位置
else if(theMapOfPushBox[personNextX][personNextY] == wall)
{
//重置小人的下一步坐标位置
personNextX = personCurrentX;
personNextY = personCurrentY;
}
}
return 0;
}
/**
* 打印地图
*
* @param map 地图数组
*/
void printMap(char map[rows][cols])
{
for(int i=0; i<rows;i++)
{
printf("%s\n",map[i]);
}
}
/**
* 移动
*
* @param map 地图
*/
void go(char map[rows][cols],char currentX,char currentY,char nextX,char nextY)
{
char temp = map[currentX][currentY];
map[currentX][currentY] = map[nextX][nextY];
map[nextX][nextY] = temp;
}
复制代码
小游戏优化
作者:
烛风小糊涂
时间:
2016-4-15 01:15
58行的scanf函数后面应该加个getchar();函数用作吸收回车字符,不然会打印两遍
作者:
x_starry
时间:
2016-4-15 21:16
烛风小糊涂 发表于 2016-4-15 01:15
58行的scanf函数后面应该加个getchar();函数用作吸收回车字符,不然会打印两遍 ...
嗯嗯,是的,多谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2