12.2推箱子项目

#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string>
#include<conio.h>//热键头文件

using namespace std;

#define RATIO 61
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
//控制键 上下左右
#define KEY_UP 'w'
#define KEY_DOWN 's'
#define KEY_RIGHT 'd'
#define KEY_LEFT 'a'
#define KEY_QUIT 'q'

#define LINE 9
#define COLUMN 12
#define START_X 100
#define START_Y 150

enum _PROPS{
	WALL,  //墙
	FLOOR,  //地板
	BOX_DES,  //箱子目的地
	MAN,  //小人
	BOX,  //箱子
	HIT,  //箱子命中目标
	ALL  //代表前面所有道具的数量

};

enum _DIRECTION
{
	UP,
	DOWN,
	LEFT,
	RIGHT
};

struct _POS{
	int x;//小人所在的二维数组的行
	int y;//小人所在的二维数组的列
};

IMAGE images[ALL];

struct _POS man;
//游戏地图
int map[LINE][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 },
};
//改变游戏地图视图中一格对应的道具并重新显示
//输入:line-道具在地图数组的行下标
//column-道具在地图数组的列下标
//prop -道具的类型
void changeMap(int line,int column,enum _PROPS prop){
	map[line][column]=prop;
	putimage(START_X+column*RATIO,START_Y+line*RATIO,&images[prop]);

}

void gameControl(enum _DIRECTON direct){
	int x=man.x;
	int y=man.y;

	if(direct == UP){
	if((x-1)>0&&map[x-1][y]==FLOOR){
		changeMap(x-1,y,MAN);//小人前进一格
		man.x=x-1;
		changeMap(x,y,FLOOR);//
		}
	}else if(direct == DOWN){
	if((x+1)>0&&map[x+1][y]==FLOOR){
		changeMap(x-1,y,MAN);//小人前进一格
		man.x=x+1;
		changeMap(x,y,FLOOR);//
		}
	}else if(direct == LEFT){
		if((y-1)>0&&map[x][y-1]==FLOOR){
		changeMap(y-1,y,MAN);//小人前进一格
		man.y=y-1;
		changeMap(x,y,FLOOR);//
	
		}
	}else if(direct ==RIGHT){
		if((y+1)>0&&map[x][y+1]==FLOOR){
		changeMap(y+1,y,MAN);//小人前进一格
		man.y=y+1;
		changeMap(x,y,FLOOR);//
		}
	}

}



int main(){
	IMAGE bg_img;
	
	initgraph(SCREEN_WIDTH,SCREEN_HEIGHT);
	loadimage(&bg_img,_T("blackground.bmp"),
		SCREEN_WIDTH,SCREEN_HEIGHT);
	putimage(0,0,&bg_img);

	
	loadimage(&images[0],_T("wall.bmp"),RATIO,RATIO,true);
	loadimage(&images[1],_T("floor.bmp"),RATIO,RATIO,true);
	loadimage(&images[2],_T("des.bmp"),RATIO,RATIO,true);
	loadimage(&images[3],_T("man.bmp"),RATIO,RATIO,true);
	loadimage(&images[4],_T("box.bmp"),RATIO,RATIO,true);
	loadimage(&images[5],_T("box.bmp"),RATIO,RATIO,true);
	for(int i = 0;i<LINE;i++){
		for(int j=0;j<COLUMN;j++){
			if(map[i][j] == MAN){
				man.x=i;
				man.y=j;
			}
		putimage(START_X+j*RATIO,START_Y+i*RATIO,&images[map[i][j]]);
		}
	}
	//游戏环节
	bool quit = false;

	do{
		if(_kbhit()){ //玩家按键
			char ch =_getch();
			if(ch==KEY_UP){
				gameControl(UP);//搞一个函数实现人的移动
			}else if(ch==KEY_DOWN){
				gameControl(DOWN);
			}else if(ch==KEY_LEFT){
				gameControl(LEFT);
			}else if(ch==KEY_RIGHT){
				gameControl(RIGHT);
			}else if(ch==KEY_QUIT){
				quit = true;
			}
		
		}
		Sleep(100);
		
	}while(quit ==false);

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值