C++实现推箱子游戏

推箱子游戏

运行之后的效果如视频所示,在完成游戏后播放音乐 

准备工作:建立一个新的文件夹,并在文件夹中任意增加一张背景图片,以及各个部件的照片文件

因为这里用到了贴图技术,要使用graphic.h这个函数,不安装的话是不能在vs里面显示图案的,所以要安装Easy x 这个图形库,下载地址[http://www.easyx.cn/downloads/]

具体下载安装见我的博客这一篇:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/134126314icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/134126314

图中用到的资源图形是(借用下面博主的图形音乐资源,代码并不相同,整体代码更好维护):

c/c++推箱子游戏开发基础入门(附全部源码)_堆箱子c++完整代码-CSDN博客

文件的全部代码在最下面:

1.地图初始化----背景色

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>

using namespace std;


int main()
{
	IMAGE bg_img;//设置图片变量
	initgraph(960,768);//设置终端窗口大小
	loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量
	putimage(0, 0, &bg_img);//将背景图片刷到终端窗口

	system("pause");
	return 0;

}


 

2.初始化界面:

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>

using namespace std;

//定义图片数据
IMAGE images[6];

//游戏地图
int map[9][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},
};


int main()
{
	IMAGE bg_img;//设置图片变量

	//搭台唱戏
	initgraph(960, 768);//设置终端窗口大小
	loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量
	putimage(0, 0, &bg_img);//将背景图片刷到终端窗口

	//加载道具图标
	loadimage(&images[0], _T("7.bmp"), 61, 61, TRUE);
	loadimage(&images[1], _T("0.bmp"), 61, 61, TRUE);
	loadimage(&images[2], _T("3.bmp"), 61, 61, TRUE);
	loadimage(&images[3], _T("5.bmp"), 61, 61, TRUE);
	loadimage(&images[4], _T("4.bmp"), 61, 61, TRUE);
	loadimage(&images[0], _T("1.bmp"), 61, 61, TRUE);

	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 12; j++)
		{
			putimage(125+j*61, 120+i*61, &images[map[i][j]]);
		}
	}

	system("pause");
	return 0;

}


 3.小人移动控制

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

#define RATIO 61    //宏定义
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
#define LINE 9
#define COLUMN 12
#define START_X 125
#define START_Y 120

//控制键 上下左右控制方向,'q'退出
#define KEY_UP  'w'
#define KEY_LEFT  'a'
#define KEY_RIGHT  'd'
#define KEY_DOWN  's'
#define KEY_QUIT  'q'

#define isVaile(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMN


using namespace std;

//定义道具类型(用枚举类型使用),增加文章可读性
//WALL墙0,FLOOR地板1,BOX_DES目的地2,MAN人3,BOX篮球4,JI篮球命中目标5
enum _PROSE {
	WALL,
	FLOOR,
	BOX_DES,
	MAN,
	BOX,
	JI,
	ALL
};

//游戏控制方向
enum _DIRECTION
{
	UP,
	DOWN,
	LEFT,
	RIGHT
};
//游戏地图 ,可以直接由上面的枚举类型的数值进行替换,这里不做替换
int map[LINE][COLUMN] = {
	{WALL,0,0,0,0,0,0,0,0,0,0,0},
	{0,FLOOR,0,1,1,1,1,1,1,1,0,0},
	{0,1,4,1,0,BOX_DES,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,MAN,1,1,1,4,1,0},
	{0,1,2,1,1,BOX,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},
};

//定义图片数据
IMAGE images[ALL];

//存储小人位置
struct _POS {
	int x;//小人所在的二维数组的行
	int y;//小人所在的二维数组的列

};
struct _POS man;

/*******************************
*改变游戏地图视图中一格对应道具并重新显示
* 输入:
*     line---道具在地图数组的行下标
*     column---道具在地图数组的列下标
*     prop----道具的类型
* 返回值:无
************************************/
void changeMap(struct _POS *pos, enum _PROSE prop) {
	map[pos->x][pos->y] = prop;//将此时小人的道具改变
	putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}



/****************************************
*实现游戏四个方向(上下左右)的控制
* 输入:
*    direct---人前进的方向
* 输出:无
********************************************/
void gameControl(enum _DIRECTION direct) {
	struct _POS next_pos = man;
	switch (direct) {
	     case UP:
			 next_pos.x--;
			 break;
		 case DOWN:
			 next_pos.x++;
			 break;
		 case LEFT:
			 next_pos.y--;
			 break;
		 case RIGHT:
			 next_pos.y++;
			 break;
	}
	   //宏展开isVaile
		if (isVaile(next_pos)&& map[next_pos.x][next_pos.y] == FLOOR) {
			changeMap(&next_pos, MAN);//小人前进一格
			changeMap(&man , FLOOR);
			man = next_pos;
		}
}

int main()
{
	IMAGE bg_img;//设置图片变量

	//搭台唱戏
	initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//设置终端窗口大小
	loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量
	putimage(0, 0, &bg_img);//将背景图片刷到终端窗口

	//加载道具图标
	loadimage(&images[WALL], _T("WALL.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[FLOOR], _T("FLOOR.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[BOX_DES], _T("DES.bmp"), RATIO, RATIO, TRUE);//人
	loadimage(&images[MAN], _T("MAN.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[BOX], _T("BOX.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[JI], _T("JI.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);//0.1s
	} while (quit==false);//!quit


	system("pause");
	return 0;

}


 4.功能实现

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

#define RATIO 61    //宏定义
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
#define LINE 9
#define COLUMN 12
#define START_X 125
#define START_Y 120

//控制键 上下左右控制方向,'q'退出
#define KEY_UP  'w'
#define KEY_LEFT  'a'
#define KEY_RIGHT  'd'
#define KEY_DOWN  's'
#define KEY_QUIT  'q'

#define isVaile(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMN


using namespace std;

//定义道具类型(用枚举类型使用),增加文章可读性
//WALL墙0,FLOOR地板1,BOX_DES目的地2,MAN人3,BOX篮球4,JI篮球命中目标5
enum _PROSE {
	WALL,
	FLOOR,
	BOX_DES,
	MAN,
	BOX,
	JI,
	ALL
};

//游戏控制方向
enum _DIRECTION
{
	UP,
	DOWN,
	LEFT,
	RIGHT
};

//游戏地图 ,可以直接由上面的枚举类型的数值进行替换,这里不做替换
int map[LINE][COLUMN] = {
	{WALL,0,0,0,0,0,0,0,0,0,0,0},
	{0,FLOOR,0,1,1,1,1,1,1,1,0,0},
	{0,1,4,1,0,BOX_DES,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,MAN,1,1,1,4,1,0},
	{0,1,2,1,1,BOX,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},
};

//定义图片数据
IMAGE images[ALL];

//存储小人位置
struct _POS {
	int x;//小人所在的二维数组的行
	int y;//小人所在的二维数组的列

};
struct _POS man;

/*******************************
*改变游戏地图视图中一格对应道具并重新显示
* 输入:
*     line---道具在地图数组的行下标
*     column---道具在地图数组的列下标
*     prop----道具的类型
* 返回值:无
************************************/
void changeMap(struct _POS *pos, enum _PROSE prop) {
	map[pos->x][pos->y] = prop;//将此时小人的道具改变
	putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}


/****************************************
*实现游戏四个方向(上下左右)的控制
* 输入:
*    direct---人前进的方向
* 输出:无
********************************************/
void gameControl(enum _DIRECTION direct) {
	//小人移动的方向
	struct _POS next_pos = man;
	struct _POS next_next_pos = man;
	switch (direct) {
	     case UP:
			 next_pos.x--;
			 next_next_pos.x-=2;
			 break;
		 case DOWN:
			 next_pos.x++;
			 next_next_pos.x+=2;
			 break;
		 case LEFT:
			 next_pos.y--;
			 next_next_pos.y-=2;
			 break;
		 case RIGHT:
			 next_pos.y++;
			 next_next_pos.y+=2;
			 break;
	}
	   
		if (isVaile(next_pos)&& map[next_pos.x][next_pos.y] == FLOOR) {//宏展开isVaile,人的前方是地板
			changeMap(&next_pos, MAN);//小人前进一格
			changeMap(&man , FLOOR);
			man = next_pos;
		}
		else if (isVaile(next_next_pos) && map[next_pos.x][next_pos.y] == BOX)//人的前方是篮球,篮球的前方是地板
		{
			//两种情况,篮球前面是地板或者篮球是目的地
			if (map[next_next_pos.x][next_next_pos.y] == FLOOR) {
				changeMap(&next_next_pos, BOX);
				changeMap(&next_pos, MAN);//小人前进一格
				changeMap(&man, FLOOR);
				man = next_pos;
			}
			else if (map[next_next_pos.x][next_next_pos.y] == BOX_DES) {
				changeMap(&next_next_pos, JI);
				changeMap(&next_pos, MAN);//小人前进一格
				changeMap(&man, FLOOR);
				man = next_pos;
			}

		}
}

int main()
{
	IMAGE bg_img;//设置图片变量

	//搭台唱戏
	initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//设置终端窗口大小
	loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量
	putimage(0, 0, &bg_img);//将背景图片刷到终端窗口

	//加载道具图标
	loadimage(&images[WALL], _T("WALL.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[FLOOR], _T("FLOOR.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[BOX_DES], _T("DES.bmp"), RATIO, RATIO, TRUE);//人
	loadimage(&images[MAN], _T("MAN.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[BOX], _T("BOX.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[JI], _T("JI.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);//0.1s
	} while (quit==false);//!quit

	//游戏结束,释放资源
	closegraph();

	system("pause");
	return 0;

}


5.游戏结束

/****************************************
*判断游戏是否结束,如果所有篮球目的地都不存在,则表示游戏结束
* 输入:无
* 输出:true游戏结束
*       false游戏继续
********************************************/
bool isGameOver() {
	for (int i = 0; i < LINE; i++)
	{
		for (int j = 0; j < COLUMN; j++)
		{
			if (map[i][j] == BOX_DES)
				return false;
		}
	}
	return true;
}

/****************************************
*判断游戏场景,在玩家通关后显示
* 输入:bg----背景图片变量的指针
* 输出:无
********************************************/
void gameOver(IMAGE* bg_img) {
	putimage(0, 0, bg_img);
	settextcolor(WHITE);//设置文本颜色为白色
	RECT rec = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT };//设置一个矩形
	settextstyle(20,0,_T("宋体"));//设置字体的位置
	drawtext(_T("游戏成功,基尼太美~~~~"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//设置文字字体位置



}

6.优化头文件

7.成功后添加音乐

 全部代码文件:

库文件:box_man.h

#pragma once
#define RATIO 61    //宏定义
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
#define LINE 9
#define COLUMN 12
#define START_X 125
#define START_Y 120

//控制键 上下左右控制方向,'q'退出
#define KEY_UP  'w'
#define KEY_LEFT  'a'
#define KEY_RIGHT  'd'
#define KEY_DOWN  's'
#define KEY_QUIT  'q'

#define isVaile(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMN


//类型定义
typedef enum _DIRECTION     DIRECTION;
typedef enum _PROSE       PROSE;
typedef struct _POS      POS;

//定义道具类型(用枚举类型使用),增加文章可读性
//WALL墙0,FLOOR地板1,BOX_DES目的地2,MAN人3,BOX篮球4,JI篮球命中目标5
enum _PROSE {
	WALL,
	FLOOR,
	BOX_DES,
	MAN,
	BOX,
	JI,
	ALL
};

//游戏控制方向
enum _DIRECTION
{
	UP,
	DOWN,
	LEFT,
	RIGHT
};

//存储小人位置
struct _POS {
	int x;//小人所在的二维数组的行
	int y;//小人所在的二维数组的列

};

运行程序:box_man.cpp 

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<MMSystem.h>//播放音乐所需要的头文件
#pragma comment(lib,"winmm.lib")//告诉编译器,加载winmm.lib库文件

#include"box_man.h"

//#define RATIO 61    //宏定义
//#define SCREEN_WIDTH 960
//#define SCREEN_HEIGHT 768
//#define LINE 9
//#define COLUMN 12
//#define START_X 125
//#define START_Y 120
//
控制键 上下左右控制方向,'q'退出
//#define KEY_UP  'w'
//#define KEY_LEFT  'a'
//#define KEY_RIGHT  'd'
//#define KEY_DOWN  's'
//#define KEY_QUIT  'q'
//
//#define isVaile(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMN

using namespace std;

类型定义
//typedef enum _DIRECTION     DIRECTION;
//typedef enum _PROSE       PROSE;
//typedef struct _POS      POS;
//
定义道具类型(用枚举类型使用),增加文章可读性
WALL墙0,FLOOR地板1,BOX_DES目的地2,MAN人3,BOX篮球4,JI篮球命中目标5
//enum _PROSE {
//	WALL,
//	FLOOR,
//	BOX_DES,
//	MAN,
//	BOX,
//	JI,
//	ALL
//};
//
游戏控制方向
//enum _DIRECTION
//{
//	UP,
//	DOWN,
//	LEFT,
//	RIGHT
//};


//游戏地图 ,可以直接由上面的枚举类型的数值进行替换,这里不做替换
int map[LINE][COLUMN] = {
	{WALL,0,0,0,0,0,0,0,0,0,0,0},
	{0,FLOOR,0,1,1,1,1,1,1,1,0,0},
	{0,1,4,1,0,BOX_DES,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,MAN,1,1,1,4,1,0},
	{0,1,2,1,1,BOX,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},
};

//定义图片数据
IMAGE images[ALL];

存储小人位置
//struct _POS {
//	int x;//小人所在的二维数组的行
//	int y;//小人所在的二维数组的列
//
//};
POS man;

/*******************************
*改变游戏地图视图中一格对应道具并重新显示
* 输入:
*     line---道具在地图数组的行下标
*     column---道具在地图数组的列下标
*     prop----道具的类型
* 返回值:无
************************************/
void changeMap(POS *pos, PROSE prop) {
	map[pos->x][pos->y] = prop;//将此时小人的道具改变
	putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}


/****************************************
*实现游戏四个方向(上下左右)的控制
* 输入:
*    direct---人前进的方向
* 输出:无
********************************************/
void gameControl(DIRECTION direct) {
	//小人移动的方向
	POS next_pos = man;
	POS next_next_pos = man;
	switch (direct) {
	     case UP:
			 next_pos.x--;
			 next_next_pos.x-=2;
			 break;
		 case DOWN:
			 next_pos.x++;
			 next_next_pos.x+=2;
			 break;
		 case LEFT:
			 next_pos.y--;
			 next_next_pos.y-=2;
			 break;
		 case RIGHT:
			 next_pos.y++;
			 next_next_pos.y+=2;
			 break;
	}
	   
		if (isVaile(next_pos)&& map[next_pos.x][next_pos.y] == FLOOR) {//宏展开isVaile,人的前方是地板
			changeMap(&next_pos, MAN);//小人前进一格
			changeMap(&man , FLOOR);
			man = next_pos;
		}
		else if (isVaile(next_next_pos) && map[next_pos.x][next_pos.y] == BOX)//人的前方是篮球,篮球的前方是地板
		{
			//两种情况,篮球前面是地板或者篮球是目的地
			if (map[next_next_pos.x][next_next_pos.y] == FLOOR) {
				changeMap(&next_next_pos, BOX);
				changeMap(&next_pos, MAN);//小人前进一格
				changeMap(&man, FLOOR);
				man = next_pos;
			}
			else if (map[next_next_pos.x][next_next_pos.y] == BOX_DES) {
				changeMap(&next_next_pos, JI);
				changeMap(&next_pos, MAN);//小人前进一格
				changeMap(&man, FLOOR);
				man = next_pos;
			}

		}
}

/****************************************
*判断游戏是否结束,如果所有篮球目的地都不存在,则表示游戏结束
* 输入:无
* 输出:true游戏结束
*       false游戏继续
********************************************/
bool isGameOver() {
	for (int i = 0; i < LINE; i++)
	{
		for (int j = 0; j < COLUMN; j++)
		{
			if (map[i][j] == BOX_DES)
				return false;
		}
	}
	return true;
}

/****************************************
*结束游戏场景,在玩家通关后显示
* 输入:bg----背景图片变量的指针
* 输出:无
********************************************/
void gameOver(IMAGE* bg_img) {
	putimage(0, 0, bg_img);
	settextcolor(WHITE);//设置文本颜色为白色
	RECT rec = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT };//设置一个矩形
	settextstyle(20,0,_T("宋体"));//设置字体的位置
	drawtext(_T("游戏成功,基尼太美~~~~"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//设置文字字体位置
	//重复播放基尼太美
	mciSendString(_T("play 1.mp3 repeat"), 0, 0, 0);//播放音乐
}

int main()
{
	IMAGE bg_img;//设置图片变量

	//搭台唱戏
	initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//设置终端窗口大小
	loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量
	putimage(0, 0, &bg_img);//将背景图片刷到终端窗口

	//加载道具图标
	loadimage(&images[WALL], _T("WALL.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[FLOOR], _T("FLOOR.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[BOX_DES], _T("DES.bmp"), RATIO, RATIO, TRUE);//人
	loadimage(&images[MAN], _T("MAN.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[BOX], _T("BOX.bmp"), RATIO, RATIO, TRUE);
	loadimage(&images[JI], _T("JI.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;
			}
			if(isGameOver()) {
				gameOver(&bg_img);
				quit = true;

			}
		}
		Sleep(100);//0.1s
	} while (quit==false);//!quit

	system("pause");
	//游戏结束,释放资源
	closegraph();

	return 0;

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352069.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解SpringCloud微服务技术栈:DSL查询ES文档高级语法、相关性算分数学原理总结

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;ElasticSearch实践1——RestClient操作索引库与文档 &#x1f4da;订阅专栏&#xff1…

通信入门系列——高斯白噪声和限带高斯白噪声

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、高斯白噪声 二、复高…

单调栈第二天(还没写完)

503.下一个更大元素II 力扣题目链接(opens new window) 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更…

C++位图的应用与布隆过滤器

位图的概念 用每一个二进制比特位来表示某种状态&#xff0c;适用于海量数据&#xff0c;通常用于判断某个数据是否存在 以上面试题可以用位图来解决&#xff1a;用一个二进制比特位来表示数据是否存在--二进制比特位为1表示存在&#xff0c;为0表示不存在 位图的模拟实现 #…

第五篇【传奇开心果】BeeWare的Toga库开发移动应用示例: Local Storage本地数据处理

传奇开心果博文系列 系列博文目录BeeWare的Toga库开发移动应用示例系列博文目录前言一、本地读取存储数据示例二、表格显示本地数据和清除数据示例三、添加本地数据查询功能示例四、添加本地数据修改和删除功能示例五、添加本地数据增加功能示例系列博文目录 BeeWare的Toga库开…

C语言 服务器编程-定时器

定时器 引言定时器的基本逻辑定时器信号事件 引言 传统的TCP socket模型是基于套接字&#xff08;文件描述符&#xff09;来传递消息的&#xff0c;但是文件描述符资是有限的&#xff0c;如果大量的连接占用了大量的文件描述符&#xff0c;那么新来的请求可能就无法申请到文件…

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

MySQL数据定义语言DDL

MySQL数据定义语言DDL 目录 MySQL数据定义语言DDLDDL关键字数据定义语言DDL1.查看数据库2.创建库3.删除库4.切换库5.创建表6.删除表7.查看表8.查看表属性9.插入列10.修改列11.设置主键12.设置外键并绑定主键13.设置自增14.删除列15.重命名16.设定默认值17.添加备注18.设置是否可…

完成NAT实验

实验要求&#xff1a; 步骤一&#xff1a;配置vlan vlan b 2 3 interface GigabitEthernet 0/0/2 port link-type access port default vlan 2 interface GigabitEthernet 0/0/3 port link-type access port default vlan 3 interface GigabitEthernet 0/0/1 port link-type…

svg 属性详解:填充与边框

svg 属性详解&#xff1a;填充与边框 1 颜色和透明度2 填充规则 fill-rule3 边框样式3.1 stroke-width3.2 stroke-linecap3.3 stroke-linejoin3.4 stroke-dasharray 1 颜色和透明度 图像都有颜色&#xff0c;svg 中可以使用属性 fill 和 stroke 来修改图形的颜色。fill 属性设置…

真香一个团队协作工具部署

部署 version: "3.4"services:mongo:image: mongocontainer_name: twake-dbvolumes:- /opt/Twake/data:/data/dbnode:image: twaketech/twake-node:latestcontainer_name: twake-webports:- 3345:3000# - 8000:3000environment:- DEVproduction- SEARCH_DRIVERmong…

「 网络安全术语解读 」通用攻击模式枚举和分类CAPEC详解

引言&#xff1a;在网络安全领域&#xff0c;了解攻击者的行为和策略对于有效防御攻击至关重要。然而&#xff0c;攻击模式的描述和分类方式缺乏统一性和标准化。为了解决这个问题&#xff0c;MITRE公司创建了CAPEC标准&#xff0c;以提供一个共享和统一的攻击模式分类框架。 1…

用友U8接口-系统管理(3)

教程目录 部署和简要说明(1) 获取token&数据字段(2) 概括 本文的操作需要正确部署U8HttpApi对本套接口系统管理目录说明 系统管理 获取token 参考获取token 根据sql进行查询 此POST方式接口运行调用者传入SQL语句&#xff0c;或者将SQL语句写到xml文件中&#xff0…

Redis 面试题 | 13.精选Redis高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

如何实现无公网IP实现远程访问MongoDB文件数据库

&#x1f4d1;前言 本文主要是如何实现无公网IP实现远程访问MongoDB文件数据库的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x…

快递对账教程

对企业行政人员来说&#xff0c;快递对账管理&#xff0c;应该是工作中最为头疼之事了。 最开始寄快递还是手写纸质快递单的时候&#xff0c;对企业行政来说&#xff0c;快递对账管理&#xff0c;本来就是一件麻烦事。当时大部分企业采用的都是寄前审批&#xff0c;寄后报销的…

数据结构·顺序表经典例题(双指针)

本节讲解两道顺序表经典例题&#xff0c;运用到了双指针的思想 双指针并不是两个指针&#xff0c;而是用两个类似指针的东西去扫描数组&#xff0c;以达到简化运算的效果 1. 移除元素 OJ链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平…

五、Flask学习之MySQL

五、Flask学习之MySQL 1. 下载MySQL 下载教程&#xff1a;MySQL安装及可视化工具SQLyog下载 2.常用指令 2.1. 查看已有数据库 show databases;2.2. 创建数据库 create database 名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;2.3. 删除数据库 drop database 名字;…

《WebKit 技术内幕》学习之十五(4):Web前端的未来

4 Cordova项目 Cordova是一个开源项目&#xff0c;能够提供将Web网页打包成本地应用格式的可运行文件。读者可能对Cordova项目陌生&#xff0c;但是大家可能对它的前身非常熟悉&#xff0c;那就是PhoneGap项目&#xff0c;它后来被Adobe公司收购。 图15-4描述了Cordova的主要工…

Topaz Video AI:无损放大,让你的视频更清晰!

在当今的数字时代&#xff0c;视频内容的重要性越来越受到人们的关注。无论是在社交媒体上分享生活片段&#xff0c;还是在商业领域中制作宣传视频&#xff0c;人们都希望能够展现出更高质量的视频内容。 然而&#xff0c;由于各种原因&#xff0c;我们经常会面临一个问题&…