啊哈c的推箱子游戏(C语言)

啊哈c的推箱子游戏

因为啊哈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;
}

你可能感兴趣的:(推箱子)