因为啊哈c后面推箱子游戏未附代码,而且说实话考虑很多种状况和之前走迷宫的思路还是有区别的。并且我在网上搜的时候没有相似的参考信息,大一这学期快结束了才准备搞这个。一早上的bug ,调试了很多次才好。
说实话,网上信息对新人极不友好,我查推箱子代码,很多csdn博客连界面都写好了,对刚刚学c的我们打击好大啊。总之,我觉得有必要像啊哈c的作者啊哈磊那样写点对新生友好的内容,不然书上一堆枯燥无味的语法真的难读下去。
进入正题。二维数组画出地图,其中s表示人,o表示箱子,*表示目的地,@把箱子推入目的地。如果想换地图,只需改写二维数组和初始位置(x,y)。由于精力有限单纯好玩,所以没写出箱子推入角落等失败条件判断。源代码如下:
#include
#include
#include
int main()
{
system("color f9");//我喜欢的言和蓝(ff9999)
//#是墙;s是人;o是箱子;*是目的地;
char a[12][12]={"##########",
"## ###",
"##o### #",
"# s o o #",
"# **# o ##",
"##**# ##",
"##########",
};
int x=3,y=2,i;//x,y是初始坐标;
char direction;
for(i=0;i<7;i++)
puts(a[i]);
while(a[4][2]!='@'||a[4][3]!='@'||a[5][2]!='@'||a[5][3]!='@')
//所有箱子推入结束
{
direction=getch();
switch(direction)
{
//w s a d, 方向键
case'w':if(a[x-1][y]!='#')/*给w附注释,下面类似
检测前面(就是所对应方向,下同)是不是墙,可以不要但运算会变大*/
{
if(a[x-1][y]==' ')//空格直接走
{
a[x][y]=' ';
x--;
a[x][y]='s';/*我一开始写成a[x--][y]='s'
结果不对,其实应该写成--x才能正常运行*/
}
else if(a[x-1][y]=='o'&&a[x-2][y]!='#')//如果是箱子,并且前面不是墙
{
if(a[x-2][y]==' ')//箱子前是空格推得动
{
a[x][y]=' ';
x--;
a[x][y]='s';
a[x-1][y]='o';
}
else if(a[x-2][y]=='*')//必须有else,否则可能多运行一步。
//箱子前是目的地就换成@。
{
a[x][y]=' ';
x--;
a[x][y]='s';
a[x-1][y]='@';
}
}
else if(a[x-1][y]=='*')//s人想进入目的地
{
a[x][y]=' ';//空格不要紧,不会洗掉原有目的地。
//后面有代码防止目的缺失
x--;
a[x][y]='s';
}
else if(a[x-1][y]=='@')//想在目的地范围内移箱子
{
if(a[x-2][y]=='*')
{
a[x][y]=' ';
x--;
a[x][y]='*';
a[x-1][y]='@';
}
else if(a[x-2][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='*';
a[x-1][y]='o';
}
}
}break;//下面方向键类似
case's':if(a[x+1][y]!='#')
{
if(a[x+1][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='s';
}
else if(a[x+1][y]=='o'&&a[x+2][y]!='#')
{
if(a[x+2][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='s';
a[x+1][y]='o';
}
else if(a[x+2][y]=='*')
{
a[x][y]=' ';
x++;
a[x][y]='s';
a[x+1][y]='@';
}
}
else if(a[x+1][y]=='*')
{
a[x][y]=' ';
x++;
a[x][y]='s';
}
else if(a[x+1][y]=='@')
{
if(a[x+2][y]=='*')
{
a[x][y]=' ';
x++;
a[x][y]='*';
a[x+1][y]='@';
}
else if(a[x+2][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='*';
a[x+1][y]='o';
}
}
}break;
case'a':if(a[x][y-1]!='#')
{
if(a[x][y-1]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='s';
}
else if(a[x][y-1]=='o'&&a[x][y-2]!='#')
{
if(a[x][y-2]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='s';
a[x][y-1]='o';
}
else if(a[x][y-2]=='*')
{
a[x][y]=' ';
y--;
a[x][y]='s';
a[x][y-1]='@';
}
}
else if(a[x][y-1]=='*')
{
a[x][y]=' ';
y--;
a[x][y]='s';
}
else if(a[x][y-1]=='@')
{
if(a[x][y-2]=='*')
{
a[x][y]=' ';
y--;
a[x][y]='*';
a[x][y-1]='@';
}
else if(a[x][y-2]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='*';
a[x][y-1]='o';
}
}
}break;
case'd':if(a[x][y+1]!='#')
{
if(a[x][y+1]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='s';
}
else if(a[x][y+1]=='o'&&a[x][y+2]!='#')
{
if(a[x][y+2]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='s';
a[x][y+1]='o';
}
else if(a[x][y+2]=='*')
{
a[x][y]=' ';
y++;
a[x][y]='s';
a[x][y+1]='@';
}
}
else if(a[x][y+1]=='*')
{
a[x][y]=' ';
y++;
a[x][y]='s';
}
else if(a[x][y+1]=='@')
{
if(a[x][y+2]=='*')
{
a[x][y]=' ';
y++;
a[x][y]='*';
a[x][y+1]='@';
}
else if(a[x][y+2]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='*';
a[x][y+1]='o';
}
}
}break;
}
if(a[4][2]!='s'&&a[4][2]!='@')a[4][2]='*';
if(a[4][3]!='s'&&a[4][3]!='@')a[4][3]='*';
if(a[5][2]!='s'&&a[5][2]!='@')a[5][2]='*';
if(a[5][3]!='s'&&a[5][3]!='@')a[5][3]='*';
/*我觉得我做的最好的一步,检测目的地是不是人或者箱子,
再加载目的地,克服换位置时目的地*号丢失*/
system("cls");//清屏
for(i=0;i<7;i++)
puts(a[i]);//重新打印
}
system("cls");
printf("you win!\n");
Sleep(5000);
return 0;
}