欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子游戲

 更新時(shí)間:2022年01月20日 14:40:27   作者:小生_無(wú)情  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子游戲的具體代碼,供大家參考,具體內(nèi)容如下

項(xiàng)目實(shí)現(xiàn)的具體方案:

先安裝VS2019,后安裝畫(huà)圖工具Easyx,安裝以后就可以將推箱子中的(人物,墻壁,箱子目的地,箱子)的圖片加載到程序中顯示出來(lái)。游戲的實(shí)現(xiàn)是通過(guò)程序讀取鍵盤(pán)中輸入的字母,后控制加載到程序中的人物圖片的移動(dòng)實(shí)現(xiàn)小人的移動(dòng),通過(guò)人物圖片和地板圖片交換位置實(shí)現(xiàn)人物的行走,如果人物前面是箱子圖片,箱子圖片前面是地板圖片,則人物圖片和箱子圖片一起移動(dòng),直到箱子圖片前面是箱子目的地圖片則箱子圖片將箱子目的地替換,從而實(shí)現(xiàn)將箱子推到箱子目的地上。這就是實(shí)現(xiàn)游戲的思路,程序中還有各種細(xì)節(jié)在下面進(jìn)行講解。在開(kāi)始編寫(xiě)程序時(shí)先創(chuàng)建一個(gè)c++空項(xiàng)目,把cpp文件和地圖中相對(duì)應(yīng)的元素圖片(人物,墻壁,箱子目的地,箱子)放在同一個(gè)目錄下面。

1、開(kāi)始先進(jìn)行地圖大小的實(shí)現(xiàn)

(1)我們先初始化圖形界面的大小

#define SCREEN_WIDTH 976
#define SCREEN_HEIGHT 549?? ?
?
//窗口初始化
?? ?initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//括號(hào)中的是窗口的長(zhǎng)和寬為了以后可以方便改變大小所以進(jìn)行了宏定義

(2)窗口大小初始化完以后進(jìn)行開(kāi)始游戲界面的實(shí)現(xiàn)

IMAGE bg_img2; //申請(qǐng)一個(gè)句柄用來(lái)存放圖片
?? ?
//游戲開(kāi)始背景背景圖
?? ?loadimage(&bg_img2,_T("blachground.jpg"),732,549,true); //將圖片blachground.jpg加載到&bg_img2
?? ?GameStarSCREEN(&bg_img2);
?
?? ?Sleep(1000); //休眠1000毫秒
?
//函數(shù)GameStarSCREEN的實(shí)現(xiàn)
//游戲開(kāi)始界面
void GameStarSCREEN(IMAGE *bg){
?? ?putimage(0,0,bg); //把圖片播放在(0,0)坐標(biāo)
?
?? ?//設(shè)置窗口標(biāo)題
?? ?HWND window = GetHWnd();//獲取窗口
?? ?SetWindowText(window,_T("推箱子 ***"));//設(shè)置窗口標(biāo)題
?
?? ?//設(shè)置文本樣式及顏色
?? ?settextcolor(WHITE);
?? ?settextstyle(20,0,_T("宋體"));
?? ?outtextxy(LINE1,COW1,_T("歡迎進(jìn)入本人設(shè)置的游戲"));
}

游戲開(kāi)始界面效果

(3)游戲開(kāi)始界面設(shè)置完以后進(jìn)行游戲操作指南和游戲規(guī)則的界面設(shè)置

//游戲正在進(jìn)行界面
void BeingGameSCREEN(){
?? ?//清除界面
?? ?cleardevice();
?? ?//畫(huà)一個(gè)矩形
?? ?rectangle(762,30,952,244);
?? ?settextcolor(WHITE); ?//設(shè)置字體顏色
?? ?settextstyle(15,0,_T("宋體")); //設(shè)置字體的寬度和高度以及字體的類(lèi)型
?? ?outtextxy(772,40,_T("游戲操作指南:")); //在對(duì)應(yīng)的坐標(biāo)位置輸出引號(hào)內(nèi)的字符串
?? ?outtextxy(772,60,_T("按 W 向上移動(dòng)"));
?? ?outtextxy(772,75,_T("按 S 向下移動(dòng)"));
?? ?outtextxy(772,90,_T("按 A 向左移動(dòng)"));
?? ?outtextxy(772,105,_T("按 D 向右移動(dòng)"));
?? ?
?? ?outtextxy(772,130,_T("溫馨提示:"));
?? ?outtextxy(772,170,_T("請(qǐng)?jiān)?58 步以?xún)?nèi)完成任務(wù)"));
?? ?outtextxy(772,200,_T("退出請(qǐng)按 Q"));
?
?? ?rectangle(922,450,762,264);
?? ?outtextxy(772,284,_T("您以走的步數(shù)為:"));
}

游戲操作指南效果圖

 (4)進(jìn)行游戲地圖的實(shí)現(xiàn)

先定義一個(gè)全局的二維數(shù)組用來(lái)保存地圖中的(人物,墻壁,箱子目的地,箱子)元素

int map[COW][COLUMN]={
?? ?{0,0,0,0,0,0,0,0,0,0,0,0},
?? ?{0,1,0,1,1,1,1,1,1,1,0,0},
?? ?{0,1,4,1,0,2,1,0,2,1,0,0},
?? ?{0,1,0,1,0,1,0,0,1,1,1,0},
?? ?{0,1,0,2,0,1,1,4,1,1,1,0},
?? ?{0,1,1,1,0,3,1,1,1,4,1,0},
?? ?{0,1,2,1,1,4,1,1,1,1,1,0},
?? ?{0,1,0,0,1,0,1,1,0,0,1,0},
?? ?{0,0,0,0,0,0,0,0,0,0,0,0},
};

定義一個(gè)枚舉類(lèi)型用來(lái)設(shè)置地圖中的(人物,墻壁,箱子目的地,箱子)元素

enum _PROPS{
?? ?WALL_RIGHT, //墻壁為數(shù)字0
?? ?FLOOR, ? ?//地板為數(shù)字1
?? ?DES, ? ?//箱子目的地為數(shù)字2
?? ?MAN, ? ?//人物為數(shù)字3
?? ?BOX, ? ?//箱子為數(shù)字4
?? ?BOX_HIT, ? ?//把箱子推到箱子目的地為數(shù)字5
?? ?MAN_DES, //人站在目的地上為數(shù)字6
?? ?ALL //全部道具的數(shù)量為數(shù)字7
}poc;

地圖定義完以后將地圖元素加在到二維數(shù)組中

#define RATIO 61 //地圖元素大小
?
//申請(qǐng)一個(gè)全局的一維的數(shù)組句柄
IMAGE images[ALL];?? ?
?
? ? //加載地圖元素
?? ?loadimage(&images[WALL_RIGHT],_T("wall_right.bmp"),RATIO,RATIO,true);?
?? ?loadimage(&images[FLOOR],_T("floor.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[DES],_T("des.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[MAN],_T("man.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[BOX],_T("box.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[BOX_HIT],_T("box.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[MAN_DES],_T("man.bmp"),RATIO,RATIO,true);
?
//用for循環(huán)遍歷二維數(shù)組,二維數(shù)組中相應(yīng)坐標(biāo)對(duì)應(yīng)的數(shù)字與后來(lái)設(shè)置的以為數(shù)組中對(duì)應(yīng)的枚舉值相對(duì)應(yīng)這樣方可進(jìn)行地圖的實(shí)現(xiàn)
?? ?for(int i=0;i<COW;i++){
?? ??? ?for(int j=0;j<COLUMN;j++){
?? ??? ??? ?putimage(j*RATIO,i*RATIO,&images[map[i][j]]);//根據(jù)相應(yīng)的把相應(yīng)的圖片加載到相應(yīng)的位置
?? ??? ??? ?if(map[i][j]==MAN){
?? ??? ? ? ?? ??? ?//獲取小人在二維數(shù)組中的位置
?? ??? ??? ??? ?man.x=i;
?? ??? ??? ??? ?man.y=j;
?? ??? ??? ?}
?? ??? ??? ?putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
?? ??? ?}
?? ?}

地圖實(shí)現(xiàn)的效果圖

 2、進(jìn)行游戲控制環(huán)節(jié)的實(shí)現(xiàn),游戲的控制是通過(guò)控制小人的移動(dòng)實(shí)現(xiàn)

所以我們先定義一個(gè)全局的結(jié)構(gòu)體來(lái)表示小人在地圖中的位置

struct _pos{
? int x; //小人的橫坐標(biāo)
? int y; //小人的縱坐標(biāo)
};
?
struct _pos man;

小人坐標(biāo)定義好以后我們要獲取小人在地圖中的坐標(biāo)才能對(duì)小人進(jìn)行移動(dòng),小人的坐標(biāo)隨我們不斷移動(dòng)而改變所以餓哦們要不斷獲取小人的坐標(biāo)

for(int i=0;i<COW;i++){
?? ??? ?for(int j=0;j<COLUMN;j++){
?? ??? ??? ?putimage(j*RATIO,i*RATIO,&images[map[i][j]]);//根據(jù)相應(yīng)的把相應(yīng)的圖片加載到相應(yīng)的位置
?? ??? ??? ?if(map[i][j]==MAN){
?? ??? ? ? ?? ??? ?//獲取小人在二維數(shù)組中的位置
?? ??? ??? ??? ?man.x=i;
?? ??? ??? ??? ?man.y=j;
?? ??? ??? ?}
?? ??? ??? ?putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
?? ??? ?}
?? ?}

(1)定義一個(gè)枚舉類(lèi)型用來(lái)表示移動(dòng)的方向

//枚舉控制地圖中小人的運(yùn)動(dòng)方向
enum DURATION{
?? ?UP,
?? ?DOWN,
?? ?LEFT,
?? ?RIGHT
};
?
enum DURATION direct;

(2)獲取小人位置后對(duì)小人進(jìn)行移動(dòng)

bool quit=false; //定義一個(gè)布爾類(lèi)型
?
?? ?do{
?? ??? ?if(_kbhit()){ //識(shí)別從鍵盤(pán)輸入的字母
?? ??? ??? ?char ch=_getch(); //從鍵盤(pán)輸入字母
?? ??? ??? ?cnt++;
?? ??? ??? ?Record_Steps(); //記錄走過(guò)的步數(shù),每次進(jìn)入識(shí)別鍵盤(pán)輸入說(shuō)明移動(dòng)了一次從而進(jìn)行步數(shù)加一
?? ??? ??? ?if(ch==KEY_UP){
?? ??? ??? ??? ?gameControal(UP);
?? ??? ??? ?}else if(ch==KEY_DOWN){
?? ??? ??? ??? ?gameControal(DOWN);
?? ??? ??? ?}else if(ch==KEY_LEFT){
?? ??? ??? ??? ?gameControal(LEFT);
?? ??? ??? ?}else if(ch==KEY_RIGHT){
?? ??? ??? ??? ?gameControal(RIGHT);
?? ??? ??? ?}else if(ch==KEY_QUIT){
?? ??? ??? ??? ?quit=true;
?? ??? ??? ??? ?GameOverSCREEN(&bg_img);
?? ??? ??? ?}if(isGameOver()){
?? ??? ??? ??? ?quit=true;
?? ??? ??? ??? ?GameOverSCREEN(&bg_img);
?? ??? ??? ?}if(cnt>LEN){
?? ??? ??? ??? ?quit=true;
?? ??? ??? ??? ?FalseGameOverSCREEN(&bg_img1);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?Sleep(100);
?? ?}while(quit==false);

(3)用宏定義表示從鍵盤(pán)輸入的字母

#define KEY_UP 'W'
#define KEY_DOWN 'S'
#define KEY_LEFT 'A'
#define KEY_RIGHT 'D'
#define KEY_QUIT 'Q'

(4)接下來(lái)進(jìn)行人物的移動(dòng)方向的判斷

//控制程序運(yùn)行小人移動(dòng)和方塊移動(dòng)
void gameControal(enum DURATION direct){
?? ?int x=man.x;
?? ?int y=man.y;
//對(duì)向上移動(dòng)的控制
?? ?if(direct==UP){
?? ??? ?if((x-1)>=STAR&&map[x-1][y]==DES){
?? ??? ??? ?mapChange(x-1,y,MAN_DES);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.x=x-1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x-1][y]==FLOOR){
?? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ?man.x=x-1;
?? ??? ?}else if((x-1)>=STAR&&map[x-1][y]==FLOOR){
?? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.x=x-1;
?? ??? ?}else if(map[x-1][y]==BOX_HIT&&map[x-2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x-2,y,BOX);
?? ??? ??? ??? ?mapChange(x-1,y,MAN_DES);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?man.x=x-1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x-2,y,BOX);
?? ??? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ??? ?man.x=x-1;
?? ??? ?}else if((x-1)>=STAR&&map[x-1][y]==BOX){
?? ??? ??? ?if(map[x-2][y]==FLOOR){
?? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?mapChange(x-2,y,BOX);
?? ??? ??? ?man.x=x-1;
?? ??? ??? ??? ?}else if(map[x-2][y]==DES){
?? ??? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?mapChange(x-2,y,BOX_HIT);
?? ??? ??? ??? ?man.x=x-1;
?? ??? ??? ?}
?? ??? ?}
//對(duì)向下移動(dòng)的控制
?? ?}else if(direct==DOWN){
?? ??? ?if((x+1)>=STAR&&map[x+1][y]==DES){
?? ??? ??? ?mapChange(x+1,y,MAN_DES);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.x=x+1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x+1][y]==FLOOR){
?? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ?man.x=x+1;
?? ??? ?}else if((x+1)<COW&&map[x+1][y]==FLOOR){
?? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.x=x+1;
?? ??? ?}else if(map[x+1][y]==BOX_HIT&&map[x+2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x+2,y,BOX);
?? ??? ??? ??? ?mapChange(x+1,y,MAN_DES);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?man.x=x+1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x+1][y]==BOX&&map[x+2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x+2,y,BOX);
?? ??? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ??? ?man.x=x+1;
?? ??? ?}else if((x+1)<COW&&map[x+1][y]==BOX){
?? ??? ??? ?if(map[x+2][y]==FLOOR){
?? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?mapChange(x+2,y,BOX);
?? ??? ??? ?man.x=x+1;
?? ??? ??? ?}else if(map[x+2][y]==DES){
?? ??? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?mapChange(x+2,y,BOX_HIT);
?? ??? ??? ??? ?man.x=x+1;
?? ??? ??? ?}
?? ??? ?}
//對(duì)向右移動(dòng)的控制
?? ?}else if(direct==RIGHT){
?? ??? ?if((y+1)>=STAR&&map[x][y+1]==DES){
?? ??? ??? ?mapChange(x,y+1,MAN_DES);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.y=y+1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x][y+1]==FLOOR){
?? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ?mapChange(x,y+1,MAN);
?? ??? ??? ?man.y=y+1;
?? ??? ?}else if((y+1)<COLUMN&&map[x][y+1]==FLOOR){
?? ??? ??? ?mapChange(x,y+1,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.y=y+1;
?? ??? ?}else if(map[x][y+1]==BOX_HIT&&map[x][y+2]==FLOOR){
?? ??? ??? ??? ?mapChange(x,y+2,BOX);
?? ??? ??? ??? ?mapChange(x,y+1,MAN_DES);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?man.y=y+1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x-2,y,BOX);
?? ??? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ??? ?man.x=x-1;
?? ??? ?}else if((y+1)<COLUMN&&map[x][y+1]==BOX){
?? ??? ??? ?if(map[x][y+2]==FLOOR){
?? ??? ??? ?mapChange(x,y+1,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?mapChange(x,y+2,BOX);
?? ??? ??? ?man.y=y+1;
?? ??? ??? ?}else if(map[x][y+2]==DES){
?? ??? ??? ??? ?mapChange(x,y+1,MAN);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?mapChange(x,y+2,BOX_HIT);
?? ??? ??? ??? ?man.y=y+1;
?? ??? ??? ?}
?? ??? ?}
//對(duì)向左移動(dòng)的控制
?? ?}else if(direct==LEFT){
?? ??? ?if((y-1)>=STAR&&map[x][y-1]==DES){
?? ??? ??? ?mapChange(x,y-1,MAN_DES);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.y=y-1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x][y-1]==FLOOR){
?? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ?man.y=y-1;
?? ??? ?}else if((y-1)>=0&&map[x][y-1]==FLOOR){
?? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.y=y-1;
?? ??? ?}else if(map[x][y-1]==BOX_HIT&&map[x][y-2]==FLOOR){
?? ??? ??? ??? ?mapChange(x,y-2,BOX);
?? ??? ??? ??? ?mapChange(x,y-1,MAN_DES);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?man.y=y-1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x][y-1]==BOX&&map[x][y-2]==FLOOR){
?? ??? ??? ??? ?mapChange(x,y-2,BOX);
?? ??? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ??? ?man.y=y-1;
?? ??? ?}else if((y-1)>=0&&map[x][y-1]==BOX){
?? ??? ??? ?if(map[x][y-2]==FLOOR){
?? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?mapChange(x,y-2,BOX);
?? ??? ??? ?man.y=y-1;
?? ??? ??? ?}else if(map[x][y-2]==DES){
?? ??? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?mapChange(x,y-2,BOX_HIT);
?? ??? ??? ??? ?man.y=y-1;
?? ??? ??? ?}
?? ??? ?}
?? ?}
}

(5)對(duì)人物移動(dòng)方向判斷后進(jìn)行地圖中元素位置進(jìn)行改變才能真正實(shí)現(xiàn)人物的移動(dòng)

//改變地圖元素
void mapChange(int line,int colum,enum _PROPS poc){
?? ?map[line][colum]=poc;
?? ?putimage(colum*RATIO,line*RATIO,&images[poc]);
}

3、人物控制結(jié)束以后進(jìn)行游戲結(jié)束界面的設(shè)計(jì)

(1)在規(guī)定步數(shù)內(nèi)完成游戲的背景

//游戲結(jié)束背景
void GameOverSCREEN(IMAGE *bg){
?? ?cleardevice();
?? ?putimage(0,0,bg);
?? ?settextcolor(WHITE);
?? ?RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT};
?? ?settextstyle(20,0,_T("宋體"));
?? ?outtextxy(LINE1,COW1,_T("恭喜完成了本游戲你真棒"));
?? ?outtextxy(LINE2,COW2,_T("請(qǐng)按Q退出游戲"));
}

效果圖

(1)不在規(guī)定步數(shù)內(nèi)完成游戲背景

//游戲非正常結(jié)束背景
void FalseGameOverSCREEN(IMAGE *bg){
?? ?cleardevice();
?? ?putimage(0,0,bg);
?? ?settextcolor(WHITE);
?? ?settextstyle(20,0,_T("宋體"));
?? ?outtextxy(LINE1,COW1,_T("小菜雞這都完成不了真蠢"));
?? ?outtextxy(LINE2,COW2,_T("請(qǐng)按Q退出游戲"));
}

效果圖

4、具體代碼實(shí)現(xiàn)

(1)頭文件編寫(xiě)

#define LINE1 366?
#define COW1 183
#define LINE2 427
#define COW2 244
?
#define RATIO 61
#define LEN 100
#define STAR 0
?
#define SCREEN_WIDTH 976
#define SCREEN_HEIGHT 549
?
#define COW 9
#define COLUMN 12
?
#define KEY_UP 'W'
#define KEY_DOWN 'S'
#define KEY_LEFT 'A'
#define KEY_RIGHT 'D'
#define KEY_QUIT 'Q'
?
int cnt=STAR;
?
//枚舉優(yōu)化代碼表示道具
enum _PROPS{
?? ?WALL_RIGHT,
?? ?FLOOR,
?? ?DES,
?? ?MAN,
?? ?BOX,
?? ?BOX_HIT,
?? ?MAN_DES,
?? ?ALL
}poc;
?
//enum _PROPS poc;
?
//小人在二維數(shù)組中的位置
struct _pos{
? int x;
? int y;
};
?
struct _pos man;
?
//窗口初始化
IMAGE images[ALL];
?
//地圖的實(shí)現(xiàn)
int map[COW][COLUMN]={
?? ?{0,0,0,0,0,0,0,0,0,0,0,0},
?? ?{0,1,0,1,1,1,1,1,1,1,0,0},
?? ?{0,1,4,1,0,2,1,0,2,1,0,0},
?? ?{0,1,0,1,0,1,0,0,1,1,1,0},
?? ?{0,1,0,2,0,1,1,4,1,1,1,0},
?? ?{0,1,1,1,0,3,1,1,1,4,1,0},
?? ?{0,1,2,1,1,4,1,1,1,1,1,0},
?? ?{0,1,0,0,1,0,1,1,0,0,1,0},
?? ?{0,0,0,0,0,0,0,0,0,0,0,0},
};
?
//判斷游戲是否結(jié)束
//return->false 游戲未結(jié)束 return->true 游戲結(jié)束
int isGameOver(){
?? ?for(int i=0;i<COW;i++){
?? ??? ?for(int j=0;j<COLUMN;j++){
?? ??? ??? ?if(map[i][j]==DES) return false;
?? ??? ?}
?? ?}
?? ?return true;
}
?
//游戲結(jié)束背景
void GameOverSCREEN(IMAGE *bg){
?? ?cleardevice();
?? ?putimage(0,0,bg);
?? ?settextcolor(WHITE);
?? ?RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT};
?? ?settextstyle(20,0,_T("宋體"));
?? ?outtextxy(LINE1,COW1,_T("恭喜完成了本游戲你真棒"));
?? ?outtextxy(LINE2,COW2,_T("請(qǐng)按Q退出游戲"));
}
?
//游戲非正常結(jié)束背景
void FalseGameOverSCREEN(IMAGE *bg){
?? ?cleardevice();
?? ?putimage(0,0,bg);
?? ?settextcolor(WHITE);
?? ?settextstyle(20,0,_T("宋體"));
?? ?outtextxy(LINE1,COW1,_T("小菜雞這都完成不了真蠢"));
?? ?outtextxy(LINE2,COW2,_T("請(qǐng)按Q退出游戲"));
}
?
//游戲開(kāi)始界面
void GameStarSCREEN(IMAGE *bg){
?? ?putimage(0,0,bg);
?
?? ?//設(shè)置窗口標(biāo)題
?? ?HWND window = GetHWnd();//獲取窗口
?? ?SetWindowText(window,_T("推箱子 ***"));//設(shè)置窗口標(biāo)題
?
?? ?//設(shè)置文本樣式及顏色
?? ?settextcolor(WHITE);
?? ?settextstyle(20,0,_T("宋體"));
?? ?outtextxy(LINE1,COW1,_T("歡迎進(jìn)入本人設(shè)置的游戲"));
}
?
//游戲正在進(jìn)行界面
void BeingGameSCREEN(){
?? ?//清除界面
?? ?cleardevice();
?? ?//畫(huà)一個(gè)矩形
?? ?rectangle(762,30,952,244);
?? ?settextcolor(WHITE);
?? ?settextstyle(15,0,_T("宋體"));
?? ?outtextxy(772,40,_T("游戲操作指南:"));
?? ?outtextxy(772,60,_T("按 W 向上移動(dòng)"));
?? ?outtextxy(772,75,_T("按 S 向下移動(dòng)"));
?? ?outtextxy(772,90,_T("按 A 向左移動(dòng)"));
?? ?outtextxy(772,105,_T("按 D 向右移動(dòng)"));
?? ?
?? ?outtextxy(772,130,_T("溫馨提示:"));
?? ?outtextxy(772,170,_T("請(qǐng)?jiān)?58 步以?xún)?nèi)完成任務(wù)"));
?? ?outtextxy(772,200,_T("退出請(qǐng)按 Q"));
?
?? ?rectangle(922,450,762,264);
?? ?outtextxy(772,284,_T("您以走的步數(shù)為:"));
}
?
//記錄小人走過(guò)的步數(shù)
void Record_Steps(){
?? ?char str[16];
?? ?settextstyle(40,0,_T("宋體"));
?? ?sprintf(str,"%d",cnt);
?? ?outtextxy(820,350,str);
}
?
//枚舉控制地圖中小人的運(yùn)動(dòng)方向
enum DURATION{
?? ?UP,
?? ?DOWN,
?? ?LEFT,
?? ?RIGHT
};
?
enum DURATION direct;
?
//改變地圖元素
void mapChange(int line,int colum,enum _PROPS poc){
?? ?map[line][colum]=poc;
?? ?putimage(colum*RATIO,line*RATIO,&images[poc]);
}
?
//控制程序運(yùn)行小人移動(dòng)和方塊移動(dòng)
void gameControal(enum DURATION direct){
?? ?int x=man.x;
?? ?int y=man.y;
?? ?if(direct==UP){
?? ??? ?if((x-1)>=STAR&&map[x-1][y]==DES){
?? ??? ??? ?mapChange(x-1,y,MAN_DES);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.x=x-1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x-1][y]==FLOOR){
?? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ?man.x=x-1;
?? ??? ?}else if((x-1)>=STAR&&map[x-1][y]==FLOOR){
?? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.x=x-1;
?? ??? ?}else if(map[x-1][y]==BOX_HIT&&map[x-2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x-2,y,BOX);
?? ??? ??? ??? ?mapChange(x-1,y,MAN_DES);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?man.x=x-1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x-2,y,BOX);
?? ??? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ??? ?man.x=x-1;
?? ??? ?}else if((x-1)>=STAR&&map[x-1][y]==BOX){
?? ??? ??? ?if(map[x-2][y]==FLOOR){
?? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?mapChange(x-2,y,BOX);
?? ??? ??? ?man.x=x-1;
?? ??? ??? ??? ?}else if(map[x-2][y]==DES){
?? ??? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?mapChange(x-2,y,BOX_HIT);
?? ??? ??? ??? ?man.x=x-1;
?? ??? ??? ?}
?? ??? ?}
?? ?}else if(direct==DOWN){
?? ??? ?if((x+1)>=STAR&&map[x+1][y]==DES){
?? ??? ??? ?mapChange(x+1,y,MAN_DES);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.x=x+1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x+1][y]==FLOOR){
?? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ?man.x=x+1;
?? ??? ?}else if((x+1)<COW&&map[x+1][y]==FLOOR){
?? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.x=x+1;
?? ??? ?}else if(map[x+1][y]==BOX_HIT&&map[x+2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x+2,y,BOX);
?? ??? ??? ??? ?mapChange(x+1,y,MAN_DES);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?man.x=x+1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x+1][y]==BOX&&map[x+2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x+2,y,BOX);
?? ??? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ??? ?man.x=x+1;
?? ??? ?}else if((x+1)<COW&&map[x+1][y]==BOX){
?? ??? ??? ?if(map[x+2][y]==FLOOR){
?? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?mapChange(x+2,y,BOX);
?? ??? ??? ?man.x=x+1;
?? ??? ??? ?}else if(map[x+2][y]==DES){
?? ??? ??? ??? ?mapChange(x+1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?mapChange(x+2,y,BOX_HIT);
?? ??? ??? ??? ?man.x=x+1;
?? ??? ??? ?}
?? ??? ?}
?? ?}else if(direct==RIGHT){
?? ??? ?if((y+1)>=STAR&&map[x][y+1]==DES){
?? ??? ??? ?mapChange(x,y+1,MAN_DES);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.y=y+1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x][y+1]==FLOOR){
?? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ?mapChange(x,y+1,MAN);
?? ??? ??? ?man.y=y+1;
?? ??? ?}else if((y+1)<COLUMN&&map[x][y+1]==FLOOR){
?? ??? ??? ?mapChange(x,y+1,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.y=y+1;
?? ??? ?}else if(map[x][y+1]==BOX_HIT&&map[x][y+2]==FLOOR){
?? ??? ??? ??? ?mapChange(x,y+2,BOX);
?? ??? ??? ??? ?mapChange(x,y+1,MAN_DES);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?man.y=y+1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){
?? ??? ??? ??? ?mapChange(x-2,y,BOX);
?? ??? ??? ??? ?mapChange(x-1,y,MAN);
?? ??? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ??? ?man.x=x-1;
?? ??? ?}else if((y+1)<COLUMN&&map[x][y+1]==BOX){
?? ??? ??? ?if(map[x][y+2]==FLOOR){
?? ??? ??? ?mapChange(x,y+1,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?mapChange(x,y+2,BOX);
?? ??? ??? ?man.y=y+1;
?? ??? ??? ?}else if(map[x][y+2]==DES){
?? ??? ??? ??? ?mapChange(x,y+1,MAN);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?mapChange(x,y+2,BOX_HIT);
?? ??? ??? ??? ?man.y=y+1;
?? ??? ??? ?}
?? ??? ?}
?? ?}else if(direct==LEFT){
?? ??? ?if((y-1)>=STAR&&map[x][y-1]==DES){
?? ??? ??? ?mapChange(x,y-1,MAN_DES);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.y=y-1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x][y-1]==FLOOR){
?? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ?man.y=y-1;
?? ??? ?}else if((y-1)>=0&&map[x][y-1]==FLOOR){
?? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?man.y=y-1;
?? ??? ?}else if(map[x][y-1]==BOX_HIT&&map[x][y-2]==FLOOR){
?? ??? ??? ??? ?mapChange(x,y-2,BOX);
?? ??? ??? ??? ?mapChange(x,y-1,MAN_DES);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?man.y=y-1;
?? ??? ?}else if(map[x][y]==MAN_DES&&map[x][y-1]==BOX&&map[x][y-2]==FLOOR){
?? ??? ??? ??? ?mapChange(x,y-2,BOX);
?? ??? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ??? ?mapChange(x,y,DES);
?? ??? ??? ??? ?man.y=y-1;
?? ??? ?}else if((y-1)>=0&&map[x][y-1]==BOX){
?? ??? ??? ?if(map[x][y-2]==FLOOR){
?? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ?mapChange(x,y-2,BOX);
?? ??? ??? ?man.y=y-1;
?? ??? ??? ?}else if(map[x][y-2]==DES){
?? ??? ??? ??? ?mapChange(x,y-1,MAN);
?? ??? ??? ??? ?mapChange(x,y,FLOOR);
?? ??? ??? ??? ?mapChange(x,y-2,BOX_HIT);
?? ??? ??? ??? ?man.y=y-1;
?? ??? ??? ?}
?? ??? ?}
?? ?}
}

(2)main文件的實(shí)現(xiàn)

#include<graphics.h>
#include<stdlib.h>
#include<iostream>
#include<Windows.h>
#include<MMSystem.h>
#include<conio.h>
#pragma comment(lib,"winmm.lib")
?
#include "box.h"
?
using namespace std;
?
int main(void){
?
?? ?//申請(qǐng)一個(gè)句柄
?? ?IMAGE bg_img;
?? ?IMAGE bg_img1;
?? ?IMAGE bg_img2;
?
?? ?//窗口初始化
?? ?initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
?
?? ?//游戲開(kāi)始背景背景圖
?? ?loadimage(&bg_img2,_T("blachground.jpg"),732,549,true);
?? ?GameStarSCREEN(&bg_img2);
?
?? ?Sleep(1000);
?
?? ?//游戲正在進(jìn)行界面
?? ?BeingGameSCREEN();
?
?? ?//加載游戲未在規(guī)定規(guī)則內(nèi)完成的背景
?? ?loadimage(&bg_img1,_T("blackground.jpg"),732,549,true);
?
?? ?//加載游戲在規(guī)定規(guī)則內(nèi)完成的背景圖
?? ?loadimage(&bg_img,_T("blackground.jpg"),732,549,true);
?
?? ?//加載背景音樂(lè)
?? ?mciSendString(_T("play 南方.mp3 repeat"), 0, 0, 0);
?
?? ?//加載地圖元素
?? ?loadimage(&images[WALL_RIGHT],_T("wall_right.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[FLOOR],_T("floor.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[DES],_T("des.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[MAN],_T("man.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[BOX],_T("box.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[BOX_HIT],_T("box.bmp"),RATIO,RATIO,true);
?? ?loadimage(&images[MAN_DES],_T("man.bmp"),RATIO,RATIO,true);
?
?? ?for(int i=0;i<COW;i++){
?? ??? ?for(int j=0;j<COLUMN;j++){
?? ??? ??? ?putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
?? ??? ??? ?if(map[i][j]==MAN){
?? ??? ? ? ?? ??? ?//獲取小人在二維數(shù)組中的位置
?? ??? ??? ??? ?man.x=i;
?? ??? ??? ??? ?man.y=j;
?? ??? ??? ?}
?? ??? ??? ?putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
?? ??? ?}
?? ?}
?
?? ?bool quit=false;
?
?? ?do{
?? ??? ?if(_kbhit()){
?? ??? ??? ?char ch=_getch();
?? ??? ??? ?cnt++;
?? ??? ??? ?Record_Steps();
?? ??? ??? ?if(ch==KEY_UP){
?? ??? ??? ??? ?gameControal(UP);
?? ??? ??? ?}else if(ch==KEY_DOWN){
?? ??? ??? ??? ?gameControal(DOWN);
?? ??? ??? ?}else if(ch==KEY_LEFT){
?? ??? ??? ??? ?gameControal(LEFT);
?? ??? ??? ?}else if(ch==KEY_RIGHT){
?? ??? ??? ??? ?gameControal(RIGHT);
?? ??? ??? ?}else if(ch==KEY_QUIT){
?? ??? ??? ??? ?quit=true;
?? ??? ??? ??? ?GameOverSCREEN(&bg_img);
?? ??? ??? ?}if(isGameOver()){
?? ??? ??? ??? ?quit=true;
?? ??? ??? ??? ?GameOverSCREEN(&bg_img);
?? ??? ??? ?}if(cnt>LEN){
?? ??? ??? ??? ?quit=true;
?? ??? ??? ??? ?FalseGameOverSCREEN(&bg_img1);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?Sleep(100);
?? ?}while(quit==false);
?
?? ?system("pause");
?
?? ?//游戲結(jié)束釋放資源
?? ?closegraph();
?
?? ?return 0;
}

5、這是本人對(duì)推箱子游戲的見(jiàn)解如果有什么錯(cuò)誤請(qǐng)指正

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論