最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現簡單的推箱子游戲

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

本文實例為大家分享了C語言實現簡單的推箱子游戲的具體代碼,供大家參考,具體內容如下

項目實現的具體方案:

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

1、開始先進行地圖大小的實現

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

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

(2)窗口大小初始化完以后進行開始游戲界面的實現

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

游戲開始界面效果

(3)游戲開始界面設置完以后進行游戲操作指南和游戲規(guī)則的界面設置

//游戲正在進行界面
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 步以內完成任務"));
?? ?outtextxy(772,200,_T("退出請按 Q"));
?
?? ?rectangle(922,450,762,264);
?? ?outtextxy(772,284,_T("您以走的步數為:"));
}

游戲操作指南效果圖

 (4)進行游戲地圖的實現

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

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},
};

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

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

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

#define RATIO 61 //地圖元素大小
?
//申請一個全局的一維的數組句柄
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)遍歷二維數組,二維數組中相應坐標對應的數字與后來設置的以為數組中對應的枚舉值相對應這樣方可進行地圖的實現
?? ?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){
?? ??? ? ? ?? ??? ?//獲取小人在二維數組中的位置
?? ??? ??? ??? ?man.x=i;
?? ??? ??? ??? ?man.y=j;
?? ??? ??? ?}
?? ??? ??? ?putimage(j*RATIO,i*RATIO,&images[map[i][j]]);
?? ??? ?}
?? ?}

地圖實現的效果圖

 2、進行游戲控制環(huán)節(jié)的實現,游戲的控制是通過控制小人的移動實現

所以我們先定義一個全局的結構體來表示小人在地圖中的位置

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]]);//根據相應的把相應的圖片加載到相應的位置
?? ??? ??? ?if(map[i][j]==MAN){
?? ??? ? ? ?? ??? ?//獲取小人在二維數組中的位置
?? ??? ??? ??? ?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(); //記錄走過的步數,每次進入識別鍵盤輸入說明移動了一次從而進行步數加一
?? ??? ??? ?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)對人物移動方向判斷后進行地圖中元素位置進行改變才能真正實現人物的移動

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

3、人物控制結束以后進行游戲結束界面的設計

(1)在規(guī)定步數內完成游戲的背景

//游戲結束背景
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ī)定步數內完成游戲背景

//游戲非正常結束背景
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、具體代碼實現

(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;
?
//小人在二維數組中的位置
struct _pos{
? int x;
? int y;
};
?
struct _pos man;
?
//窗口初始化
IMAGE images[ALL];
?
//地圖的實現
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},
};
?
//判斷游戲是否結束
//return->false 游戲未結束 return->true 游戲結束
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;
}
?
//游戲結束背景
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退出游戲"));
}
?
//游戲非正常結束背景
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);
?
?? ?//設置窗口標題
?? ?HWND window = GetHWnd();//獲取窗口
?? ?SetWindowText(window,_T("推箱子 ***"));//設置窗口標題
?
?? ?//設置文本樣式及顏色
?? ?settextcolor(WHITE);
?? ?settextstyle(20,0,_T("宋體"));
?? ?outtextxy(LINE1,COW1,_T("歡迎進入本人設置的游戲"));
}
?
//游戲正在進行界面
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 步以內完成任務"));
?? ?outtextxy(772,200,_T("退出請按 Q"));
?
?? ?rectangle(922,450,762,264);
?? ?outtextxy(772,284,_T("您以走的步數為:"));
}
?
//記錄小人走過的步數
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文件的實現

#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ī)則內完成的背景
?? ?loadimage(&bg_img1,_T("blackground.jpg"),732,549,true);
?
?? ?//加載游戲在規(guī)定規(guī)則內完成的背景圖
?? ?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){
?? ??? ? ? ?? ??? ?//獲取小人在二維數組中的位置
?? ??? ??? ??? ?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");
?
?? ?//游戲結束釋放資源
?? ?closegraph();
?
?? ?return 0;
}

5、這是本人對推箱子游戲的見解如果有什么錯誤請指正

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 一篇文章帶你了解C語言的選擇結構

    一篇文章帶你了解C語言的選擇結構

    這篇文章主要為大家介紹了C語言的選擇結構,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++無try-catch的異常捕獲示例詳解

    C++無try-catch的異常捕獲示例詳解

    這篇文章主要為大家介紹了C++無try-catch的異常捕獲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 詳解C++11中的線程鎖和條件變量

    詳解C++11中的線程鎖和條件變量

    C++ 11允許開發(fā)者們以標準的、不依賴于平臺的方式編寫多線程程序。這篇文章概述了標準庫對于線程和同步操作機制的支持。這些都是非常重要的知識,希望讀者們可以認真看一下
    2021-06-06
  • VS2019 更新MSDN并創(chuàng)建快捷方式的實現

    VS2019 更新MSDN并創(chuàng)建快捷方式的實現

    這篇文章主要介紹了VS2019 更新MSDN并創(chuàng)建快捷方式的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C++實現簡單貪吃蛇小游戲

    C++實現簡單貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C++實現簡單貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C語言中用于產生隨機數的函數使用方法總結

    C語言中用于產生隨機數的函數使用方法總結

    這篇文章主要介紹了C語言中用于產生隨機數的函數使用方法總結,分別介紹了rand()函數和srand()函數以及封裝出的arc4random()函數,需要的朋友可以參考下
    2016-05-05
  • Qt中QTextEdit和QPlainTextEdit控件的實現

    Qt中QTextEdit和QPlainTextEdit控件的實現

    本文主要介紹了Qt中QTextEdit和QPlainTextEdit控件的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • Assert(斷言實現機制深入剖析)

    Assert(斷言實現機制深入剖析)

    言前后最好空一格[編程風格的問題,按你自已的喜好,適合自已就最好]。斷言只是用來檢查程序的邏輯正確性,不能代替條件替換。斷言比printf語句這種形式的打印好使
    2013-09-09
  • C++實現LeetCode(131.拆分回文串)

    C++實現LeetCode(131.拆分回文串)

    這篇文章主要介紹了C++實現LeetCode(131.拆分回文串),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 深入解析C++ Data Member內存布局

    深入解析C++ Data Member內存布局

    本篇文章是對C++中的Data Member內存布局進行了詳細的分析介紹,需要的朋友參考下
    2013-07-07

最新評論

涿鹿县| 上饶市| 渑池县| 常宁市| 宝鸡市| 徐水县| 漾濞| 伊春市| 怀集县| 阳谷县| 固始县| 莒南县| 增城市| 莱阳市| 米脂县| 榆林市| 新昌县| 永新县| 金溪县| 司法| 根河市| 富民县| 神农架林区| 济南市| 浑源县| 丹凤县| 全南县| 景洪市| 平湖市| 冕宁县| 辽阳县| 漯河市| 万源市| 诸暨市| 福安市| 武定县| 商南县| 出国| 安图县| 闵行区| 东丽区|