按照老师的思路自己巧了下来,看看能不能继续- //推箱子游戏
- #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;
- }
复制代码
小游戏优化
|
|