#include <stdio.h>
#define Lod 11
#define Kod 10
//定义打印地图函数
void printfMap(char map[Kod][Lod]){
for (int i = 0; i < Kod; i++) {
printf("%s\n",map[i]);
}
}
//定义移动函数
void Move(char map[Kod][Lod],int nowX, int nowY,int nextX, int nextY){
char t;
t = map[nowX][nowY];
map[nowX][nowY] = map[nextX][nextY];
map[nextX][nextY] = t;
}
int main(int argc, const char * argv[]) {
//定义地图
char map[Kod][Lod]={
"##########",
"#0 ### #",
"# X### #",
"# #",
"###### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########"
};
//打印地图
printfMap(map);
//定义变量,小人位置,路
int wzX = 1;
int wzY = 1;
int nextwzX = wzX;
int nextwzY = wzY;
char lu = ' ';
char fx =0;
char ch;
int box = 'X';
int boxX = 2;
int boxY = 3;
int nextboxX = boxX;
int nextboxY = boxY;
//进入循环
while (1) {
printf("请控制小人移动:w:上 s:下 a:左 d:右 q:退出\n");
scanf("%c",&fx);
scanf("%c",&ch);
nextwzX = wzX;
nextwzY = wzY;
//进入switch分支,判断方向
switch (fx) {
case 'w':
case 'W':
{
nextwzX--;
break;
}
case 's':
case 'S':
{
nextwzX++;
break;
}
case 'a':
case 'A':
{
nextwzY--;
break;
}
case 'd':
case 'D':
{
nextwzY++;
break;
}
case 'q':
case 'Q':
printf("游戏已退出");
return 0;
default:
continue;
}
// 如果小人要移动的位置是路
if (map[nextwzX][nextwzY] == lu) {
//移动小人位置
Move( map,wzX,wzY,nextwzX,nextwzY);
//从新保存小人位置
wzX = nextwzX;
wzY = nextwzY;
//如果是箱子,就推动箱子
}else if (map[nextwzX][nextwzY] == box){
//计算箱子的下一位置
nextboxX = boxX + (boxX - wzX);
nextboxY = boxY + (boxY - wzY);
//如果箱子的下一个位置是路
if (map[nextboxX][nextboxY] == lu){
//移动箱子
Move(map, boxX, boxY, nextboxX, nextboxY);
//移动小人
Move( map,wzX,wzY,boxX,boxY);
//重新定义小人和箱子的位置
wzX = nextwzX;
wzY = nextwzY;
boxX = nextboxX;
boxY = nextboxY;
}
}
//重新打印地图
printfMap(map);
//如果boxY == 9,即走出了迷宫,跳出循环
if (boxY == 9) {
printf("恭喜你走出来了!!!");
return 0;
}
}
return 0;
}
BUG:一次输入多个方向会被储存在SCANF缓存区,影响下次移动 求大神解决 |
|