C語言實現(xiàn)簡單的推箱子游戲
本文實例為大家分享了C語言實現(xiàn)簡單的推箱子游戲的具體代碼,供大家參考,具體內(nèi)容如下
項目實現(xiàn)的具體方案:
先安裝VS2019,后安裝畫圖工具Easyx,安裝以后就可以將推箱子中的(人物,墻壁,箱子目的地,箱子)的圖片加載到程序中顯示出來。游戲的實現(xiàn)是通過程序讀取鍵盤中輸入的字母,后控制加載到程序中的人物圖片的移動實現(xiàn)小人的移動,通過人物圖片和地板圖片交換位置實現(xiàn)人物的行走,如果人物前面是箱子圖片,箱子圖片前面是地板圖片,則人物圖片和箱子圖片一起移動,直到箱子圖片前面是箱子目的地圖片則箱子圖片將箱子目的地替換,從而實現(xiàn)將箱子推到箱子目的地上。這就是實現(xiàn)游戲的思路,程序中還有各種細節(jié)在下面進行講解。在開始編寫程序時先創(chuàng)建一個c++空項目,把cpp文件和地圖中相對應(yīng)的元素圖片(人物,墻壁,箱子目的地,箱子)放在同一個目錄下面。
1、開始先進行地圖大小的實現(xiàn)
(1)我們先初始化圖形界面的大小
#define SCREEN_WIDTH 976 #define SCREEN_HEIGHT 549?? ? ? //窗口初始化 ?? ?initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//括號中的是窗口的長和寬為了以后可以方便改變大小所以進行了宏定義
(2)窗口大小初始化完以后進行開始游戲界面的實現(xiàn)
IMAGE bg_img2; //申請一個句柄用來存放圖片 ?? ? //游戲開始背景背景圖 ?? ?loadimage(&bg_img2,_T("blachground.jpg"),732,549,true); //將圖片blachground.jpg加載到&bg_img2 ?? ?GameStarSCREEN(&bg_img2); ? ?? ?Sleep(1000); //休眠1000毫秒 ? //函數(shù)GameStarSCREEN的實現(xiàn) //游戲開始界面 void GameStarSCREEN(IMAGE *bg){ ?? ?putimage(0,0,bg); //把圖片播放在(0,0)坐標 ? ?? ?//設(shè)置窗口標題 ?? ?HWND window = GetHWnd();//獲取窗口 ?? ?SetWindowText(window,_T("推箱子 ***"));//設(shè)置窗口標題 ? ?? ?//設(shè)置文本樣式及顏色 ?? ?settextcolor(WHITE); ?? ?settextstyle(20,0,_T("宋體")); ?? ?outtextxy(LINE1,COW1,_T("歡迎進入本人設(shè)置的游戲")); }
游戲開始界面效果
(3)游戲開始界面設(shè)置完以后進行游戲操作指南和游戲規(guī)則的界面設(shè)置
//游戲正在進行界面 void BeingGameSCREEN(){ ?? ?//清除界面 ?? ?cleardevice(); ?? ?//畫一個矩形 ?? ?rectangle(762,30,952,244); ?? ?settextcolor(WHITE); ?//設(shè)置字體顏色 ?? ?settextstyle(15,0,_T("宋體")); //設(shè)置字體的寬度和高度以及字體的類型 ?? ?outtextxy(772,40,_T("游戲操作指南:")); //在對應(yīng)的坐標位置輸出引號內(nèi)的字符串 ?? ?outtextxy(772,60,_T("按 W 向上移動")); ?? ?outtextxy(772,75,_T("按 S 向下移動")); ?? ?outtextxy(772,90,_T("按 A 向左移動")); ?? ?outtextxy(772,105,_T("按 D 向右移動")); ?? ? ?? ?outtextxy(772,130,_T("溫馨提示:")); ?? ?outtextxy(772,170,_T("請在 58 步以內(nèi)完成任務(wù)")); ?? ?outtextxy(772,200,_T("退出請按 Q")); ? ?? ?rectangle(922,450,762,264); ?? ?outtextxy(772,284,_T("您以走的步數(shù)為:")); }
游戲操作指南效果圖
(4)進行游戲地圖的實現(xiàn)
先定義一個全局的二維數(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}, };
定義一個枚舉類型用來設(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 //地圖元素大小 ? //申請一個全局的一維的數(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)坐標對應(yīng)的數(shù)字與后來設(shè)置的以為數(shù)組中對應(yīng)的枚舉值相對應(yīng)這樣方可進行地圖的實現(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]]); ?? ??? ?} ?? ?}
地圖實現(xiàn)的效果圖
2、進行游戲控制環(huán)節(jié)的實現(xiàn),游戲的控制是通過控制小人的移動實現(xiàn)
所以我們先定義一個全局的結(jié)構(gòu)體來表示小人在地圖中的位置
struct _pos{ ? int x; //小人的橫坐標 ? int y; //小人的縱坐標 }; ? struct _pos man;
小人坐標定義好以后我們要獲取小人在地圖中的坐標才能對小人進行移動,小人的坐標隨我們不斷移動而改變所以餓哦們要不斷獲取小人的坐標
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)定義一個枚舉類型用來表示移動的方向
//枚舉控制地圖中小人的運動方向 enum DURATION{ ?? ?UP, ?? ?DOWN, ?? ?LEFT, ?? ?RIGHT }; ? enum DURATION direct;
(2)獲取小人位置后對小人進行移動
bool quit=false; //定義一個布爾類型 ? ?? ?do{ ?? ??? ?if(_kbhit()){ //識別從鍵盤輸入的字母 ?? ??? ??? ?char ch=_getch(); //從鍵盤輸入字母 ?? ??? ??? ?cnt++; ?? ??? ??? ?Record_Steps(); //記錄走過的步數(shù),每次進入識別鍵盤輸入說明移動了一次從而進行步數(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)接下來進行人物的移動方向的判斷
//控制程序運行小人移動和方塊移動 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; ?? ??? ??? ?} ?? ??? ?} ?? ?} }
(5)對人物移動方向判斷后進行地圖中元素位置進行改變才能真正實現(xiàn)人物的移動
//改變地圖元素 void mapChange(int line,int colum,enum _PROPS poc){ ?? ?map[line][colum]=poc; ?? ?putimage(colum*RATIO,line*RATIO,&images[poc]); }
3、人物控制結(jié)束以后進行游戲結(jié)束界面的設(shè)計
(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退出游戲")); }
效果圖
(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退出游戲")); }
效果圖
4、具體代碼實現(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]; ? //地圖的實現(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退出游戲")); } ? //游戲非正常結(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退出游戲")); } ? //游戲開始界面 void GameStarSCREEN(IMAGE *bg){ ?? ?putimage(0,0,bg); ? ?? ?//設(shè)置窗口標題 ?? ?HWND window = GetHWnd();//獲取窗口 ?? ?SetWindowText(window,_T("推箱子 ***"));//設(shè)置窗口標題 ? ?? ?//設(shè)置文本樣式及顏色 ?? ?settextcolor(WHITE); ?? ?settextstyle(20,0,_T("宋體")); ?? ?outtextxy(LINE1,COW1,_T("歡迎進入本人設(shè)置的游戲")); } ? //游戲正在進行界面 void BeingGameSCREEN(){ ?? ?//清除界面 ?? ?cleardevice(); ?? ?//畫一個矩形 ?? ?rectangle(762,30,952,244); ?? ?settextcolor(WHITE); ?? ?settextstyle(15,0,_T("宋體")); ?? ?outtextxy(772,40,_T("游戲操作指南:")); ?? ?outtextxy(772,60,_T("按 W 向上移動")); ?? ?outtextxy(772,75,_T("按 S 向下移動")); ?? ?outtextxy(772,90,_T("按 A 向左移動")); ?? ?outtextxy(772,105,_T("按 D 向右移動")); ?? ? ?? ?outtextxy(772,130,_T("溫馨提示:")); ?? ?outtextxy(772,170,_T("請在 58 步以內(nèi)完成任務(wù)")); ?? ?outtextxy(772,200,_T("退出請按 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); } ? //枚舉控制地圖中小人的運動方向 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]); } ? //控制程序運行小人移動和方塊移動 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文件的實現(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){ ? ?? ?//申請一個句柄 ?? ?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); ? ?? ?//游戲正在進行界面 ?? ?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、這是本人對推箱子游戲的見解如果有什么錯誤請指正
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言 scanf輸入多個數(shù)字只能以逗號分隔的操作
這篇文章主要介紹了C語言 scanf輸入多個數(shù)字只能以逗號分隔的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12