C实现的推箱子游戏
完整的代码在最后面
功能介绍
- 选择游戏模式
- 可以选择关卡
- 任意时候可以退出游戏
- 返回上一步功能
画图
后端用一个二维数组来记录,输出的时候根据数组中的值输出不同符号,
比如值为1的时候输出下面1对应的符号,符号在word符号库中copy。
我这个游戏用的符号:
□–空白 1
█–墙壁 2
▓–箱子 3
♀–人 4
☆–目标 5
○–覆盖目标后 6
定义一个全局变量记录等级,每过一关等级加1,根据等级绘制不同地图
移动
思路:获取四个方向并且分别用函数判断,根据情况返回不同值,
情况分为以下几种:
- 移动位置是空 return 1
- 移动位置是箱子,箱子后面是空白 return 2
- 移动位置是箱子,箱子后面是目标 return 3
- 移动位置是目标 return 4
- 移动目标是已经压着目标的箱子,箱子后面是空白 return 5
- 移动目标是已经压着目标的箱子,箱子后面是目标 return 6
- 其余的(移动目标是墙之类的) return 0
获取到这些值之后进一步操作:
- 1 : 直接移动
- 2 :箱子推过去
- 3 :箱子推过去后变为压着目标的箱子
- 4 :直接移动,并且用一个全局变量来标记 人站着的位置是否压着目标
- 5 :箱子推过去,并且用变量标记人的位置压着目标
- 6 :箱子推过去依然是压着目标的箱子,用变量标记人的位置压着目标
- 7 :重新获取数据,不做其他任何操作
截取一段向上移动的代码
else if (flag == 72) {
// 72是方向向上键
res = up();
if (res){
numStep++;
push(S, flag); //依次将方向、是否踩目标、下一位置、下下位置压栈,方便返回上一步
push(S, isOccured);
push(S, map[personI - 1][personJ]);
push(S, map[personI - 2][personJ]);
}
switch (res) {
case 1: {
//直接移动
if (isOccured) {
//人压着目标的话,移动之后还原为目标
map[personI][personJ] = 5;
isOccured = 0;
}
else
map[personI][personJ] = 1;
map[personI - 1][personJ] = 4;
personI--;
}
break;
case 2:{
//箱子推过去
if (isOccured) {
map[personI][personJ] = 5;
isOccured = 0;
}
else
map[personI]