推箱子:
1、确定数字与字符的对应关系
0 printf(" "); 路
1 printf("@"); 人
2 printf("#"); 墙
3 printf("$"); 箱子
4 printf("O"); 目标点
5 printf("@");
7 printf("$");
2、定义地图
char map[8][8] ={
{0,0,2,2,2,2,0,0},
{0,0,2,4,4,2,0,0},
{0,2,2,0,4,2,2,0},
{0,2,0,0,3,4,2,0},
{2,2,0,3,0,0,2,2},
{2,0,0,2,3,3,0,2},
{2,0,0,1,0,0,0,2},
{2,2,2,2,2,2,2,2}
};
3、定义记录小人位置的变量 6 3
4、进入死循环
1、清理屏幕
2、显示地图 把数字转换为对应的符号显示
3、获取方向键并处理
1、前面是墙壁
2、前面是路或者目标,参考走迷宫移动
目标位置 += 1 //人站在路上就等于人 0+1=1
原位置 -= 1 //人离开了路就等于路 1-1=0
3、前面是在路上的箱子,或者在目标点上的箱子
1、箱子前面是墙壁
2、箱子前面必须是路或者目标点
人前面的前面 +=3 //人前面是箱子,箱子的前面是路,人推箱子箱子站在路上,3=0+3
人前面 -=2 //箱子被人推走人站在原本箱子的地方 1=3-2
原来的位置 -=1
4、如果放置完毕,游戏结束
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
int main(int argc,const char* argv[])
{
char map[8][8] ={
{0,0,2,2,2,2,0,0},
{0,0,2,4,4,2,0,0},
{0,2,2,0,4,2,2,0},
{0,2,0,0,3,4,2,0},
{2,2,0,3,0,0,2,2},
{2,0,0,2,3,3,0,2},
{2,0,0,1,0,0,0,2},
{2,2,2,2,2,2,2,2}
};
// 小人的位置坐标
char m_x = 6,m_y = 3;
// 进入死循环
for(;;)
{
// 清理屏幕
system("clear");
int cnt = 0;
// 显示地图
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("O "); break;
case 5: printf("@ "); break;//人站在目标点上1+4
case 7: printf("$ "); cnt++; break;//箱子推到目标点上3+4
}
}
printf("\n");
}
if(4 == cnt)
{
printf("游戏结束\n");
return 0;
}
switch(getch())
{
case 183:
if(0 == map[m_x-1][m_y] || 4 == map[m_x-1][m_y])
{
map[m_x-1][m_y] += 1;
map[m_x--][m_y] -= 1;
}
else if(3 == map[m_x-1][m_y] || 7 == map[m_x-1][m_y])
{
if(0 == map[m_x-2][m_y] || 4 == map[m_x-2][m_y])
{
map[m_x-2][m_y] += 3;
map[m_x-1][m_y] -= 2;
map[m_x--][m_y] -=1;
}
}
break;
case 184:
if(0 == map[m_x+1][m_y] || 4 == map[m_x+1][m_y])
{
map[m_x+1][m_y] += 1;
map[m_x++][m_y] -= 1;
}
else if(3 == map[m_x+1][m_y] || 7 == map[m_x+1][m_y])
{
if(0 == map[m_x+2][m_y] || 4 == map[m_x+2][m_y])
{
map[m_x+2][m_y] += 3;
map[m_x+1][m_y] -= 2;
map[m_x++][m_y] -=1;
}
}
break;
case 185:
if(0 == map[m_x][m_y+1] || 4 == map[m_x][m_y+1])
{
map[m_x][m_y+1] += 1;
map[m_x][m_y++] -= 1;
}
else if(3 == map[m_x][m_y+1] || 7 == map[m_x][m_y+1])
{
if(0 == map[m_x][m_y+2] || 4 == map[m_x][m_y+2])
{
map[m_x][m_y+2] += 3;
map[m_x][m_y+1] -= 2;
map[m_x][m_y++] -=1;
}
}
break;
case 186:
if(0 == map[m_x][m_y-1] || 4 == map[m_x][m_y-1])
{
map[m_x][m_y-1] += 1;
map[m_x][m_y--] -= 1;
}
else if(3 == map[m_x][m_y-1] || 7 == map[m_x][m_y-1])
{
if(0 == map[m_x][m_y-2] || 4 == map[m_x][m_y-2])
{
map[m_x][m_y-2] += 3;
map[m_x][m_y-1] -= 2;
map[m_x][m_y--] -=1;
}
}
break;
}
}
}
此项目采用数字加减来替代符号,更容易使用,适合多层重叠的应用,但复杂一点需要认真揣摩算数关系,在迷宫项目里死循环刷新行走道路的基础上加以实现。