プロジェクト演習-倉庫番V1.0

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

おすすめ

転載: blog.csdn.net/jjswift/article/details/113130001
おすすめ