C++实现推箱子游戏

news2024/11/17 6:38:37

推箱子游戏

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

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

因为这里用到了贴图技术,要使用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;

}


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

C/C++:混肴点分析

C中的常量介绍 字面常量 字面常量是指直接出现在代码中的常量值。例如&#xff0c;整数常量10、浮点数常量3.14、字符常量A等都属于字面常量。字面常量的值在编译时就已经确定&#xff0c;并且不能被修改。 字面常量存在类型&#xff0c;但没有地址 注意字符常量和只包含一个字…

关于我写过那些MySQL专栏

写在文章开头 这是截至今日写过的文章汇总&#xff0c;对于关注笔者公众号有一段时间的读者都知道&#xff0c;笔者会每周对自己写过的文章整理至相关专栏&#xff0c;以便读者可以按需进行检索阅读。 你好&#xff0c;我叫sharkchili&#xff0c;目前还是在一线奋斗的Java开…

免费开源的微信小程序源码、小游戏源码精选70套!

微信小程序已经成为我们日常的一部分了&#xff0c;也基本是每个程序员都会涉及的内容&#xff0c;今天给大家分享从网络收集的70个小程序源码。其中这些源码包含&#xff1a;小游戏到商城小程序&#xff0c;再到实用的工具小程序&#xff0c;以及那些令人惊叹的防各大站点的小…

Docker数据卷操作 Docker挂载Nginx、MySQL数据卷

容器与数据&#xff08;容器内文件&#xff09;耦合&#xff1a; 不便于修改&#xff1a;如果需要修改配置文件&#xff0c;需要进入容器的内部。数据不可复用&#xff1a;容器内的修改对外不可见&#xff0c;无法复用。升级维护困难&#xff1a;如果想要升级容器&#xff0c;…

pinia实现todos

store/todos.js //导入defineStore import {defineStore} from pinia const userTodosStoredefineStore(todos,{ state:()>({// list:[// {id:1,name:吃饭,done:false},// {id:2,name:睡觉,done:true},// {id:3,name:打豆豆,done:false}// ],list:JSON.parse(l…

wireshark利用sshdump自身组件进行远程实时抓包过滤

引言 以前在不了解wireshark可以远程抓包的时间&#xff0c;经常通过tcpdump在远程linux主机将抓包文件保存下来后&#xff0c;然后拖拽入windows中再打开&#xff0c;进行分析查看。 此过程比较繁琐&#xff0c;也不够实时。比较常用的抓包动作是仅出现某特征的报文后&#…

六、VTK创建平面vtkPlaneSource

vtkPlaneSource创建位于平面中的四边形数组 先看看效果图: vtkPlaneSource 创建一个 m x n 个四边形数组,这些四边形在平面中排列为规则平铺。通过指定一个原点来定义平面,然后指定另外两个点,这两个点与原点一起定义平面的两个轴。这些轴不必是正交的 - 因此您可以创建平行…

牵手国际企业,OpenAI计划自己制造AI芯片

据外媒报道称&#xff0c;近日&#xff0c;OpenAI的首席执行官萨姆奥特曼正在积极洽谈一项规模达数十亿美元的投资项目&#xff0c;计划与多家顶级芯片制造商合作&#xff0c;建设一个覆盖全球的人工智能芯片生产网络。 奥特曼曾多次反馈目前的芯片已不能满足OpenAI公司的AI研发…

Excel导出指定格式

期望 实现 Slf4j RequestMapping(value "/data") RestController public class DataStatController {GetMapping(value "/export", produces MediaType.APPLICATION_OCTET_STREAM_VALUE)public void export(HttpServletResponse response) {final Stri…

docker 存储管理

文章目录 docker 存储管理容器存储方案docker 容器存储解决方案 docker 存储驱动基本概述存储驱动的选择原则主流的 docker 存储驱动docker 版本支持的存储驱动 overlay2 存储驱动OverlayFSoverlay2 存储驱动要求配置 docker 使用 overlay2 驱动 overlay2 存储驱动的工作机制Ov…

mybatis-plus常用使用方法

** mybaits-plus常用使用方法 ** 常用三层分别继承方法 1.1mapper层&#xff08;接口定义层&#xff09;可以用BaseMapper<> 例如&#xff1a; 1.2.里面常用的封装方法有 1.3常用方法介绍 【添加数据&#xff1a;&#xff08;增&#xff09;】int insert(T entity);…

Neo4j 国内镜像下载与安装

Neo4j 5.x 简体中文版指南 社区版&#xff1a;https://neo4j.com/download-center/#community 链接地址&#xff08;Linux版&#xff09;&#xff1a;https://neo4j.com/artifact.php?nameneo4j-community-3.5.13-unix.tar.gz 链接地址&#xff08;Windows&#xff09;&#x…

uml时序图刻画多个线程的活动

使用box关键字圈入不同线程内的组件 使用loop关键字客刻画线程的定时活动 示例

新建一个基于标准库的工程(STM32)

目录 1.新建存放工程的文件夹 2.打开KEIL5软件 3.新建一个本次工程的文件夹 4.添加工程的必要文件 4.1打开STM32的启动文件 ​编辑 4.2&#xff1a; 4.3添加内核寄存器文件 ​编辑 5.回到keil5软件&#xff0c;将刚才复制的那些文件添加到工程中 5.1添加一个启动文件&am…

vue3+naiveUI二次封装的v-model cascader联级选择框

组件 v-model 源码 <template><div class"clw-cascader pt-3"><n-cascaderref"cascader":value"value":title"title"filterableclearable:check-strategy"checkStrategy":label-field"labelField"…

在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作

前言&#xff1a;什么是操作筛选器 操作筛选器是 ASP.NET Core Web API 中的一种过滤器&#xff0c;用于在执行控制器操作&#xff08;Action&#xff09;之前或之后执行一些代码&#xff0c;完成特定的功能&#xff0c;比如执行日志记录、身份验证、授权、异常处理等通用的处…

2、鼠标事件、键盘事件、浏览器事件、监听事件、冒泡事件、默认事件、属性操作

一、鼠标事件 1、单击事件&#xff1a;onclick <body><header id"head">我是头部标签</header> </body> <script> var head document.getElementById("head")head.onclick function () {console.log("我是鼠标单击…

Elasticsearch使用经验和云上竞品对比

Elasticsearch使用经验和云上竞品对比 - 知乎 过去三十年&#xff0c;我们从企业应用开始&#xff0c;经历了 PC 互联网、移动互联网的爆发式发展&#xff0c;到如今的产业互联网。在这些不同时代&#xff0c;一直变化的是应用形态&#xff0c;不变的是核心数据的价值。 对于核…

kafka summary

最近整体梳理之前用到的一些东西&#xff0c;回顾Kafka的时候好多东西都忘记了&#xff0c;把一些自己记的比较模糊并且感觉有用的东西整理一遍并且记忆一遍&#xff0c;仅用于记录以备后续回顾 Kafka的哪些场景中使用了零拷贝 生产者发送消息&#xff1a;在 Kafka 生产者发送…