如何使用C++做个简单推箱子游戏

此文转载自:https://blog.csdn.net/qq_51000584/article/details/113447216

今天向大家介绍一下如何使用C++来写一个推箱子游戏的代码

首先要做出推箱子,我们先要明确它的思路是什么:
在这里插入图片描述
如图,在一个推箱子游戏中,我们首先要有一个二维的地图,并在地图中加入障碍物,箱子,小人,还有箱子需要到达的指定地点。当然,简单的把这几个人因素呈现出来是很简单的,如下面的代码:

#include<iostream>
using namespace std;
int main()
{
    cout<<"

";
    cout<<"     ###     "<<endl;
    cout<<"     #*#     "<<endl;
    cout<<"     # #     "<<endl;
    cout<<"  ####O######"<<endl;
    cout<<"  #*  OH O *#"<<endl;
    cout<<"  #####O#####"<<endl;
    cout<<"      # #    "<<endl;
    cout<<"      #*#    "<<endl;
    cout<<"      ###    "<<endl;
}

运行结果如图:
在这里插入图片描述

该代码呈现了一个简单的推箱子地图和内容,其中我们用”#“来做墙壁障碍,“H”代表小人,“O”是箱子,“*”就是箱子要到达的指定地点。
但是我们只是将这些因素呈现了出来,或者说它更像是一个图片,和你在本子上画了一个迷宫没有区别,它不能叫做游戏。要想使它成为游戏,我们还要在里面加上移动系统,使小人“H”移动起来,并且还要推着箱子“O”移动,障碍物墙壁也要起到格挡的作用,当箱子到达*处时,还要显示通关。

移动系统

首先我们要解决让小人H动起来的问题,而且对于一个游戏来说,”H“的运动需要玩家通过键盘来操控,也就是说玩家输入指定字符,H要做出位置的变化。这一点我们可以想象H在一个平面直角坐标系中,当我们输入上下左右之类的案件,会使H的坐标发生不同的变化。这个想法利用C++中的二维数组便可以解决。

迷宫

如,我们先用二维数组初始化一个简单的迷宫:

 char a[50][50]={"OOOOOOOOOOOOOOO",
                 "OH  O    O    O",
                 "OOO O OO O OO O",
                 "O   O  O O    O",
                 "OO OOO O OO OOO",
                 "OO     O O    O",
                 "OOOOOOOO OO O O",
                 "OO       O  O O",
                 "OO OOOOOOOO O O",
                 "OO O        O O",
                 "OO OOOOOOO OO O",
                 "OO       O O  O",
                 "OOOOOOOO   O OO",
                 "OOOOOOOOOOOO OO",};

这里的char[50][50]是我往大了点写的,写小点数完全可以,只要能把你的迷宫放进去就行。我们先用O来做墙壁,H做小人。这样就有了H的初始坐标(1,1)和迷宫的出口坐标(13,12)。接下来就是想办法让H动起来了,我们使用“w,d,a,s”分别来控制上下左右,这样就涉及到了一个输入的程序。

需要使用头文件
#include<conio.h>
和函数:

getch();

该函数的作用是进行输入值,但是它于我们的“cin>>”和“scanf()”不同的是,使用getch()函数输入不需要按回车。很容易理解,因为我们在游戏中不能让H走动一下按一下回车。所以接下来我们写定义两个坐标,和输入走动按键的程序:

int i,x,y,p,q;
    char z;
    x=1,y=1,p=13,q=12;//用x,y表示H坐标,p,q表示迷宫出口坐标
    z=getch();//移动键的输入

现在有了坐标,我们就可以做移动系统了,通过if语句来实现,比如要控制H向上移动,我们需要按w键,代码如下:

 		if(z=='w')
        {
            if(a[x-1][y]!='O')
            {
                a[x][y]=' ';
                x--;
                a[x][y]='H';
            }
        }

显然,我们不能让H撞到障碍物,所以当H移动后的下一个坐标处不是墙壁“O”才行。并且,移动一次之后,H原来的坐标处要变成空的,即用空格来表示。然后将移动后的位置变成H,这样我们就完成了H向上移动的代码,同理,我们可以写出其他三个方向移动的代码:

if(z=='s')
        {
            if(a[x+1][y]!='O')
            {
                a[x][y]=' ';
                x++;
                a[x][y]='H';
            }
        }
        if(z=='d')
        {
            if(a[x][y+1]!='O')
            {
                a[x][y]=' ';
                y++;
                a[x][y]='H';

            }
        }
        if(z=='a')
        {
            if(a[x][y-1]!='O')
            {
                a[x][y]=' ';
                y--;
                a[x][y]='H';
            }
        }

但是有了这些我们怎么让计算机将移动后的样子显示出来呢?
这里要用到程序:

system("cls");

这是一个清屏程序,它的执行速度很快,所以我们可以在执行完清屏操作后立即将移动后的程序输出,这样看起来就是H进行了一次移动。为了使H可以无限次的移动,我们将移动系统的代码加在循环里,具体如下:

char a[50][50]={"OOOOOOOOOOOOOOO",
                    "OH  O    O    O",
                    "OOO O OO O OO O",
                    "O   O  O O    O",
                    "OO OOO O OO OOO",
                    "OO     O O    O",
                    "OOOOOOOO OO O O",
                    "OO       O  O O",
                    "OO OOOOOOOO O O",
                    "OO O        O O",
                    "OO OOOOOOO OO O",
                    "OO       O O  O",
                    "OOOOOOOO   O OO",
                    "OOOOOOOOOOOO OO",};
    int i,x,y,p,q;
    char z;
    x=1,y=1,p=13,q=12;
    for(i=0;i<=13;i++)
        puts(a[i]);
    while(1)
    {
        z=getch();
        if(z=='s')
        {
            if(a[x+1][y]!='O')
            {
                a[x][y]=' ';
                x++;
                a[x][y]='H';
            }
        }
        if(z=='d')
        {
            if(a[x][y+1]!='O')
            {
                a[x][y]=' ';
                y++;
                a[x][y]='H';

            }
        }
        if(z=='a')
        {
            if(a[x][y-1]!='O')
            {
                a[x][y]=' ';
                y--;
                a[x][y]='H';
            }
        }
        if(z=='w')
        {
            if(a[x-1][y]!='O')
            {
                a[x][y]=' ';
                x--;
                a[x][y]='H';
            }
        }
        system("cls");
        for(i=0;i<=13;i++)
            puts(a[i]);
    }

这样你就可以控制H在你做的迷宫中任意的走动了。但是要想使它成为一个游戏,我们还需要加入获胜条件,对于迷宫来说,胜利条件就是到达出口处,这样我们就能加入程序“在到达出口时,跳出循环,并宣布获胜”
即:

if(x==p&&y==q)
            break;

和:

system("cls");
   printf("You win!");

为了让程序结束后再停顿几秒,可以加入由#include<windows.h>头文件中的Sleep()函数
再为你的迷宫加上喜欢的颜色,最终代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
int main()
{
    system("color 0a");
    char a[50][50]={"OOOOOOOOOOOOOOO",
                    "OH  O    O    O",
                    "OOO O OO O OO O",
                    "O   O  O O    O",
                    "OO OOO O OO OOO",
                    "OO     O O    O",
                    "OOOOOOOO OO O O",
                    "OO       O  O O",
                    "OO OOOOOOOO O O",
                    "OO O        O O",
                    "OO OOOOOOO OO O",
                    "OO       O O  O",
                    "OOOOOOOO   O OO",
                    "OOOOOOOOOOOO OO",};
    int i,x,y,p,q;
    char z;
    x=1,y=1,p=13,q=12;
    for(i=0;i<=13;i++)
        puts(a[i]);
    while(1)
    {
        z=getch();
        if(z=='s')
        {
            if(a[x+1][y]!='O')
            {
                a[x][y]=' ';
                x++;
                a[x][y]='H';
            }
        }
        if(z=='d')
        {
            if(a[x][y+1]!='O')
            {
                a[x][y]=' ';
                y++;
                a[x][y]='H';

            }
        }
        if(z=='a')
        {
            if(a[x][y-1]!='O')
            {
                a[x][y]=' ';
                y--;
                a[x][y]='H';
            }
        }
        if(z=='w')
        {
            if(a[x-1][y]!='O')
            {
                a[x][y]=' ';
                x--;
                a[x][y]='H';
            }
        }
        if(x==p&&y==q)
            break;


        system("cls");
        for(i=0;i<=13;i++)
            puts(a[i]);
    }
    system("cls");
    printf("You win!");
    Sleep(5000);
    system("pause");
    return 0;
}

在这里插入图片描述
在这里插入图片描述
如图,H已经可以移动,并且在到达出口时赢得游戏了!
在这里插入图片描述

推箱子的移动系统

有了做迷宫的方法,我们便只需要对移动系统进行稍微改进就可以做出推箱子游戏了。
要知道,推箱子和迷宫唯一不同的,也是唯一的难点就是“箱子”。我们不光要控制H的移动,还有箱子O是被“推动”的。这样一来,if语句要判断的内容就多了。比如:箱子移动的下一个坐标处是不是墙、箱子的下一个坐标处是不是箱子。还有我们在玩经典推箱子时会发现:箱子遇到了*时要有变化,比如变颜色。那我们可以把小球O这个箱子变成@,但这也需要代码来解决。还有当小人走到了*处时,*会变成小人H,可小人H离开后,该点又要变成*,箱子进入*里要变成@,可出来又要变成O,这些这种种因素我们都要考虑进去。
但它们的原理都是和迷宫的不撞墙的一样的,所以我就不一一解释这些了,直接看代码:

        if(z=='w')
        {
            if(a[x-1][y]!='#')
            {
                if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]!=' ')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='@';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]==' ')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='a')
        {
            if(a[x][y-1]!='#')
            {
                if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]!=' ')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='@';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]==' ')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='d')
        {
            if(a[x][y+1]!='#')
            {
                if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]!=' ')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='@';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]==' ')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                }
            }
        }
        if(z=='s')
        {
            if(a[x+1][y]!='#')
            {
                if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]!=' ')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='@';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]==' ')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                }
            }
        }

这就是推箱子的移动系统,就是依据迷宫的框架进行完善移动条件。

推箱子其他细节

我们知道,推箱子的胜利条件是将所有箱子都移动到指定位置,所以相比于迷宫的到达出口,我们只是多了几个判断的坐标而已。而推箱子没有过关失败的触发,可当我们将箱子推到了死角处时,就无法继续游戏通过了,所以我们还要加设重新开始的程序,比如按“r”,关卡就会重置。根据这些细节,下面小编列出一个最简单的推箱子关卡:

{
 a:
    char a[20][20]={"             ",
                    "             ",
                    "     ###     ",
                    "     #*#     ",
                    "     # #     ",
                    "  ####O######",
                    "  #*  OH O *#",
                    "  #####O#####",
                    "      # #    ",
                    "      #*#    ",
                    "      ###    "};
    system("cls");
    for(int i=0;i<=11;i++)
        {
            puts(a[i]);
        }
    int x,y;
    x=6,y=7;
    while(1)
    {
        char z;
        z=getch();
        if(z=='w')
        {
            if(a[x-1][y]!='#')
            {
                if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]!=' ')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='@';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]==' ')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='a')
        {
            if(a[x][y-1]!='#')
            {
                if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]!=' ')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='@';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]==' ')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='d')
        {
            if(a[x][y+1]!='#')
            {
                if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]!=' ')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='@';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]==' ')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                }
            }
        }
        if(z=='s')
        {
            if(a[x+1][y]!='#')
            {
                if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]!=' ')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='@';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]==' ')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                }
            }
        }
        if(z=='r')
            goto a;
        check1(a);
        system("cls");
        for(int i=0;i<=11;i++)
        {
            puts(a[i]);
        }
        if(a[6][3]=='@'&&a[6][11]=='@'&&a[9][7]=='@'&&a[3][6]=='@')
            {Sleep(1500);break;}
    }
    system("cls");
    cout<<"

          这只是第一关哦,来看看下一关吧!";
    Sleep(3000);
}

这是完整的推箱子第一关,关于重置关卡的问题,我采用了C++中一个非常好用的代码:

a:
goto a;

你可以选择一个你喜欢的标记,可以是单词也可以是字母,在你代码中需要的位置加上它并带着冒号,只要有了这个标记,当下面遇到了代码goto就会无条件的立刻返回你的标记处。这样对于推箱子,当我们按下r时,就可以返回最开始处重置你的关卡,起到了重新开始的作用。

干货

好了,废话不多说,小编送上推箱子前四关的代码:
第二关

{
b:
    char a[20][20]={"            ",
                    "            ",
                    "  #####     ",
                    "  #H  #     ",
                    "  # OO# ### ",
                    "  # O # #*# ",
                    "  ### ###*# ",
                    "   ##    *# ",
                    "   #   #  # ",
                    "   #   #### ",
                    "   #####    ",};
    system("color 0a");
    system("cls");
    for(int i=0;i<=11;i++)
        {
            puts(a[i]);
        }
    int x,y;
    x=3,y=3;
    while(1)
    {
        char z;
        z=getch();
        if(z=='r')
            goto b;
        if(z=='w')
        {
            if(a[x-1][y]!='#')
            {
                if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='@';
                }
                else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='a')
        {
            if(a[x][y-1]!='#')
            {
                if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='@';
                }
                else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='d')
        {
            if(a[x][y+1]!='#')
            {
                if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='@';
                }
                else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                }
            }
        }
        if(z=='s')
        {
            if(a[x+1][y]!='#')
            {
                if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='@';
                }
                else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                }
            }
        }
        check2(a);
        system("cls");
        for(int i=0;i<=11;i++)
        {
            puts(a[i]);
        }
        if(a[5][9]=='@'&&a[6][9]=='@'&&a[7][9]=='@')
            {Sleep(1500);break;}
    }
    system("cls");
    cout<<"

          你只是侥幸获胜!过了下一关再说!";
    Sleep(3000);
}

第三关

{
c:
    char a[20][20]={"             ",
                    "             ",
                    "   #######   ",
                    "   #     ### ",
                    "  ##O###   # ",
                    "  # H O  O # ",
                    "  # **# O ## ",
                    "  ##**#   #  ",
                    "   ########  ",
                    "             ",
                    "             ",};
    system("color 03");
    system("cls");
    for(int i=0;i<=11;i++)
        {
            puts(a[i]);
        }
    int x,y;
    x=5,y=4;
    while(1)
    {
        char z;
        z=getch();
        if(z=='r')
            goto c;
        if(z=='w')
        {
            if(a[x-1][y]!='#')
            {
                if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]!=' ')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='@';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]==' ')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='a')
        {
            if(a[x][y-1]!='#')
            {
                if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]!=' ')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='@';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]==' ')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='d')
        {
            if(a[x][y+1]!='#')
            {
                if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]!=' ')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='@';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]==' ')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                }
            }
        }
        if(z=='s')
        {
            if(a[x+1][y]!='#')
            {
                if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]!=' ')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='@';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]==' ')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                }
            }
        }
        check3(a);
        system("cls");
        for(int i=0;i<=11;i++)
        {
            puts(a[i]);
        }
        if(a[6][4]=='@'&&a[6][5]=='@'&&a[7][4]=='@'&&a[7][5]=='@')
            {Sleep(1500);break;}
    }
    system("cls");
    cout<<"

          这你都能过??天哪!!";
    Sleep(3000);
}

第四关

{
d:
    char a[20][20]={"             ",
                    "             ",
                    "   ####      ",
                    "  ##  #      ",
                    "  #HO #      ",
                    "  ##O ##     ",
                    "  ## O #     ",
                    "  #*O  #     ",
                    "  #**@*#     ",
                    "  ######     ",
                    "             ",};
    system("color 04");
    system("cls");
    for(int i=0;i<=11;i++)
        {
            puts(a[i]);
        }
    int x,y;
    x=4,y=3;
    while(1)
    {
        char z;
        z=getch();
        if(z=='r')
            goto d;
        if(z=='w')
        {
            if(a[x-1][y]!='#')
            {
                if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]!=' ')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='@';
                }
                else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]==' ')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                    a[x-1][y]='O';
                }
                else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
                {
                    a[x][y]=' ';
                    x--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='a')
        {
            if(a[x][y-1]!='#')
            {
                if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]!=' ')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='@';
                }
                else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]==' ')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                    a[x][y-1]='O';
                }
                else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
                {
                    a[x][y]=' ';
                    y--;
                    a[x][y]='H';
                }
            }
        }
        if(z=='d')
        {
            if(a[x][y+1]!='#')
            {
                if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]!=' ')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='@';
                }
                else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]==' ')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                    a[x][y+1]='O';
                }
                else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
                {
                    a[x][y]=' ';
                    y++;
                    a[x][y]='H';
                }
            }
        }
        if(z=='s')
        {
            if(a[x+1][y]!='#')
            {
                if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]!=' ')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='@';
                }
                else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]==' ')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                    a[x+1][y]='O';
                }
                else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
                {
                    a[x][y]=' ';
                    x++;
                    a[x][y]='H';
                }
            }
        }
        check4(a);
        system("cls");
        for(int i=0;i<=11;i++)
        {
            puts(a[i]);
        }
        if(a[7][3]=='@'&&a[8][3]=='@'&&a[8][4]=='@'&&a[8][5]=='@'&&a[8][6]=='@')
            {Sleep(1500);break;}
    }
    system("cls");
    cout<<"

         行!可以!!很棒!!!";
    Sleep(3000);
}

以上就是今天的推箱子代码教学过程,想要制作更多的关卡只需要更改你的推箱子地图,小人H起始位置,过关胜利条件,再配上我们的移动系统就可以啦,赶快去试试吧!!!

2021.1.31

   

更多内容详见微信公众号:Python测试和开发

Python测试和开发

原文地址:https://www.cnblogs.com/phyger/p/14357557.html