#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<conio.h> //按键操作
#define ROW 10
#define COL 10
#define SPACE 0 //空地
#define WALL 1 //墙
#define DEST 2 //目的地
#define BOX 3 //箱子
#define PLAYER 4 //玩家
//#define 5//目的地+箱子
//#define 6//目的地+玩家
//定义地图
//输出map[curLevel]
//当前关卡
//int map[3][ROW][COL] = { 0 };
int curLevel = 0;
//3个关卡
char map[3][ROW][COL] =
{
{
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,0,0,0,0},
{0,0,0,1,2,1,0,0,0,0},
{0,1,1,1,3,1,1,1,1,0},
{0,1,2,3,4,0,3,2,1,0},
{0,1,1,1,1,0,1,1,1,0},
{0,0,0,0,1,3,1,0,0,0},
{0,0,0,0,1,2,1,0,0,0},
{0,0,0,0,1,1,1,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
},
{
{0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,0,0,1,1,0,0},
{0,1,0,2,1,1,2,0,1,0},
{1,0,0,3,0,0,3,0,0,1},
{1,0,0,0,4,0,0,0,0,1},
{0,1,0,0,0,0,0,0,1,0},
{0,0,1,0,3,3,0,1,0,0},
{0,0,0,1,2,2,1,0,0,0},
{0,0,0,0,1,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
},
{
{1,0,0,0,0,0,0,0,0,1},
{0,1,0,1,1,1,1,0,1,0},
{0,0,1,1,0,0,1,1,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,4,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,3,0,0,0,0,3,0,0},
{0,0,2,0,0,0,0,2,0,0},
{0,0,0,0,0,0,0,0,0,0}
}
};
void show()
{
for (int i = 0; i < ROW; i++)
{
for (int k = 0; k < COL; k++)
{
switch (map[curLevel][i][k])
{
case SPACE:
printf(" ");
break;
case WALL:
printf("▓");
break;
case DEST:
printf("☆");
break;
case BOX:
printf("□");
break;
case PLAYER:
printf("♀");
break;
case DEST + BOX: //箱子在目的地
printf("★");
break;
case DEST + PLAYER: //玩家在目的地
printf("♂");
break;
}
}
printf("\n");
}
}
//移动
void move()
{
//查找玩家所在地下标
int r = -1, c = -1;
for (int i = 0; i < ROW; i++)
{
for (int k = 0; k < COL; k++)
{
if (map[curLevel][i][k] == PLAYER || map[curLevel][i][k] == DEST + PLAYER)
{
r = i;
c = k;
goto endloop;
}
//break;
}
}
//怎么样获取按键 getchar()输入后需要回车
//还有一个函数和getchar()很像,但是不需要按回车 _getch(),需要包含conio.h
//int key=_getch();
//printf("%d %c\n", key, key);
endloop:
if (r == -1 || c == -1)
return;
switch (_getch())
{
case 72:
case 'W':
case 'w':
//玩家的前面是否是空地或者目的地
if (map[curLevel][r - 1][c] == SPACE || map[curLevel][r - 1][c] == DEST)
{
//1.把玩家移动到空地
map[curLevel][r - 1][c] += PLAYER;
//2.把玩家从原来的位置清楚掉
map[curLevel][r][c] -= PLAYER;
}
else if (map[curLevel][r - 1][c] == BOX)//玩家的前面是箱子
{
//箱子的前面是空地或目的地
if (map[curLevel][r - 2][c] == SPACE || map[curLevel][r - 2][c] == DEST)
{
//1把箱子移动到前面
map[curLevel][r - 2][c] += BOX;
//2把箱子从原来的地方清除
map[curLevel][r - 1][c] -= BOX;
//3把玩家移动到空地
map[curLevel][r - 1][c] += PLAYER;
//4把玩家从原来的位置清除
map[curLevel][r][c] -= PLAYER;
}
}
break;
case 80:
case 'S':
case 's':
//玩家的前面是否是空地或者目的地
if (map[curLevel][r + 1][c] == SPACE || map[curLevel][r + 1][c] == DEST)
{
//1.把玩家移动到空地
map[curLevel][r + 1][c] += PLAYER;
//2.把玩家从原来的位置清楚掉
map[curLevel][r][c] -= PLAYER;
}
else if (map[curLevel][r + 1][c] == BOX)//玩家的前面是箱子
{
//箱子的前面是空地或目的地
if (map[curLevel][r + 2][c] == SPACE || map[curLevel][r + 2][c] == DEST)
{
//1把箱子移动到前面
map[curLevel][r + 2][c] += BOX;
//2把箱子从原来的地方清除
map[curLevel][r + 1][c] -= BOX;
//3把玩家移动到空地
map[curLevel][r + 1][c] += PLAYER;
//4把玩家从原来的位置清除
map[curLevel][r][c] -= PLAYER;
}
}
break;
case 75:
case 'A':
case 'a':
//玩家的前面是否是空地或者目的地
if (map[curLevel][r][c - 1] == SPACE || map[curLevel][r][c - 1] == DEST)
{
//1.把玩家移动到空地
map[curLevel][r][c - 1] += PLAYER;
//2.把玩家从原来的位置清楚掉
map[curLevel][r][c] -= PLAYER;
}
else if (map[curLevel][r][c - 1] == BOX)//玩家的前面是箱子
{
//箱子的前面是空地或目的地
if (map[curLevel][r][c - 2] == SPACE || map[curLevel][r][c - 2] == DEST)
{
//1把箱子移动到前面
map[curLevel][r][c - 2] += BOX;
//2把箱子从原来的地方清除
map[curLevel][r][c - 1] -= BOX;
//3把玩家移动到空地
map[curLevel][r][c - 1] += PLAYER;
//4把玩家从原来的位置清除
map[curLevel][r][c] -= PLAYER;
}
}
break;
case 77:
case 'D':
case 'd':
//玩家的前面是否是空地或者目的地
if (map[curLevel][r][c + 1] == SPACE || map[curLevel][r][c + 1] == DEST)
{
//1.把玩家移动到空地
map[curLevel][r][c + 1] += PLAYER;
//2.把玩家从原来的位置清楚掉
map[curLevel][r][c] -= PLAYER;
}
else if (map[curLevel][r][c + 1] == BOX)//玩家的前面是箱子
{
//箱子的前面是空地或目的地
if (map[curLevel][r][c + 2] == SPACE || map[curLevel][r][c + 2] == DEST)
{
//1把箱子移动到前面
map[curLevel][r][c + 2] += BOX;
//2把箱子从原来的地方清除
map[curLevel][r][c + 1] -= BOX;
//3把玩家移动到空地
map[curLevel][r][c + 1] += PLAYER;
//4把玩家从原来的位置清除
map[curLevel][r][c] -= PLAYER;
}
}
break;
}
}
//什么情况下才过关,如果地图上没箱子了就过关了
bool judge()
{
for (int i = 0; i < ROW; i++)
{
for (int k = 0; k < COL; k++)
{
if (map[curLevel][i][k] == BOX)
{
return false;
}
}
}
return true;
}
//推箱子
int main()
{
while (true)
{
system("cls");//清屏
show();
if (judge())
{
curLevel++;
}
//不断的检测键盘按键,不断的绘制 72 80 75 77 上下左右
move();
}
return 0;
}
推箱子-二位数组
最新推荐文章于 2022-10-18 11:16:41 发布