- //
- // main.c
- // Sokoban game
- //
- // Created by Sunshine_yang on 1/23/16.
- // Copyright (c) 2016 sunshine-429. All rights reserved.
- //
- #include <stdio.h>
- #define ROW 10
- #define COL 21
- void printfMap(char arr[ROW][COL]);
- void exchange(char arr[ROW][COL], int oldX, int oldY, int newX, int newY);
- int main(int argc, const char * argv[]) {
- // *********** 定义变量 ***********
- // 定义地图 横为Y轴向右坐标增加 竖为X轴向下坐标增加
- char map[ROW][COL] = {
- "####################",
- "#o ########### ",
- "### x######### ####",
- "### ###",
- "### ######## ####",
- "######### ####",
- "############ ####",
- "##### #####",
- "##### # ",
- "####################",
-
-
- };
- // 定义小人当前位置
- int personX = 1;
- int personY = 1;
- // 定义小人下个位置
- int perNextX = 1;
- int perNextY = 1;
- // 定义用户移动的方向
- char direction;
- // 定义路
- char street = ' ';
- // 定义箱子当前位置
- int boxX = 2;
- int boxY = 4;
- // 定义箱子下个位置
- int boxNextX = 2;
- int boxNextY = 4;
- //定义标记
- char mark;
- // *********** 打印地图 ***********
- printfMap(map);
-
- // *********** 输入指令 ***********
- printf("请输入移动方向: w->up s->down a->left d->right q->quit\n");
- // *********** 循环结构 ***********
- while(1)
- {
- // 接收指令
- scanf("%c", &direction);
- //吸收回车
- getchar();
- // 判断指令
-
- // 更新位置
- perNextX = personX;
- perNextY = personY;
- switch(direction)
- {
- case 'w':
- case 'W':
- perNextX--;
- break;
-
- case 's':
- case 'S':
- perNextX++;
- break;
-
- case 'a':
- case 'A':
- perNextY--;
- break;
-
- case 'd':
- case 'D':
- perNextY++;
- break;
-
- case 'q':
- case 'Q':
- printf("Y确认,N取消:\n");
- scanf("%c",&mark);
- getchar();
- switch(mark){
- case 'y':
- case 'Y':printf("程序正在退出。。。\n");
- printf("程序已退出!\n");
- return 0;
- case 'n':
- case 'N':
- break;
-
- }
-
- }
- // 判断小人的下一步是否为路,若为路,小人和路交换
- if(map[perNextX][perNextY] == street)
- {
- exchange(map, personX,personY, perNextX,perNextY);
- // 上面交换函数并没有改变小人的位置
- personX = perNextX;
- personY = perNextY;
- //判断小人下个位置是箱子
- }else if(map[perNextX][perNextY] == 'x')
- {
- //让箱子移动位置
- boxNextX = boxX + (boxX - personX);
- boxNextY = boxY + (boxY - personY);
- // 判断箱子的下一步是不是路
- if(map[boxNextX][boxNextY] == street)
- {
- // 交换箱子和路
- exchange(map, boxX,boxY, boxNextX,boxNextY);
- boxX = boxNextX;
- boxY = boxNextY;
-
- // 交换小人和箱子原来的位置
- exchange(map, personX,personY, perNextX,perNextY);
- personX = perNextX;
- personY = perNextY;
- }
- }
- // 打印地图
- printfMap(map);
- // 判断走出
- if(boxY == COL-2)
- {
- printf("恭喜你成功逃脱!congratulations!\n");
- return 0;
- }
- }
- return 0;
- }
- /**
- * 交换位置
- */
- void exchange(char arr[ROW][COL], int oldX, int oldY, int newX, int newY)
- {
- char temp = arr[oldX][oldY];
- arr[oldX][oldY] = arr[newX][newY];
- arr[newX][newY] = temp;
- }
- /**
- * 打印地图
- */
- void printfMap(char arr[ROW][COL])
- {
- for(int i = 0; i < ROW; i++)
- {
- // 用%s是个小改进。字符数组用的""结尾有\0,
- printf("%s\n", arr[i]);
- }
- }
复制代码 |
|