推箱子(入门级)
一、思考-----实现此游戏的几个重点:
1)小人在移动的时候,如何判断下一步是一个箱子
2)小人推着箱子移动,箱子要移动的下一个位置也是路
3)要记录小人的位置、箱子的位置、箱子要移动的下一个位置
4)计算箱子的下一个位置
5)10*10地图,10*11存储
虽然这个游戏看着很弱,不过也很开脑洞,对于新手入门,还是挺不错的。
二、伪代码的实现:
思路://1、定义变量,保存地图、位置信息
//2、打印地图
//3、提示玩法
//4、编写控制程序
//5、接受玩家输入的方向数据
//6、判断小人移动的方向
//7、判断小人将要移动的位置是否是路
伪代码开始我也觉得很没必要,可是当自己写程序时,丢三拉四,明白了伪代码对于我们新手来说,还是相当重要,可以理清我们的思路。等自己熟悉后自然可以省去。
实现:
#include <stdio.h>
int main(int argc, const char * argv[]) {
//******** 定义变量 **********
//1、定义地图
//定义变量保存位置信息
//定义变量接收用户输入的方向
//******* 打印地图 **********
//2、打印一遍地图
//******* 编写循环控制程序 *****
//3、接收用户输入的方向
//4、判断方向
//5、根据用户输入的方向 判断如何移动
// 先判断小人的下一个位置是否 是路
// 如果是路,先让小人移动
// 如果不是路,
//******* 判断模块 ***********
// 再次判断是否是箱子
// 如果是箱子,计算箱子的下一个位置
// 再次判断箱子的下一个位置是否是路
// 如果箱子的下一个位置是路,要移动小人和箱子
// 如何移动小人和箱子呢?
// 1)移动箱子到箱子的下一个位置
// 2)让小人移动到箱子的原来的位置
// 如果不是箱子,什么也不干
//****** 重绘地图 ***********
// 6、重绘地图
//******* 判断是否走出来 ******
// 7、判断箱子是否被推出来了
return 0;
}
三、推箱子代码实现
- #include <stdio.h>
- #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]);
- }
- }
- /**
- * 移动的函数
- *
- * @param map <#map description#>
- * @param oldX <#oldX description#>
- * @param oldY
- * @param newX <#newX description#><#oldY description#>
- * @param newY <#newY description#>
- */
- 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[]) {
-
- //******** 定义变量 **********
-
- //1、定义地图
- char map[kRows][kCols]={
- "##########",
- "#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';
- //******* 打印地图 **********
-
- //2、打印一遍地图
- printMap(map);
- printf("请控制小人移动:w.上 s.下 a.左 d.右 q.退出\n");
- //******* 编写循环控制程序 *****
- while (1) {
- //3、接收用户输入的方向
- scanf("%c",&direction);
- getchar(); //获取一个字符从键盘上
-
- //防止穿墙
- //0
- personNextX = personX; //1
- personNextY = personY; //1
-
- //4、判断方向
- switch (direction) {
- case 'w':
- case 'W':
- //下一个位置-1
- 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("程序正在退出...\n");
- printf("程序已经退出!\n");
- return 0;
-
- default:
- break;
- }
-
- //5、根据用户输入的方向 判断如何移动
- 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) {
- // 如果箱子的下一个位置是路,要移动小人和箱子
- // 如何移动小人和箱子呢?
- // 1)移动箱子到箱子的下一个位置
- move1(map, boxX, boxY, boxNextX, boxNextY);
- // 2)让小人移动到箱子的原来的位置
- move1(map, personX, personY, boxX, boxY);
-
- //重新调整 箱子的位置和小人的位置
- personX = personNextX;
- personY = personNextY;
-
- boxX = boxNextX;
- boxY = boxNextY;
-
- }
- // 如果不是箱子,什么也不干
- }
-
- //****** 重绘地图 ***********
- // 6、重绘地图
- printMap(map);
- //******* 判断是否走出来 ******
- // 7、判断箱子是否被推出来了
- if (boxY==kCols-2) {
- printf("哇哦!你推出来了!\n");
- break;
- }
- //
- }
-
- return 0;
- }
复制代码 |
|