目录
代码展示
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>//获取按键消息处理函数
#include<stdbool.h>//布尔函数调用
//推箱子的元素有 空地0 墙1 目的地2 箱子3 玩家4 箱子在目的地 5 玩家在目的地 6
//定义一个二维数组,用来表示推箱子的游戏地图
enum Mine//枚举元素
{
SPACE,//空地
WALL,//墙
DEST,//目的地
BOX,//箱子
PLAYER//玩家
};
//当前关卡
int level = 0;
int map[3][10][10]=
{
{
{ 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, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 3, 3, 0, 2, 1, 0 },
{ 0, 1, 2, 3, 4, 0, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 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, 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, 0, 3, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 4, 3, 0, 0, 0, 1 },
{ 0, 1, 0, 0, 3, 3, 0, 0, 1, 0 },
{ 0, 0, 1, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 2, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 4, 0, 0, 0, 0, 1 },
{ 1, 0, 3, 3, 0, 0, 3, 3, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 2, 0, 0, 2, 2, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
},
};
void gamedraw()
{
for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 10; k++)
{
switch (map[level][i][k])
{
case SPACE:
printf(" ");//一个汉字占两个字符
break;
case WALL:
printf("墙");
break;
case DEST:
printf("☆");
break;
case BOX:
printf("□");
break;
case PLAYER:
printf("♀");
break;
case PLAYER + DEST:
printf("♂");
break;
case BOX + DEST:
printf("★");
break;
}
}
printf("\n");
}
}
//按键消息处理函数
void keyEvent()
{
//获取玩家位置
int i = 0 ,k = 0;
for ( i = 0; i < 10; i++)
{
for ( k = 0; k < 10; k++)
{
if (map[level][i][k] == PLAYER || map[level][i][k]==PLAYER+DEST)
{
goto end;
}
}
}
end:;
//怎么获取按键消息,使用vs自带的库
char ch = _getch();//上下左右 72 80 75 77
switch (ch)
{
case 72:
case 'w':
case 'W':
//能不能移动 玩家的前面是空地或者目的地就直接移动
if (map[level][i - 1][k] == SPACE||map[level][i - 1][k] == DEST)
{
map[level][i - 1][k] += PLAYER;
map[level][i][k] -= PLAYER;
}
else if (map[level][i - 1][k] == BOX || map[level][i - 1][k] == BOX + DEST)//如果前面是箱子 则还要判断箱子的前面是什么
{
if (map[level][i - 2][k] == SPACE || map[level][i - 2][k] == DEST)
{
//把箱子移动到前面一个位置
map[level][i - 2][k] += BOX;
//让原来位置的箱子-去箱子然后加上玩家 玩家就移动到箱子的原位置
map[level][i - 1][k] = map[level][i - 1][k] - BOX + PLAYER;
//将玩家原位置消除
map[level][i][k] -= PLAYER;
}
}
break;
case 80:
case 's':
case 'S':
//能不能移动 玩家的下面是空地或者目的地就直接移动
if (map[level][i +1][k] == SPACE || map[level][i +1][k] == DEST)
{
map[level][i +1][k] += PLAYER;
map[level][i][k] -= PLAYER;
}
else if (map[level][i +1][k] == BOX || map[level][i +1][k] == BOX + DEST)//如果下面是箱子 则还要判断箱子的下面是什么
{
if (map[level][i +2][k] == SPACE || map[level][i +2][k] == DEST)
{
//把箱子移动到下面一个位置
map[level][i +2][k] += BOX;
//让原来位置的箱子-去箱子然后加上玩家 玩家就移动到箱子的原位置
map[level][i +1][k] = map[level][i +1][k] - BOX + PLAYER;
//将玩家原位置消除
map[level][i][k] -= PLAYER;
}
}
break;
case 75:
case 'a':
case 'A':
//能不能移动 玩家的左面是空地或者目的地就直接移动
if (map[level][i][k-1] == SPACE || map[level][i][k-1] == DEST)
{
map[level][i][k-1] += PLAYER;
map[level][i][k] -= PLAYER;
}
else if (map[level][i][k-1] == BOX || map[level][i][k-1] == BOX + DEST)//如果左面是箱子 则还要判断箱子的左面是什么
{
if (map[level][i][k-2] == SPACE || map[level][i][k-2] == DEST)
{
//把箱子移动到左面一个位置
map[level][i][k-2] += BOX;
//让原来位置的箱子-去箱子然后加上玩家 玩家就移动到箱子的原位置
map[level][i][k-1] = map[level][i][k-1] - BOX + PLAYER;
//将玩家原位置消除
map[level][i][k] -= PLAYER;
}
}
break;
case 77:
case 'd':
case 'D':
//能不能移动 玩家的右面是空地或者目的地就直接移动
if (map[level][i][k +1] == SPACE || map[level][i][k +1] == DEST)
{
map[level][i][k +1] += PLAYER;
map[level][i][k] -= PLAYER;
}
else if (map[level][i][k +1] == BOX || map[level][i][k +1] == BOX + DEST)//如果右面是箱子 则还要判断箱子的右面是什么
{
if (map[level][i][k +2] == SPACE || map[level][i][k +2] == DEST)
{
//把箱子移动到右面一个位置
map[level][i][k +2] += BOX;
//让原来位置的箱子-去箱子然后加上玩家 玩家就移动到箱子的原位置
map[level][i][k +1] = map[level][i][k +1] - BOX + PLAYER;
//将玩家原位置消除
map[level][i][k] -= PLAYER;
}
}
break;
}
printf("%d %c\n", ch, ch);
}
//判断是否过关
bool jude()
{
for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 10; k++)
{
if (map[level][i][k] == BOX)
{
return false;
}
}
}
return true;
}
int main()
{
for (;;)//死循环刷新
{
system("cls");//清屏
gamedraw();//绘制
if (jude())
{
level++;//关卡下一关 0 1 2
if (level > 2)
{
printf("oh!!! 天哪亲爱的你已经过关了~~");
_getch();
break;
}
}
keyEvent();
}
getchar();
return 0;
}
效果展示
结语
这是本人在学习c语言初级阶段真正意义上的第一个小项目,虽然简单,但很有纪念价值。望以此自勉。