思考与准备
首先,与走迷宫一样,实现推箱子,我们可以采用 二维数组 的方式,通过改变人的坐标来实现走动的效果。
我们额外用到的头文件有:
- #include<getch.h>
通过调用getch()函数来识别 上下左右的操作。
- #include<stdlib.h>
采用 system(“clear”);清理屏幕,实现视觉上的走动效果。
大致思路
- 1、确定数字与子符的对应关系
路 0
墙壁 1
人 2
箱子 3
目标点 4
人 6 //当人走到目标点上时,为人的值加上目标点 的值,即2+4=6
箱子 7 //当箱子推到目标点上时,为箱子的值加上目标点 的值,即3+4=7- 2、定义二维数组地图
- 3、定义人的坐标
- 4、进入死循环
1)清理屏幕并显示地图
2)检查是否完成任务
是:一共走了几步,结束程序
3)获取方向键并处理
代码
#include<stdio.h>
#include<stdlib.h>
#include<getch.h>
int main(int argc,const char* argv[])
{
//定义二维数组地图
char map[8][8]={
{0,0,1,1,1,1,0,0},
{0,0,1,4,4,1,0,0},
{0,1,1,0,4,1,1,0},
{0,1,0,0,3,4,1,0},
{1,1,0,3,0,0,1,1},
{1,0,0,1,3,3,0,1},
{1,0,0,2,0,0,0,1},
{1,1,1,1,1,1,1,1}
};
//设置人的初始位置
char m_x=6,m_y=3;
//记录步数
int step=0;
for(;;)//死循环
{
int cnt=0;
int x=0,y=0;// 偏移量
system("clear");
//打印地图
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
switch(map[i][j])
{
case 0: printf(" ");break;
case 1: printf("# ");break;
case 2: printf("@ ");break;
case 3: printf("$ ");break;
case 4: printf("0 ");break;
case 6: printf("@ ");break;
//打印一次到达终点的箱子时,cnt++
case 7: printf("$ ");cnt++;break;
}
}
printf("\n");
}
//判断是否成功
if(4==cnt)
{
printf("游戏结束,共走了%d步\n",step);
break;
}
//获取到对应按键的值,设置好偏移量
switch(getch())
{
case 183://上
x--;
break;
case 184://下
x++;
break;
case 185://左
y++;
break;
case 186://右
y--;
break;
}
if(0 == map[m_x+x][m_y+y] || 4 == map[m_x+x][m_y+y])
{
//人的前方是否为空,是的话移动
map[m_x+x][m_y+y]+=2;
map[m_x][m_y]-=2;
m_x+=x;
m_y+=y;
step++;
}
//人的前方是否为箱子 或者 在目标点的箱子
else if(3 == map[m_x+x][m_y+y] || 7 == map[m_x+x][m_y+y])
{
//箱子的前方是否为 空 或者 目标点,是的话移动
if(0==map[m_x+2*x][m_y+2*y] || 4 == map[m_x+2*x][m_y+2*y])
{
map[m_x+2*x][m_y+2*y]+=3;
map[m_x+x][m_y+y]-=1;
map[m_x][m_y]-=2;
m_x+=x;
m_y+=y;
step++;
}
}
}
}
效果图