- #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;
- }
复制代码 |