C語言實(shí)現(xiàn)簡(jiǎn)單的推箱子游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)簡(jiǎn)單的推箱子游戲的具體代碼,供大家參考,具體內(nèi)容如下
項(xiàng)目實(shí)現(xiàn)的具體方案:
先安裝VS2019,后安裝畫圖工具Easyx,安裝以后就可以將推箱子中的(人物,墻壁,箱子目的地,箱子)的圖片加載到程序中顯示出來。游戲的實(shí)現(xiàn)是通過程序讀取鍵盤中輸入的字母,后控制加載到程序中的人物圖片的移動(dòng)實(shí)現(xiàn)小人的移動(dòng),通過人物圖片和地板圖片交換位置實(shí)現(xiàn)人物的行走,如果人物前面是箱子圖片,箱子圖片前面是地板圖片,則人物圖片和箱子圖片一起移動(dòng),直到箱子圖片前面是箱子目的地圖片則箱子圖片將箱子目的地替換,從而實(shí)現(xiàn)將箱子推到箱子目的地上。這就是實(shí)現(xiàn)游戲的思路,程序中還有各種細(xì)節(jié)在下面進(jìn)行講解。在開始編寫程序時(shí)先創(chuàng)建一個(gè)c++空項(xiàng)目,把cpp文件和地圖中相對(duì)應(yīng)的元素圖片(人物,墻壁,箱子目的地,箱子)放在同一個(gè)目錄下面。
1、開始先進(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)行開始游戲界面的實(shí)現(xiàn)
IMAGE bg_img2; //申請(qǐng)一個(gè)句柄用來存放圖片 ?? ? //游戲開始背景背景圖 ?? ?loadimage(&bg_img2,_T("blachground.jpg"),732,549,true); //將圖片blachground.jpg加載到&bg_img2 ?? ?GameStarSCREEN(&bg_img2); ? ?? ?Sleep(1000); //休眠1000毫秒 ? //函數(shù)GameStarSCREEN的實(shí)現(xiàn) //游戲開始界面 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è)置的游戲")); }
游戲開始界面效果
(3)游戲開始界面設(shè)置完以后進(jìn)行游戲操作指南和游戲規(guī)則的界面設(shè)置
//游戲正在進(jìn)行界面 void BeingGameSCREEN(){ ?? ?//清除界面 ?? ?cleardevice(); ?? ?//畫一個(gè)矩形 ?? ?rectangle(762,30,952,244); ?? ?settextcolor(WHITE); ?//設(shè)置字體顏色 ?? ?settextstyle(15,0,_T("宋體")); //設(shè)置字體的寬度和高度以及字體的類型 ?? ?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 步以內(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ù)組用來保存地圖中的(人物,墻壁,箱子目的地,箱子)元素
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è)枚舉類型用來設(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ù)字與后來設(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),游戲的控制是通過控制小人的移動(dòng)實(shí)現(xiàn)
所以我們先定義一個(gè)全局的結(jié)構(gòu)體來表示小人在地圖中的位置
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è)枚舉類型用來表示移動(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è)布爾類型 ? ?? ?do{ ?? ??? ?if(_kbhit()){ //識(shí)別從鍵盤輸入的字母 ?? ??? ??? ?char ch=_getch(); //從鍵盤輸入字母 ?? ??? ??? ?cnt++; ?? ??? ??? ?Record_Steps(); //記錄走過的步數(shù),每次進(jìn)入識(shí)別鍵盤輸入說明移動(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)用宏定義表示從鍵盤輸入的字母
#define KEY_UP 'W' #define KEY_DOWN 'S' #define KEY_LEFT 'A' #define KEY_RIGHT 'D' #define KEY_QUIT 'Q'
(4)接下來進(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)頭文件編寫
#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退出游戲")); } ? //游戲開始界面 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(); ?? ?//畫一個(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 步以內(nèi)完成任務(wù)")); ?? ?outtextxy(772,200,_T("退出請(qǐng)按 Q")); ? ?? ?rectangle(922,450,762,264); ?? ?outtextxy(772,284,_T("您以走的步數(shù)為:")); } ? //記錄小人走過的步數(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); ? ?? ?//游戲開始背景背景圖 ?? ?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); ? ?? ?//加載背景音樂 ?? ?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ì)推箱子游戲的見解如果有什么錯(cuò)誤請(qǐng)指正
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言 scanf輸入多個(gè)數(shù)字只能以逗號(hào)分隔的操作
這篇文章主要介紹了C語言 scanf輸入多個(gè)數(shù)字只能以逗號(hào)分隔的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12C語言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲操作
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03