如何使用C++做個簡單推箱子游戲


此文轉載自:https://blog.csdn.net/qq_51000584/article/details/113447216

今天向大家介紹一下如何使用C++來寫一個推箱子游戲的代碼

首先要做出推箱子,我們先要明確它的思路是什么:
在這里插入圖片描述
如圖,在一個推箱子游戲中,我們首先要有一個二維的地圖,並在地圖中加入障礙物,箱子,小人,還有箱子需要到達的指定地點。當然,簡單的把這幾個人因素呈現出來是很簡單的,如下面的代碼:

#include<iostream>
using namespace std;
int main()
{
    cout<<"\n\n";
    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<<"\n\n          這只是第一關哦,來看看下一關吧!";
    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<<"\n\n          你只是僥幸獲勝!過了下一關再說!";
    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<<"\n\n          這你都能過??天哪!!";
    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<<"\n\n         行!可以!!很棒!!!";
    Sleep(3000);
}

以上就是今天的推箱子代碼教學過程,想要制作更多的關卡只需要更改你的推箱子地圖,小人H起始位置,過關勝利條件,再配上我們的移動系統就可以啦,趕快去試試吧!!!

2021.1.31


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM