纸上来得终觉浅,绝知此事要躬行(二)

下面我们要来实现第二部分,热键控制部分
在这一部分我们需要加入#include<conio.h>头文件中的
getch()和kbhit()两个函数来实现热键的扫描和输入

#include <graphics.h>	//导入easyx图形库
#include <Windows.h>
#include <iostream>
#include <conio.h>		//导入热键控制函数

#define LINE  9		//地图的行数
#define ROW	 12		//地图的列数
#define WINDOW_LINE	 768	//游戏窗口高度
#define WINDOW_ROW	 960	//游戏窗口宽度
#define PICTURE_SIZE  61	//道具图片尺寸大小
#define X_OFFSET	 100	//x轴图片偏移量
#define Y_OFFSET	 150	//y轴图片偏移量
#define UP		 'w'	//上
#define DOWN	 's'	//下
#define LEFT	 'a'	//左
#define RIGHT	 'd'	//右
#define QUITE	 'q'	//q键按下

using namespace std;

//用二维数组来表示地图
int map[LINE][ROW] = {
	{ 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 PIC{	//图片对应的下标号
	Wall,	//0 墙
	Floor,	//1 地板
	Des,	//2 箱子目的地
	Man,	//3 小人
	Box,	//4	箱子,同时箱子命中目标,显示的就是box
	All		//5 需要数组元素个数
};

IMAGE picture[All];	//储存图片:IMAGE是easyx库中的图片数据类型 

int main(void){

	//初始化地图
	IMAGE background;	//储存背景图片
	initgraph(WINDOW_ROW,WINDOW_LINE);	//easyx库中函数,初始化窗口大小  960*768
	loadimage(&background,_T("blackground.bmp"),WINDOW_ROW,WINDOW_LINE);	//加载背景图片,使用介绍查看easyx文档
	putimage(0,0,&background);	//输出加载的图片

	//加载游戏道具图片
	loadimage(&picture[Wall],_T("wall.bmp"),PICTURE_SIZE,PICTURE_SIZE);//加载墙的图片,墙的图片大小61*61
	loadimage(&picture[Floor],_T("floor.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Des],_T("des.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Man],_T("man.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Box],_T("box.bmp"),PICTURE_SIZE,PICTURE_SIZE);

	//遍历地图,输出对应图片,游戏道具x轴偏移量100,y轴偏移量150
	for(int i=0; i<LINE; i++){
		for(int j=0; j<ROW; j++){
			putimage(X_OFFSET+j*PICTURE_SIZE,Y_OFFSET+i*PICTURE_SIZE,&picture[map[i][j]]);
		}
	}

	//热键控制,需要计算机一直进行侦测和判断
	bool quite = false;	//用于判断是否退出都do—while循环
	
	do{
		if(_kbhit()){	//_kbhit()判断是否有按键按下,有返回真值,无返回0
			char ch = getch();	//getch()是无回显的输入方法
			//判断是哪个键按下,并实现移动
			if(ch == UP){
			
			}else if(ch == DOWN){
			
			}else if(ch == LEFT){
			
			}else if(ch == RIGHT){
			
			}else if(ch == QUITE){
				quite = true;	//有q键按下,退出
			}
		}
		Sleep(100);	//等待0.1秒,避免程序太快,键盘输入跟不上
	}while(quite == false);


	system("pause");
	return 0;
}

现在我们的热键控制部分的框架已经完成,但是现在我们按下按键是无法进行游戏的,接下来我们来实现第三个模块

#include <graphics.h>	//导入easyx图形库
#include <Windows.h>
#include <iostream>
#include <conio.h>		//导入热键控制函数

#define LINE  9		//地图的行数
#define ROW	 12		//地图的列数
#define WINDOW_LINE	 768	//游戏窗口高度
#define WINDOW_ROW	 960	//游戏窗口宽度
#define PICTURE_SIZE  61	//道具图片尺寸大小
#define X_OFFSET	 100	//x轴图片偏移量
#define Y_OFFSET	 150	//y轴图片偏移量
#define K_UP	 'w'	//上
#define K_DOWN	 's'	//下
#define K_LEFT	 'a'	//左
#define K_RIGHT	 'd'	//右
#define K_QUITE	 'q'	//q键按下
#define isValid(pos)  pos.x>=0 &&pos.x<LINE && pos.y>=0 && pos.y<ROW	//判断下一个位置是否合法


using namespace std;

//用二维数组来表示地图
int map[LINE][ROW] = {
	{ 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 PIC{	//图片对应的下标号
	Wall,	//0 墙
	Floor,	//1 地板
	Des,	//2 箱子目的地
	Man,	//3 小人
	Box,	//4	箱子,同时箱子命中目标,显示的就是box
	All		//5 需要数组元素个数
};

enum DIRECTION{	//传入的方向参数
	UP,
	DOWN,
	LEFT,
	RIGHT
};

struct GPS{
	int x;	//储存小人的x坐标
	int y;	//储存小人的y坐标
};

IMAGE picture[All];	//储存图片:IMAGE是easyx库中的图片数据类型
struct GPS man;		//保存小人坐标,定义为全局变量

void changmap(struct GPS *a,enum PIC b);
void GameControl(enum DIRECTION direction);

int main(void){

	//初始化地图
	IMAGE background;	//储存背景图片
	initgraph(WINDOW_ROW,WINDOW_LINE);	//easyx库中函数,初始化窗口大小  960*768
	loadimage(&background,_T("blackground.bmp"),WINDOW_ROW,WINDOW_LINE);	//加载背景图片,使用介绍查看easyx文档
	putimage(0,0,&background);	//输出加载的图片

	//加载游戏道具图片
	loadimage(&picture[Wall],_T("wall.bmp"),PICTURE_SIZE,PICTURE_SIZE);//加载墙的图片,墙的图片大小61*61
	loadimage(&picture[Floor],_T("floor.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Des],_T("des.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Man],_T("man.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Box],_T("box.bmp"),PICTURE_SIZE,PICTURE_SIZE);

	//遍历地图,输出对应图片,游戏道具x轴偏移量100,y轴偏移量150
	for(int i=0; i<LINE; i++){
		for(int j=0; j<ROW; j++){
			putimage(X_OFFSET+j*PICTURE_SIZE,Y_OFFSET+i*PICTURE_SIZE,&picture[map[i][j]]);
		}
	}

	//寻找小人在map地图中的位置并保存到结构体中

	for(int i=0; i<LINE; i++){
		for(int j=0; j<ROW; j++){
			if(map[i][j] == Man){
				man.x = i;
				man.y = j;
			}
		}
	}


	//热键控制,需要计算机一直进行侦测和判断
	bool quite = false;	//用于判断是否退出都do—while循环
	
	do{
		if(_kbhit()){	//_kbhit()判断是否有按键按下,有返回真值,无返回0
			char ch = getch();	//getch()是无回显的输入方法
			//判断是哪个键按下,并实现移动
			if(ch == K_UP){
				GameControl(UP);
			}else if(ch == K_DOWN){
				GameControl(DOWN);
			}else if(ch == K_LEFT){
				GameControl(LEFT);
			}else if(ch == K_RIGHT){
				GameControl(RIGHT);
			}else if(ch == K_QUITE){
				quite = true;	//有q键按下,退出
			}
		}
		Sleep(100);	//等待0.1秒,避免程序太快,键盘输入跟不上
	}while(quite == false);


	//system("pause");
	return 0;
}


/**********************************************
  控制游戏进行,这个时候我们传进来一个方向值,
  由于方向值是固定的那几个所以我们定义一个枚举;
  为了控制图片的移动我们还要定义一个结构体来储存
  小人和小人前一个的坐标
************************************************/
void GameControl(enum DIRECTION direction){  
	struct GPS next_pos = man;
	struct GPS next_next_pos = man;

	switch(direction){
		case UP:
			next_pos.x --;
			next_next_pos.x -= 2;
			break;
		case DOWN:
			next_pos.x ++;
			next_next_pos.x += 2;
			break;
		case DIRECTION::LEFT:
			next_pos.y --;
			next_next_pos.y -= 2;
			break;
		case RIGHT:
			next_pos.y ++;
			next_next_pos.y += 2;
			break;
	}

		//判断我们按下按键后小人的位置是否合法,合法我们就改变地图,这时候改变地图的实现我们可以再封装一个函数
		//本来是写的这样来判断下一个位置是否合法 ,但是有点长,我们用宏来表示一下
		//next_pos.x>=0 &&next_pos.x<LINE && next_pos.y>=0 && next_pos.y<ROW 
	if(isValid(next_pos) && map[next_pos.x][next_pos.y] == Floor){
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
	}

	
}

//改变图片
void changmap(struct GPS *a,enum PIC b){
	map[a->x][a->y] = b;
	putimage(X_OFFSET+a->y*PICTURE_SIZE,Y_OFFSET+a->x*PICTURE_SIZE,&picture[b]);
}

好了现在我们的小人就动起来了,我们继续让他实现推箱子。

#include <graphics.h>	//导入easyx图形库
#include <Windows.h>
#include <iostream>
#include <conio.h>		//导入热键控制函数

#define LINE  9		//地图的行数
#define ROW	 12		//地图的列数
#define WINDOW_LINE	 768	//游戏窗口高度
#define WINDOW_ROW	 960	//游戏窗口宽度
#define PICTURE_SIZE  61	//道具图片尺寸大小
#define X_OFFSET	 100	//x轴图片偏移量
#define Y_OFFSET	 150	//y轴图片偏移量
#define K_UP	 'w'	//上
#define K_DOWN	 's'	//下
#define K_LEFT	 'a'	//左
#define K_RIGHT	 'd'	//右
#define K_QUITE	 'q'	//q键按下
#define isValid(pos)  pos.x>=0 &&pos.x<LINE && pos.y>=0 && pos.y<ROW	//判断下一个位置是否合法


using namespace std;

//用二维数组来表示地图
int map[LINE][ROW] = {
	{ 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 PIC{	//图片对应的下标号
	Wall,	//0 墙
	Floor,	//1 地板
	Des,	//2 箱子目的地
	Man,	//3 小人
	Box,	//4	箱子,同时箱子命中目标,显示的就是box
	All		//5 需要数组元素个数
};

enum DIRECTION{	//传入的方向参数
	UP,
	DOWN,
	LEFT,
	RIGHT
};

struct GPS{
	int x;	//储存小人的x坐标
	int y;	//储存小人的y坐标
};

IMAGE picture[All];	//储存图片:IMAGE是easyx库中的图片数据类型
struct GPS man;		//保存小人坐标,定义为全局变量
struct GPS des[4];	//保存4个目标坐标
int k=0;//记录目标个数


void changmap(struct GPS *a,enum PIC b);
void GameControl(enum DIRECTION direction);

int main(void){

	//初始化地图
	IMAGE background;	//储存背景图片
	initgraph(WINDOW_ROW,WINDOW_LINE);	//easyx库中函数,初始化窗口大小  960*768
	loadimage(&background,_T("blackground.bmp"),WINDOW_ROW,WINDOW_LINE);	//加载背景图片,使用介绍查看easyx文档
	putimage(0,0,&background);	//输出加载的图片

	//加载游戏道具图片
	loadimage(&picture[Wall],_T("wall.bmp"),PICTURE_SIZE,PICTURE_SIZE);//加载墙的图片,墙的图片大小61*61
	loadimage(&picture[Floor],_T("floor.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Des],_T("des.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Man],_T("man.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Box],_T("box.bmp"),PICTURE_SIZE,PICTURE_SIZE);

	//遍历地图,输出对应图片,游戏道具x轴偏移量100,y轴偏移量150
	for(int i=0; i<LINE; i++){
		for(int j=0; j<ROW; j++){
			putimage(X_OFFSET+j*PICTURE_SIZE,Y_OFFSET+i*PICTURE_SIZE,&picture[map[i][j]]);
		}
	}

	//寻找小人在map地图中的位置并保存到结构体中
	//寻找目标在map地图中的位置并保存到结构体中
	
	for(int i=0; i<LINE; i++){
		for(int j=0; j<ROW; j++){
			if(map[i][j] == Man){
				man.x = i;
				man.y = j;
			}else if (map[i][j] == Des) {
				des[k].x = i;
				des[k].y = j;
				k++;
			}
		}
	}


	//热键控制,需要计算机一直进行侦测和判断
	bool quite = false;	//用于判断是否退出都do—while循环
	
	do{
		if(_kbhit()){	//_kbhit()判断是否有按键按下,有返回真值,无返回0
			char ch = getch();	//getch()是无回显的输入方法
			//判断是哪个键按下,并实现移动
			if(ch == K_UP){
				GameControl(UP);
			}else if(ch == K_DOWN){
				GameControl(DOWN);
			}else if(ch == K_LEFT){
				GameControl(LEFT);
			}else if(ch == K_RIGHT){
				GameControl(RIGHT);
			}else if(ch == K_QUITE){
				quite = true;	//有q键按下,退出
			}
		}
		Sleep(100);	//等待0.1秒,避免程序太快,键盘输入跟不上
	}while(quite == false);


	//system("pause");
	return 0;
}


/**********************************************
  控制游戏进行,这个时候我们传进来一个方向值,
  由于方向值是固定的那几个所以我们定义一个枚举;
  为了控制图片的移动我们还要定义一个结构体来储存
  小人和小人前一个的坐标
************************************************/
void GameControl(enum DIRECTION direction){  
	struct GPS next_pos = man;
	struct GPS next_next_pos = man;

	switch(direction){
		case UP:
			next_pos.x --;
			next_next_pos.x -= 2;
			break;
		case DOWN:
			next_pos.x ++;
			next_next_pos.x += 2;
			break;
		case DIRECTION::LEFT:
			next_pos.y --;
			next_next_pos.y -= 2;
			break;
		case RIGHT:
			next_pos.y ++;
			next_next_pos.y += 2;
			break;
	}

		//判断我们按下按键后小人的位置是否合法,合法我们就改变地图,这时候改变地图的实现我们可以再封装一个函数
		//本来是写的这样来判断下一个位置是否合法 ,但是有点长,我们用宏来表示一下
		//next_pos.x>=0 &&next_pos.x<LINE && next_pos.y>=0 && next_pos.y<ROW 
	if(isValid(next_pos) && map[next_pos.x][next_pos.y] == Floor){
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
	}else if(isValid(next_next_pos) && map[next_pos.x][next_pos.y] == Box){	//下一个位置是箱子
		if(map[next_next_pos.x][next_next_pos.y] == Des){//下下个位置是目标位置
			changmap(&next_next_pos,Box);
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
		}else if(map[next_next_pos.x][next_next_pos.y] == Floor){//下下个位置是地板
			changmap(&next_next_pos,Box);
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
		}
	}else if(isValid(next_pos) && map[next_pos.x][next_pos.y] == Des){//下个位置是目标
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
	}

	for(int i=0; i<k; i++){//小人离开目标后,目标位置由地板修改为Des
		if(map[des[i].x][des[i].y] == Floor){
			changmap(&des[i],Des);
		}
	}
}



//改变图片
void changmap(struct GPS *a,enum PIC b){
	map[a->x][a->y] = b;
	putimage(X_OFFSET+a->y*PICTURE_SIZE,Y_OFFSET+a->x*PICTURE_SIZE,&picture[b]);
}

现在我们只差最后一部分就全部完成了

#include <graphics.h>	//导入easyx图形库
#include <Windows.h>
#include <iostream>
#include <conio.h>		//导入热键控制函数

#define LINE  9		//地图的行数
#define ROW	 12		//地图的列数
#define WINDOW_LINE	 768	//游戏窗口高度
#define WINDOW_ROW	 960	//游戏窗口宽度
#define PICTURE_SIZE  61	//道具图片尺寸大小
#define X_OFFSET	 100	//x轴图片偏移量
#define Y_OFFSET	 150	//y轴图片偏移量
#define K_UP	 'w'	//上
#define K_DOWN	 's'	//下
#define K_LEFT	 'a'	//左
#define K_RIGHT	 'd'	//右
#define K_QUITE	 'q'	//q键按下
#define isValid(pos)  pos.x>=0 &&pos.x<LINE && pos.y>=0 && pos.y<ROW	//判断下一个位置是否合法


using namespace std;

//用二维数组来表示地图
int map[LINE][ROW] = {
	{ 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 PIC{	//图片对应的下标号
	Wall,	//0 墙
	Floor,	//1 地板
	Des,	//2 箱子目的地
	Man,	//3 小人
	Box,	//4	箱子,同时箱子命中目标,显示的就是box
	All		//5 需要数组元素个数
};

enum DIRECTION{	//传入的方向参数
	UP,
	DOWN,
	LEFT,
	RIGHT
};

struct GPS{
	int x;	//储存小人的x坐标
	int y;	//储存小人的y坐标
};

IMAGE picture[All];	//储存图片:IMAGE是easyx库中的图片数据类型
struct GPS man;		//保存小人坐标,定义为全局变量
struct GPS des[4];	//保存4个目标坐标
int k=0;//记录目标个数


void changmap(struct GPS *a,enum PIC b);
void GameControl(enum DIRECTION direction);
bool GameOver(void);
void GameOverScence(IMAGE *p);

int main(void){

	//初始化地图
	IMAGE background;	//储存背景图片
	initgraph(WINDOW_ROW,WINDOW_LINE);	//easyx库中函数,初始化窗口大小  960*768
	loadimage(&background,_T("blackground.bmp"),WINDOW_ROW,WINDOW_LINE);	//加载背景图片,使用介绍查看easyx文档
	putimage(0,0,&background);	//输出加载的图片

	//加载游戏道具图片
	loadimage(&picture[Wall],_T("wall.bmp"),PICTURE_SIZE,PICTURE_SIZE);//加载墙的图片,墙的图片大小61*61
	loadimage(&picture[Floor],_T("floor.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Des],_T("des.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Man],_T("man.bmp"),PICTURE_SIZE,PICTURE_SIZE);
	loadimage(&picture[Box],_T("box.bmp"),PICTURE_SIZE,PICTURE_SIZE);

	//遍历地图,输出对应图片,游戏道具x轴偏移量100,y轴偏移量150
	for(int i=0; i<LINE; i++){
		for(int j=0; j<ROW; j++){
			putimage(X_OFFSET+j*PICTURE_SIZE,Y_OFFSET+i*PICTURE_SIZE,&picture[map[i][j]]);
		}
	}

	//寻找小人在map地图中的位置并保存到结构体中
	//寻找目标在map地图中的位置并保存到结构体中
	
	for(int i=0; i<LINE; i++){
		for(int j=0; j<ROW; j++){
			if(map[i][j] == Man){
				man.x = i;
				man.y = j;
			}else if (map[i][j] == Des) {
				des[k].x = i;
				des[k].y = j;
				k++;
			}
		}
	}


	//热键控制,需要计算机一直进行侦测和判断
	bool quite = false;	//用于判断是否退出都do—while循环
	
	do{
		if(_kbhit()){	//_kbhit()判断是否有按键按下,有返回真值,无返回0
			char ch = getch();	//getch()是无回显的输入方法
			//判断是哪个键按下,并实现移动
			if(ch == K_UP){
				GameControl(UP);
			}else if(ch == K_DOWN){
				GameControl(DOWN);
			}else if(ch == K_LEFT){
				GameControl(LEFT);
			}else if(ch == K_RIGHT){
				GameControl(RIGHT);
			}else if(ch == K_QUITE){
				quite = true;	//有q键按下,退出
			}
		}

		//判断游戏是否完成
		if(GameOver()){
			//显示游戏结束
			GameOverScence(&background);
			quite = true;
		}

		Sleep(100);	//等待0.1秒,避免程序太快,键盘输入跟不上
	}while(quite == false);


	//system("pause");
	return 0;
}


/**********************************************
  控制游戏进行,这个时候我们传进来一个方向值,
  由于方向值是固定的那几个所以我们定义一个枚举;
  为了控制图片的移动我们还要定义一个结构体来储存
  小人和小人前一个的坐标
************************************************/
void GameControl(enum DIRECTION direction){  
	struct GPS next_pos = man;
	struct GPS next_next_pos = man;

	switch(direction){
		case UP:
			next_pos.x --;
			next_next_pos.x -= 2;
			break;
		case DOWN:
			next_pos.x ++;
			next_next_pos.x += 2;
			break;
		case DIRECTION::LEFT:
			next_pos.y --;
			next_next_pos.y -= 2;
			break;
		case RIGHT:
			next_pos.y ++;
			next_next_pos.y += 2;
			break;
	}

		//判断我们按下按键后小人的位置是否合法,合法我们就改变地图,这时候改变地图的实现我们可以再封装一个函数
		//本来是写的这样来判断下一个位置是否合法 ,但是有点长,我们用宏来表示一下
		//next_pos.x>=0 &&next_pos.x<LINE && next_pos.y>=0 && next_pos.y<ROW 
	if(isValid(next_pos) && map[next_pos.x][next_pos.y] == Floor){
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
	}else if(isValid(next_next_pos) && map[next_pos.x][next_pos.y] == Box){	//下一个位置是箱子
		if(map[next_next_pos.x][next_next_pos.y] == Des){//下下个位置是目标位置
			changmap(&next_next_pos,Box);
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
		}else if(map[next_next_pos.x][next_next_pos.y] == Floor){//下下个位置是地板
			changmap(&next_next_pos,Box);
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
		}
	}else if(isValid(next_pos) && map[next_pos.x][next_pos.y] == Des){//下个位置是目标
			changmap(&next_pos,Man);
			changmap(&man,Floor);
			man = next_pos;
	}

	for(int i=0; i<k; i++){//小人离开目标后,目标位置由地板修改为Des
		if(map[des[i].x][des[i].y] == Floor){
			changmap(&des[i],Des);
		}
	}
}



//改变图片
void changmap(struct GPS *a,enum PIC b){
	map[a->x][a->y] = b;
	putimage(X_OFFSET+a->y*PICTURE_SIZE,Y_OFFSET+a->x*PICTURE_SIZE,&picture[b]);
}

//判断游戏结束
bool GameOver(void){
	for(int i=0; i<LINE; i++){
		for(int j=0; j<ROW; j++){
			if(map[i][j] == Des){
				return false;
			}
		}
	}
	return true;
} 

//显示游戏结束画面
void GameOverScence(IMAGE *p){
	putimage(0,0,p);
	settextcolor(WHITE);
	RECT rec = {0, 0, WINDOW_ROW, WINDOW_LINE};
	settextstyle(20,0,_T("楷体"));
	drawtext(_T("恭喜您通过了"),&rec,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	Sleep(2000);
}

就此我们的推箱子小项目大功告成了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值