黑马程序员技术交流社区
标题:
指针学晕了,自己把推箱子优化一下,[可后退一步+提示版]!!
[打印本页]
作者:
1wang2huan
时间:
2015-9-4 20:09
标题:
指针学晕了,自己把推箱子优化一下,[可后退一步+提示版]!!
#include <stdio.h>
#define Row 10
#define Col 11
/**
* 打印地图
*
* @param map 地图名字
*/
void printMap(char map[Row][Col]){
for (int i = 0; i < Row; i++) {
for (int j = 0; j < Col; j++) {
printf("%c",map[i][j]);
}
printf("\n");
}
}
/**
* 移动
*
* @param map 地图
* @param oldX 老的横坐标
* @param oldY 老的纵坐标
* @param newX 新的横坐标
* @param newY 新的纵坐标
*/
void move1(char map[Row][Col],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() {
// 定义变量存储地图,小人现在位置,箱子现在位置,道路,方向
char map[Row][Col] = {
"##########",
"#0 #### #",
"# X#### #",
"# #",
"##### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########"
};
int currentX = 1,currentY = 1,nextX = 1,nextY = 1;
int personOldX = 1, personOldY = 1, boxOldX = 1, boxOldY = 1;
int boxX = 2, boxY = 2;
int boxNextX = 2,boxNextY = 3;
int flag = 1;
char direction;
char street = ' ';
char box = 'X';
// 打印地图
printMap(map);
// 提示玩法
printf("请输入方向:w.上 s.下 a.左 d.右 k.后退\n");
// 循环控制
while (flag) {
// 每次循环将小人的下一个位置和现在的位置统一,(方向控制以及后续移动的需要)
nextX = currentX;
nextY = currentY;
boxNextX = boxX;
boxNextY = boxY;
// 接收方向
scanf("%c",&direction);
getchar();
// 判断方向
switch (direction) {
// 按W小人的下一个位置纵坐标(X)减一
case 'w':
case 'W':
nextX--;
break;
// 按S小人的下一个位置纵坐标(X)加一
case 's':
case 'S':
nextX++;
break;
// 按A小人的下一个位置横坐标(X)减一
case 'a':
case 'A':
nextY--;
break;
// 按D小人的下一个位置横坐标(X)加一
case 'd':
case 'D':
nextY++;
break;
// 按Q退出游戏!
case 'q':
case 'Q':
printf("程序正在退出...\n");
printf("程序已经推出!\n");
return 0;
case 'k':
case 'K’:
// 后退一步
move1(map, personOldX, personOldY, nextX, nextY);
move1(map, boxOldX, boxOldY, boxNextX, boxNextY);
nextX = currentX = personOldX;
nextY = currentY = personOldY;
boxNextX = boxX = boxOldX;
boxNextY = boxY = boxOldY;
printMap(map);
printf("后退成功!\n");
default:
break;
}
// 判断小人下一个位置是不是路
// 是路,小人移动
if (street == map[nextX][nextY]) {
move1(map, currentX, currentY, nextX, nextY);
//调整小人的坐标位置
currentX = nextX;
currentY = nextY;
// 是箱子
}else if (box == map[nextX][nextY]){
boxNextX = boxX+(boxX-currentX);
boxNextY = boxY+(boxY-currentY);
// 箱子的下一个位置是不是路
if (street == map[boxNextX][boxNextY]) {
// 是路 推着箱子往前走
move1(map, boxX, boxY, boxNextX, boxNextY);
move1(map, currentX, currentY, nextX, nextY);
personOldX = currentX;
personOldY = currentY;
boxOldX = boxX;
boxOldY = boxY;
// 调整小人和箱子的坐标位置
currentX = nextX;
currentY = nextY;
boxX = boxNextX;
boxY = boxNextY;
}
}
printMap(map);
// 判断箱子的位置是不是出来了
// 提示赢了
if (Col-2 == boxY) {
printf("恭喜你!");
flag = 0;
// 如果箱子推到了死角,提示失败,游戏结束
}else if ((Col-3 == boxY && Row - 4 == boxX)
||(Col-3 == boxY && Row - 9 == boxX)
||(Col-4 == boxY && Row - 9 == boxX)
||(Col-9 == boxY && Row - 5 == boxX)
||(Col-9 == boxY && Row - 9 == boxX)
||(Col-10 == boxY && Row - 7 ==boxX)
||(Col-10 == boxY && Row - 5 ==boxX)
||(Col-10 == boxY && Row - 2 ==boxX)
||(Col-10 == boxY && Row - 9 ==boxX))
{
printf("你失败了!");
flag = 0;
}
}
return 0;
}
复制代码
作者:
TTsu
时间:
2015-9-4 20:12
我看晕了,感谢大神分享,复习下今天上课内容去
作者:
38740820
时间:
2015-9-4 20:49
作者:
伟大的度娘
时间:
2015-9-4 20:51
哎呦 自己优化了 相当不错
作者:
huahaoL
时间:
2015-9-4 21:39
厉害,,膜拜{:2_42:}
作者:
庐山烟雨浙江潮
时间:
2015-9-4 21:48
楼主可以用一个清屏工具,这样看的就更爽了
作者:
weicongcing
时间:
2015-9-4 21:56
真是牛人啊
作者:
kylmetz
时间:
2015-9-4 22:05
哇~好强,我学习下~
作者:
Vigor
时间:
2015-9-4 22:33
不只了解,还能优化,楼主真是厉害!
作者:
hoohoo
时间:
2015-9-5 22:09
很不错!
作者:
唐肖虎
时间:
2015-9-5 22:20
真棒,学习了
作者:
企业部-阿狗老师
时间:
2015-9-6 11:29
好的好的 我知道了
作者:
fangshiqi
时间:
2015-9-6 12:30
我是看晕了,厉害。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2