如何用C++和图形库制作一个简单的推箱子小游戏?

如何用C++和图形库制作一个简单的推箱子小游戏?

推箱子是我们小时候经常会玩的很简单的小游戏,在小神机的年代里,推箱子小游戏非常风靡,对于已经掌握了一定编程知识的你,简单地模仿这个游戏进行创作一定不是难事,那么我们现在尝试去制作它吧!


编程语言:C++
图形库:graphics.h
(图形库的安装教程参考:Visual Studio C++/C 教你四步安装graphics图形库


一、前期分析

  • 对于推箱子小游戏,我们需要考虑有几个游戏角色,易知,我们需要设置的是:

空地、箱子、墙壁、人、箱子要到达的终点,玩家起点

  • 通过键入方向键,我们可以控制人移动,人的移动会发生以下状况:

1.人走到空地上
2.人推到了箱子
3.人走到终点
4.人推着箱子一起移动=人推箱子都走到空地上+人推箱子撞到墙+人推箱子到终点
5.人撞墙

  • 我们要完成的几项任务:

1.推箱子地图设计
2.人物移动设计(按键键入)
3.关卡设计(完成后进入下一关)

二、地图设计

首先,我们需要将不同的角色用不同的数字代表,然后通过二维数组,来构建地图,就像这样:

1,1,1,1,1,1,1,1,
1,3,4,0,0,4,3,1,
1,0,1,0,0,1,0,1,
1,0,0,0,0,0,0,1,
1,0,1,5,0,1,0,1,
1,3,4,0,0,4,3,1,
1,1,1,1,1,1,1,1,

然后我们设计多个关卡,构成一个三维数组,接着我们对以上分析的几个游戏角色进行贴图,将图片导入。

三、人物移动设计

我们通过键入方向键来操纵人物的移动,并对人物移动所产生的不同的游戏状态,写出相应的代码。

即:对键入按键处理
判断:只有人可移动—>寻找人—>=5
判断:怎么移动?
数组操作:需要按键,上下左右
键入成功输出不同结果:不同方位按键进行不同的处理,遍历数组打印地图

四、是否进入下一关卡或者是否游戏结束

人物移动后,判断我们的箱子是不是都到达了终点,然后判断是否已经是最后一个关卡。

游戏完成后弹出自己设计的界面。
(我的是漂亮小姐姐嘿嘿嘿~)

这里放上我的人物角色图片:
这里其实是有一块白色的地面但是你们看不见,我恨!白色地面
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
好的现在我放上我的源码,但是你们要注意更改其中的图片文件的位置,还有你们要放入的文件名字哦!

给你们看看我的文件名:
在这里插入图片描述

源码:

现在就是我的完整代码了,希望借鉴以后能给我点支持哈哈哈哈哈哈

#include <graphics.h>
#include <stdio.h>
#include <conio.h>
//制作地图,二维数组绘制
int map[3][7][8] =
{
	1,1,1,1,1,1,1,1,
	1,3,4,0,0,4,3,1,
	1,0,1,0,0,1,0,1,
	1,0,0,0,0,0,0,1,
	1,0,1,5,0,1,0,1,
	1,3,4,0,0,4,3,1,
	1,1,1,1,1,1,1,1,
	
	1,1,1,1,1,1,1,1,
	1,3,1,0,0,1,3,1,
	1,4,1,1,0,4,0,1,
	1,0,1,0,0,0,0,1,
	1,0,1,5,0,4,0,1,
	1,0,0,0,0,1,3,1,
	1,1,1,1,1,1,1,1,

	1,1,1,1,1,1,1,1,
	1,3,4,0,4,3,1,1,
	1,1,1,0,0,1,1,1,
	1,0,0,0,0,0,0,1,
	1,4,1,5,0,1,4,1,
	1,3,1,0,0,1,3,1,
	1,1,1,1,1,1,1,1,
};
//关卡控制变量
int cos = 0;

//批量处理数据
IMAGE img[6];//存放照片
int imgIndex[6] = { 0,1,3,4,5,7 };
//加载资源----->变量的初始化
//不同变量初始化方式不同
//loadimage 初始化 IMAGE 变量
void loadResource()
{
	for (int i = 0; i < 6; i++)
	{
		char filename[20] = "";
		sprintf_s(filename, "%d.png", imgIndex[i]);
		loadimage(img + i, filename);
	}
}
//制作地图----->各个值分别代表什么物品
//遍历数组,打印相关物品
void drawMap()
{
	int i, j;
	int x, y;//坐标
	for (i = 0; i < 7; i++)
	{
		for (j = 0; j < 8; j++)
		{
			x = 64 * j;
			y = 64 * i;
			//游戏状态分析
			switch (map[cos][i][j])
			{
			case 0://空地
				putimage(x, y, img + 0);
				break;
			case 1://墙面
				putimage(x, y, img + 1);
				break;
			case 3://终点
				putimage(x, y, img + 2);
				break;
			case 4://箱子
				putimage(x, y, img + 3);
				break;
			case 5://putimage(x, y, img + 4);
				break;
			case 7://箱子推到了终点
				putimage(x, y, img + 5);
				break;
			case 8://人在终点上
				putimage(x, y, img + 4);
				break;
			}
		}
	}
}
//按键处理
//只有人可移动--->寻找人--->=5
//怎么移动?
//数组操作:需要按键,上下左右
//不同方位按键进行不同的处理
//遍历数组打印地图
void keyDown()
{
	int i, j;
	for (i = 0; i < 7; i++)
	{
		for (j = 0; j < 8; j++)
		{
			if (map[cos][i][j] == 5 || map[cos][i][j] == 8)
				break;
		}
		if (map[cos][i][j] == 5 || map[cos][i][j] == 8)
			break;//找到人的位置
	}
	//按键处理
	char userKey = _getch();//不可见输入
	switch (userKey)
	{
		//往上走
	case 'w':
	case 'W':
	case 72:
		if(map[cos][i - 1][j] == 0 || map[cos][i - 1][j] == 3)//往上是空地或者终点
		{
		    map[cos][i][j] -= 5;//原来的地方变成空地
			map[cos][i - 1][j] += 5;//空地变成人的位置
        }
		else if (map[cos][i - 1][j] == 4 || map[cos][i - 1][j] == 7)//往上是箱子
		{
			//箱子有两种情况:
			//1.箱子的上面是空地或者终点
			if (map[cos][i - 2][j] == 0 || map[cos][i - 2][j] == 3)
			{
				map[cos][i][j] -= 5;//原来位置变成空地
				map[cos][i - 1][j] += 1;//箱子的位置变成人
				map[cos][i - 2][j] += 4;//箱子上面的空地变成箱子
			}
		}
		break;
		//往下走
	case 's':
	case 'S':
	case 80:
		if(map[cos][i+1][j] == 0 || map[cos][i +1][j] == 3)//往下是空地或者终点
		{
		map[cos][i][j] -= 5;//原来的地方变成空地
		map[cos][i + 1][j] += 5;//空地变成人的位置
		}
		else if (map[cos][i + 1][j] == 4 || map[cos][i + 1][j] == 7)//往上是箱子
		{
			//箱子有两种情况:
			//1.箱子的上面是空地或者终点
			if (map[cos][i + 2][j] == 0 || map[cos][i + 2][j] == 3)
			{
				map[cos][i][j] -= 5;//原来位置变成空地
				map[cos][i + 1][j] += 1;//箱子的位置变成人
				map[cos][i + 2][j] += 4;//箱子上面的空地变成箱子
			}
		}
		break;
		//往左走
	case 'a':
	case 'A':
	case 75:
		if(map[cos][i][j-1] == 0 || map[cos][i][j-1] == 3)//往上是空地或者终点
		{
		map[cos][i][j] -= 5;//原来的地方变成空地
		map[cos][i][j-1] += 5;//空地变成人的位置
		}
		else if (map[cos][i][j - 1] == 4 || map[cos][i][j - 1] == 7)//往上是箱子
		{
			//箱子有两种情况:
			//1.箱子的上面是空地或者终点
			if (map[cos][i][j - 2] == 0 || map[cos][i][j - 2] == 3)
			{
				map[cos][i][j] -= 5;//原来位置变成空地
				map[cos][i][j - 1] += 1;//箱子的位置变成人
				map[cos][i][j - 2] += 4;//箱子上面的空地变成箱子
			}
		}
		break;
		//往右走
	case 'd':
	case 'D':
	case 77:
		if(map[cos][i][j+1] == 0 || map[cos][i][j+1] == 3)//往上是空地或者终点
		{
		map[cos][i][j] -= 5;//原来的地方变成空地
		map[cos][i][j+1] += 5;//空地变成人的位置
		}
		else if (map[cos][i][j + 1] == 4 || map[cos][i][j + 1] == 7)//往上是箱子
		{
			//箱子有两种情况:
			//1.箱子的右面是空地或者终点
			if (map[cos][i][j+2] == 0 || map[cos][i][j+2] == 3)
			{
				map[cos][i][j] -= 5;//原来位置变成空地
				map[cos][i][j+1] += 1;//箱子的位置变成人
				map[cos][i][j+2] += 4;//箱子上面的空地变成箱子
			}
		}
		break;
	}
}
//判断游戏是否结束:当箱子都到终点时
int gameover()
{
	int count = 1;
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (map[cos][i][j] == 4)//还没有推到位的箱子
			{
				count = 0;//没成功
			}

		}
	}
	return count;
}
//游戏结束界面
int gameoverLayout()
{
	IMAGE pljj;
	loadimage(&pljj, "pljj.jpg");
	initgraph(pljj.getwidth(), pljj.getheight());
	putimage(0, 0, &pljj);
	getchar();
	closegraph();
	printf("------------------游戏结束!-----------------");
	return 0;
}
int main()
{
	initgraph(64*8, 64*7);
	loadResource();
	while (1)
	{
		drawMap();
		keyDown();
		if (gameover())
		{
			cos++;
			
			if (cos == 3)
			{
				gameoverLayout();
				break;
			}
			
		}
	}
	getchar();
	closegraph();
	return 0;
}

感谢你的浏览!麻烦下方点赞哦👍!
|
/

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值