#include <iostream>
#include <string>
#include <Windows.h>
#include <graphics.h>
#include <conio.h>
//定義圖片,地圖
#define IMG_SIZE 61
#define BG_WIDTH 800
#define BG_HEIGTH 640
#define WIDTH_MOVE 34
#define HEIGTH_MOVE 45
#define MAP_LINE 9
#define MAP_COLUMN 12
#define VICTORY_WIDTH 607
#define VICTORY_HEIGTH 318
//定義人物移動的方向
#define KEY_UP 'w'
#define KEY_DOWN 's'
#define KEY_LEFT 'a'
#define KEY_RIGHT 'd'
#define QUIET 'q'
//人的位置
struct _POS{
int x;
int y;
};
//枚舉道具
enum PROP{
WALL,
FLOOER,
BOX_DEC,
MAN,
BOX,
HIT,
ALL
};
//枚舉方向
enum direction{
UP,
DOWN,
LEFT,
RIGHT
};
//創建數組來存放不同種類的圖片
IMAGE img[ALL];
struct _POS man;
//遊戲地圖:0-墻,1-地板,2-箱子目的地,3-小人,4-箱子,5-箱子目的地
int map[][12] = {{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}};
//改變道具
void changeProp(int x,int y,enum PROP pro){
map[x][y] = pro;
putimage(WIDTH_MOVE+IMG_SIZE*y,HEIGTH_MOVE+IMG_SIZE*x,&img[map[x][y]]);
}
//判斷遊戲是否結束
bool gameOver(){
for(int i=0; i<MAP_LINE; i++){
for(int j=0; j<MAP_COLUMN; j++){
if(map[i][j] == BOX_DEC){
return false;
}
}
}
return true;
}
//繪結束界面圖
void gameOverScren(IMAGE *bg){
IMAGE victory;
putimage(0,0,bg);
loadimage(&victory,_T("victory.jpg"),VICTORY_WIDTH,VICTORY_HEIGTH,true); //加載背景圖片
putimage(96,161,&victory);
}
//控制人物,操作遊戲
void controlGame(enum direction direct){
struct _POS preMan = man;
struct _POS preBox = man;
switch(direct){
case UP:
preMan.x--;
preBox.x-=2;
break;
case DOWN:
preMan.x++;
preBox.x+=2;
break;
case LEFT:
preMan.y--;
preBox.y-=2;
break;
case RIGHT:
preMan.y++;
preBox.y+=2;
break;
}
//判斷小人前面是不是地板
if(map[preMan.x][preMan.y] == FLOOER){
changeProp(preMan.x,preMan.y,MAN);
changeProp(man.x,man.y,FLOOER);
man = preMan;
}else if(map[preMan.x][preMan.y] == BOX){ //判斷小人前面是不是箱子
if(map[preBox.x][preBox.y] == FLOOER){
changeProp(preBox.x,preBox.y,BOX);
changeProp(preMan.x,preMan.y,MAN);
changeProp(man.x,man.y,FLOOER);
man = preMan;
}else if(map[preBox.x][preBox.y] == BOX_DEC){
changeProp(preBox.x,preBox.y,HIT);
changeProp(preMan.x,preMan.y,MAN);
changeProp(man.x,man.y,FLOOER);
man = preMan;
}
}
}
int main(void){
IMAGE bg_img; //創建圖片對象
initgraph(BG_WIDTH,BG_HEIGTH); //初始化窗口大小
loadimage(&bg_img,_T("blackground.bmp"),BG_WIDTH,BG_HEIGTH,true); //加載背景圖片
putimage(0,0,&bg_img); //把圖片放到窗口上
//加載墻,人等圖片
loadimage(&img[WALL],_T("wall_right.bmp"),IMG_SIZE,IMG_SIZE,true);
loadimage(&img[FLOOER],_T("floor.bmp"),IMG_SIZE,IMG_SIZE,true);
loadimage(&img[BOX_DEC],_T("des.bmp"),IMG_SIZE,IMG_SIZE,true);
loadimage(&img[MAN],_T("man.bmp"),IMG_SIZE,IMG_SIZE,true);
loadimage(&img[BOX],_T("box.bmp"),IMG_SIZE,IMG_SIZE,true);
loadimage(&img[HIT],_T("box.bmp"),IMG_SIZE,IMG_SIZE,true);
//構建地圖,同時記錄人所在的位置
for(int i=0; i<MAP_LINE; i++){
for(int j=0; j<MAP_COLUMN; j++){
if(map[i][j] == MAN){
man.x = i;
man.y = j;
}
putimage(WIDTH_MOVE+IMG_SIZE*j,HEIGTH_MOVE+IMG_SIZE*i,&img[map[i][j]]);
}
}
//判斷按下鍵盤的方向鍵
bool quiet = false;
do{
if(_kbhit()){
char ch = _getch(); //獲取鍵盤按下的值,轉換為char字母
if(ch == KEY_UP){
controlGame(UP);
}else if(ch == KEY_DOWN){
controlGame(DOWN);
}else if(ch == KEY_LEFT){
controlGame(LEFT);
}else if(ch == KEY_RIGHT){
controlGame(RIGHT);
}else if(ch == QUIET){
quiet = true;
}
}
if(gameOver()){
quiet = true;
}
Sleep(100);
}while(quiet == false);
gameOverScren(&bg_img);
closegraph();
return 0;
}
项目练习-推箱子V1.0
最新推荐文章于 2025-04-29 10:04:43 发布