——(经典推箱子第十三关,无图形界面,采用WASD操纵)
人可能面对的情况
每走一步需要的操作
main.c文件
#include
#include "move.h"
#include
//定义数组存储地图
int map[8][8] = {
{4 , 4 , 5 , 5 , 5 , 5 , 4 , 4},
{4 , 4 , 5 , 3 , 3 , 5 , 4 , 4},
{4 , 5 , 5 , 4 , 3 , 5 , 5 , 4},
{4 , 5 , 4 , 4 , 4 , 3 , 5 , 4},
{5 , 5 , 4 , 4 , 4 , 4 , 5 , 5},
{5 , 4 , 4 , 5 , 4 , 4 , 4 , 5},
{5 , 4 , 4 , 4 , 4 , 4 , 4 , 5},
{5 , 5 , 5 , 5 , 5 , 5 , 5 , 5}
};
//定义函数用于地图打印
static void mapPrint(int *map)
{
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
switch (*(map + 8 * i + j))
{
case 1:
printf("□");
break;
case 2:
printf("♀");
break;
case 3:
printf("◎");
break;
case 4:
printf(" ");
break;
case 5:
printf("■");
break;
case 6:
printf("¤");
break;
default:
break;
}
}
putchar('\n');
}
}
int main()
{
//初始化人物位置
map[6][3] = man;
//初始化箱子位置
map[3][4] = box;
*(&map[3][4] + 7) = box;
*(&map[3][4] + 7+9) = box;
*(&map[3][4] + 7 + 9+1) = box;
int* manPosition = &map[6][3];//总是忘记&,还是多用指针直接赋值
mapPrint(map);
while (1)
{
manPosition=move(map, manPosition);
system("cls");
mapPrint(map);
if (map[1][3] == boxAndTarget && map[1][4] == boxAndTarget&&map[2][4]==boxAndTarget&&map[3][5]==boxAndTarget)
{
system("cls");//清屏
printf("恭喜通关");
break;
}
}
system("pause");
}
move.h文件
#include
static int num = 0;//静态全局变量用来存储方向
enum element
{
box = 1,
man = 2,
target = 3,
ground = 4,
wall = 5,
boxAndTarget = 6
};
//枚举类型存储地形元素
static int nextElement = ground;//存储即将到达下一块地的信息,不应该用nextElement应该用elsmentForRecover
enum direction {
up = -8,
down =8,
left = -1,
right=1
};
//定义函数用来获得方向并存储于全局变量中
static int getDirection()
{
char dir = _getch();
switch (dir)
{
case 'w':
num = up;
return num;
case 'a':
num = left;
return num;
case 's':
num = down;
return num;
case 'd':
num = right;
return num;
default:
return 0;
}
}
int* move(int *map, int *personPos)
{
enum direction direc = getDirection();
switch (*(personPos+ direc))
{
case box://如果人的目标点上是箱子
switch (*(personPos + direc + direc))
{
case box://如果人的目标箱子下个点是箱子
break;
case wall://如果人的目标箱子下个点是墙
break;
case ground://如果人的目标箱子下个点是空地
*personPos = nextElement;//恢复现在的位置
nextElement = ground;//记录下个点
*(personPos + direc) = man;//移动人
*(personPos + direc + direc) = box;
personPos= personPos + direc;//修正人的位置指针
return personPos;
case target://如果人的目标箱子下个点是目标
*personPos = nextElement;
nextElement = ground;
*(personPos + direc) = man;
*(personPos + direc+direc) = boxAndTarget;
personPos= personPos + direc;
return personPos;
case boxAndTarget://如果人的目标箱子下个点是箱子和目标
break;
default:
break;
}
break;
case target://如果人的目标点上是目标
*personPos = nextElement;
nextElement = target;
*(personPos + direc) = man;
personPos = personPos + direc;
return personPos;
case ground://如果人的目标点上是空地
*personPos = nextElement;
nextElement = ground;
*(personPos + direc) = man;
personPos = personPos + direc;
return personPos;
case wall://如果人的目标点上是墙
break;
case boxAndTarget://如果人的目标点上是箱子加目标
switch (*(personPos + direc + direc))
{
case box://如果人的目标箱子下个点是箱子
break;
case wall://如果人的目标箱子下个点是墙
break;
case ground://如果人的目标箱子下个点是空地
*personPos = nextElement;
nextElement = ground;
*(personPos + direc) = man;
*(personPos + direc + direc) = box;
personPos = personPos + direc;
return personPos;
case target://如果人的目标箱子下个点是目标
*personPos = nextElement;
nextElement = target;
*(personPos + direc) = man;
*(personPos + direc + direc) = boxAndTarget;
personPos = personPos + direc;
return personPos;
case boxAndTarget://如果人的目标箱子下个点是箱子和目标
break;
}
break;
default:
break;
}
nextElement = nextElement;
return personPos;
}
上述为第二版,第一版见链接
推箱子第一版:比第二版更为混乱#doge#doge#doge
提取码:746t