今天向大家介紹一下如何使用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
