下面我们要来实现第二部分,热键控制部分
在这一部分我们需要加入#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);
}
就此我们的推箱子小项目大功告成了