简单的推箱子游戏实战

这篇具有很好参考价值的文章主要介绍了简单的推箱子游戏实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

项目分析

 地图初始化

背景图片

游戏场景图片:

热键控制

 按键设置

确定人物位置

实现人物移动(非箱子,目的地)

推箱子控制

游戏结束

最终代码

合法性判断:


项目分析

墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5

简单的推箱子游戏实战,游戏,visual studio,c++

 地图初始化

背景图片

简单的推箱子游戏实战,游戏,visual studio,c++

#include <iostream>
#include <graphics.h>
#include <MMsystem.h>
#include <Windows.h>

using namespace std;
IMAGE BG_IMAGE;
#define WIDE  650
#define HEITH 650
//设置窗口初始化,背景
void initGraph() {
	initgraph(WIDE, HEITH);
	loadimage(&BG_IMAGE, "推箱子图片素材/blackground.bmp", WIDE, HEITH,true);//设置图片为窗口大小
	putimage(0, 0, &BG_IMAGE);
}

int main(void) {
	initGraph();


	system("pause");//设置初始化的屏幕不一闪而逝
	return 0;
}

游戏场景图片:

简单的推箱子游戏实战,游戏,visual studio,c++

#define MAP_WIDE   50  //方块宽
#define MAP_HEIGTH 50  //方块高
#define MAP_ROWS   9   //数组行数
#define MAP_COLS   12  //数组列数
#define RADIO      50  //每行乘这个比例就加载一个图片
#define MAP_X      100 //图片开始地方偏移量x
#define MAP_Y      100 //图片开始地方偏移量y
enum MyEnum{
	wall,  //墙
	Floor, //地板
	des,   //目的地
	man,   //小人
	box,   //箱子
	hit,   //命中
	all    //用来表示图片数组的大小
};
IMAGE MAP_IMAGE[all];//场景图片
void map() {
	int a[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},
	};
	//墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5
	loadimage(&MAP_IMAGE[wall], "推箱子图片素材/wall_right.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[Floor], "推箱子图片素材/floor.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[des], "推箱子图片素材/des.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[man], "推箱子图片素材/man.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[box], "推箱子图片素材/box.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[hit], "推箱子图片素材/box.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	
	for (int i = 0; i < MAP_ROWS; i++){
		for (int j = 0; j < MAP_COLS; j++) {
			putimage( MAP_X + j*RADIO, MAP_Y + i*RADIO, &MAP_IMAGE[a[i][j]]);
		}
	}
}

热键控制

 按键设置

但是一直执行循环块很占用CPU,消耗很大很严重资源(使用sleep(),在用户没有按键的时候,CPU休息)

#define KEY_UP		'w'
#define KEY_DOWN	's'
#define KEY_LEFT	'a'
#define KEY_RIGHT	'r'
#define KEY_QUIT	'q'
#include <conio.h>
void control() {
	
	bool quit = false;
	do
	{
		if (_kbhit()) {//判断用户是否按键
			char ch = _getch();//直接从键盘获取字符,不经过输入缓冲区
			if (ch == KEY_UP) {
				//get_control(KEY_UP);
			}
			else if (ch == KEY_DOWN) {
				//get_control(KEY_DOWN);
			}
			else if (ch == KEY_LEFT) {
				//get_control(KEY_LEFT);
			}
			else if (ch == KEY_RIGHT) {
				//get_control(KEY_RIGHT);
			}
			else if (ch == KEY_QUIT) {
				quit = true;
			}
		}
    Sleep(50);//在用户没有按键的时候,CPU休息)

	} while (quit ==false);
}

确定人物位置

//实现人物行动
enum MyEnum1 {
	UP,
	DOWN,
	RIGHT,
	LEFT
};
struct position {
	int x;
	int y;
};
typedef enum MyEnum1 keybord;
typedef struct position pos;
pos MAN;
void get_control(keybord control) {
	pos next_pos, next_next_pos;
	switch (control) {
	case UP:
		next_pos.x = MAN.x - 1;
		next_next_pos.x = MAN.x - 2;
		break;
	case DOWN:
		next_pos.x = MAN.x + 1;
		next_next_pos.x = MAN.x + 2;
		break;
	case LEFT:
		next_pos.y = MAN.y - 1;
		next_next_pos.y = MAN.y - 2;
		break;
	case RIGHT:
		next_pos.y = MAN.y + 1;
		next_next_pos.y = MAN.y + 2;
		break;
	}

}
//void map()函数内需要添加

/*

if (a[i][j] == man) {//记录小人的初始位置
	MAN.x = i;
	MAN.y = j;
}

*/

实现人物移动(非箱子,目的地)

//实现小人移动
void mapChange(pos* pos, enum MyEnum prop) {
	a[pos->x][pos->y] = prop;
	putimage(MAP_X + pos->y * RADIO, MAP_Y + pos->x * RADIO, &MAP_IMAGE[prop]);
}

//在void get_control(keybord control)

/*

//小人前面如果是地板,人就前进一步,站到next_pos的位置
if (a[next_pos.x][next_pos.y] == Floor) {
	mapChange(&next_pos, man);
	mapChange(&MAN, Floor);
	MAN = next_pos;
}

*/

推箱子控制

//人前进一步是箱子则判断箱子前的道具,即next_next_pos,如果是地板和箱子目的地,推着箱子走
if (a[next_pos.x][next_pos.y] == box) {
	//下下个是地板
	if (a[next_next_pos.x][next_next_pos.y] == Floor) {
		mapChange(&next_next_pos, box);
		mapChange(&next_pos, man);
		mapChange(&MAN, Floor);
		MAN = next_pos;
		//下下个是目的地
	}else if (a[next_next_pos.x][next_next_pos.y] == des) {
		mapChange(&next_next_pos, hit);
		mapChange(&next_pos, man);
		mapChange(&MAN, Floor);
		MAN = next_pos;
	}
}

游戏结束

bool gameOver() {
	for (int i = 0; i < MAP_ROWS; i++) {
		for (int j = 0; j < MAP_COLS; j++) {
			if (a[i][j]==des) {
				return false;
			}
		}
	}
	return true;
}
void gameOverScien() {
	putimage(0, 0, &BG_IMAGE);
	settextcolor(RGB(255, 255, 0));
	settextstyle(90, 0, "微软雅黑");//这里可能会有字符集的问题,上上篇发过解决方法
	
	rectangle(300, 297, 570, 300);//设置矩形框
	outtextxy(300, 300, "游戏结束");;//添加文字

}

最终代码

#include <iostream>
#include <graphics.h>
#include <MMsystem.h>
#include <Windows.h>
#include <conio.h>

using namespace std;
IMAGE BG_IMAGE;
#define WIDE  800
#define HEITH 650

//按键
#define KEY_UP		'w'
#define KEY_DOWN	's'
#define KEY_LEFT	'a'
#define KEY_RIGHT	'd'
#define KEY_QUIT	'q'

//end按键
//实现人物行动
enum MyEnum1 {
	UP,
	DOWN,
	RIGHT,
	LEFT
};
struct position {
	int x;
	int y;
};
typedef enum MyEnum1 keybord;
typedef struct position pos;
pos MAN;

//end 人物移动
int a[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},
};
//道具
#define MAP_WIDE   50  //方块宽
#define MAP_HEIGTH 50  //方块高
#define MAP_ROWS   9   //数组行数
#define MAP_COLS   12  //数组列数
#define RADIO      50  //每行乘这个比例就加载一个图片
#define MAP_X      100 //图片开始地方偏移量x
#define MAP_Y      100 //图片开始地方偏移量y
enum MyEnum {
	wall,  //墙
	Floor, //地板
	des,   //目的地
	man,   //小人
	box,   //箱子
	hit,   //命中
	all    //用来表示图片数组的大小
};
IMAGE MAP_IMAGE[all];//场景图片
//end 道具

//设置窗口初始化,背景
void initGraph() {
	initgraph(WIDE, HEITH);
	loadimage(&BG_IMAGE, "推箱子图片素材/blackground.bmp", WIDE, HEITH, true);//设置图片为窗口大小
	putimage(0, 0, &BG_IMAGE);
}


void map() {
	//墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5
	loadimage(&MAP_IMAGE[wall], "推箱子图片素材/wall_right.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[Floor], "推箱子图片素材/floor.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[des], "推箱子图片素材/des.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[man], "推箱子图片素材/man.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[box], "推箱子图片素材/box.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);
	loadimage(&MAP_IMAGE[hit], "推箱子图片素材/box.bmp", MAP_WIDE, MAP_HEIGTH, TRUE);

	for (int i = 0; i < MAP_ROWS; i++) {
		for (int j = 0; j < MAP_COLS; j++) {
			if (a[i][j] == man) {//记录小人的初始位置
				MAN.x = i;
				MAN.y = j;
			}
			putimage(MAP_X + j * RADIO, MAP_Y + i * RADIO, &MAP_IMAGE[a[i][j]]);
		}
	}
}
//实现小人移动
void mapChange(pos* pos, enum MyEnum prop) {
	a[pos->x][pos->y] = prop;
	putimage(MAP_X + pos->y * RADIO, MAP_Y + pos->x * RADIO, &MAP_IMAGE[prop]);
}
void get_control(keybord control) {
	pos next_pos = MAN, next_next_pos=MAN;
	switch (control) {
	case UP:
		next_pos.x = MAN.x - 1;
		next_next_pos.x = MAN.x - 2;
		break;
	case DOWN:
		next_pos.x = MAN.x + 1;
		next_next_pos.x = MAN.x + 2;
		break;
	case LEFT:
		next_pos.y = MAN.y - 1;
		next_next_pos.y = MAN.y - 2;
		break;
	case RIGHT:
		next_pos.y = MAN.y + 1;
		next_next_pos.y = MAN.y + 2;
		break;
	}
	
	//小人前面如果是地板,人就前进一步,站到next_pos的位置
	if (a[next_pos.x][next_pos.y] == Floor) {//做合法性判断
		mapChange(&next_pos, man);
		mapChange(&MAN, Floor);
		MAN = next_pos;
	}
	//人前进一步是箱子则判断箱子前的道具,即next_next_pos,如果是地板和箱子目的地,推着箱子走
	if (a[next_pos.x][next_pos.y] == box) {
		//下下个是地板
		if (a[next_next_pos.x][next_next_pos.y] == Floor) {
			mapChange(&next_next_pos, box);
			mapChange(&next_pos, man);
			mapChange(&MAN, Floor);
			MAN = next_pos;
			//下下个是目的地
		}else if (a[next_next_pos.x][next_next_pos.y] == des) {
			mapChange(&next_next_pos, hit);
			mapChange(&next_pos, man);
			mapChange(&MAN, Floor);
			MAN = next_pos;
		}
	}
	
}
bool gameOver() {
	for (int i = 0; i < MAP_ROWS; i++) {
		for (int j = 0; j < MAP_COLS; j++) {
			if (a[i][j]==des) {
				return false;
			}
		}
	}
	return true;
}
void gameOverScien() {
	putimage(0, 0, &BG_IMAGE);
	settextcolor(RGB(255, 255, 0));
	settextstyle(90, 0, "微软雅黑");//这里可能会有字符集的问题,上上篇发过解决方法
	
	rectangle(300, 297, 570, 300);//设置矩形框
	outtextxy(300, 300, "游戏结束");;//添加文字

}
void control() {
	bool quit = false;
	do{
		if (_kbhit()) {//判断用户是否按键
			char ch = _getch();//直接从键盘获取字符,不经过输入缓冲区
			if (ch == KEY_UP) {
				get_control(UP);
			}
			else if (ch == KEY_DOWN) {
				get_control(DOWN);
			}
			else if (ch == KEY_LEFT) {
				get_control(LEFT);
			}
			else if (ch == KEY_RIGHT) {
				get_control(RIGHT);
			}
			else if (ch == KEY_QUIT) {
				quit = true;
			}
			if (gameOver()) {
				gameOverScien();
			}
		}
		Sleep(50);
	} while (quit ==false);
}
int main(void) {
	//初始化
	initGraph();
	//加载场景图片
	map();
	//实现热键控制人物
	control();

	system("pause");//设置初始化的屏幕不一闪而逝
	return 0;
}

合法性判断:

#define isValues(pos) (pos.x>=0 &&pos.x<MAP_COLS &&pos.y>=0&&pos.y<MAP_ROWS)文章来源地址https://www.toymoban.com/news/detail-813471.html

到了这里,关于简单的推箱子游戏实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • python小游戏——推箱子代码开源

    python小游戏——推箱子代码开源

    ♥️ 作者:小刘在这里 ♥️ 每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至。 目录 一.效果呈现  二.主代码 三.cfg 四.README \\\'\\\'\\\'配置文件\\\'\\\'\\\' imp

    2024年02月02日
    浏览(14)
  • Unity游戏源码分享-3d机器人推箱子游戏

    Unity游戏源码分享-3d机器人推箱子游戏

    Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏    工程地址:https://download.csdn.net/download/Highning0007/88098014

    2024年02月15日
    浏览(17)
  • python小游戏 推箱子小游戏设计与实现

    python小游戏 推箱子小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 推箱子小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 游戏简介: 经典

    2024年02月08日
    浏览(17)
  • python毕设分享 python推箱子小游戏

    python毕设分享 python推箱子小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 推箱子小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年02月05日
    浏览(15)
  • 【HTML小游戏】推箱子网页版(附完整源码)

    【HTML小游戏】推箱子网页版(附完整源码)

    最近刚刚更新完了HTML,CSS的万字总结 ,有很多人已经学习完了文章,感觉反馈还不错,今天,用HTML,CSS,JS的知识编写了一个童年经典游戏 - 推箱子,供学习参考。 游戏主界面展示: 游戏界面展示: 经典的推箱子是一个非常古老游戏,甚至是80,90年代的回忆,目的是在训

    2024年02月04日
    浏览(14)
  • 怎样使用Pyglet库给推箱子游戏画关卡地图

    怎样使用Pyglet库给推箱子游戏画关卡地图

    目录 pyglet库 画图事件 按键事件 程序扩展 关卡地图 是一个跨平台的Python多媒体库,提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染和音频播放的项目

    2024年02月22日
    浏览(9)
  • python项目分享 推箱子小游戏设计与实现 (源码)

    python项目分享 推箱子小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 推箱子小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年01月23日
    浏览(8)
  • 毕业设计 单片机推箱子游戏(AT89C51)

    毕业设计 单片机推箱子游戏(AT89C51)

    一、电路设计 此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。 LCD12864显示模块 带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置

    2024年02月21日
    浏览(47)
  • 手把手教你使用Python实现推箱子小游戏(附完整源码)

    手把手教你使用Python实现推箱子小游戏(附完整源码)

    我们这个项目是一个基于Python实现的推箱子小游戏,名叫Sokoban: 这个游戏的目的是让玩家,也就是大写的 P ,推着箱子 # ,填充用小写的 o 标记的地面上的洞 该版本的Sokoban的规则如下: 游戏在矩形的二维网格上举行,其 原点(0,0) 位于左上方 网格上的每个单元格可以随时包

    2024年02月03日
    浏览(22)
  • 走迷宫之推箱子

    走迷宫之推箱子

    在上一篇文章当中我介绍了一个走迷宫的写法,但是那个迷宫没什么可玩性和趣味性,所以我打算在迷宫的基础上加上一个推箱子,使之有更好的操作空间,从而增强了游戏的可玩性和趣味性。 迷宫的组成要素无非就是:墙、路、入口、出口,根据这些要素我们可以设置一个

    2024年01月17日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包