欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 08:33:48
...

如何用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
判断:怎么移动?
数组操作:需要按键,上下左右
键入成功输出不同结果:不同方位按键进行不同的处理,遍历数组打印地图

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

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

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

这里放上我的人物角色图片:
这里其实是有一块白色的地面但是你们看不见,我恨!如何用C++和图形库制作一个简单的推箱子小游戏?
如何用C++和图形库制作一个简单的推箱子小游戏?
如何用C++和图形库制作一个简单的推箱子小游戏?
如何用C++和图形库制作一个简单的推箱子小游戏?
如何用C++和图形库制作一个简单的推箱子小游戏?
如何用C++和图形库制作一个简单的推箱子小游戏?
好的现在我放上我的源码,但是你们要注意更改其中的图片文件的位置,还有你们要放入的文件名字哦!

给你们看看我的文件名:
如何用C++和图形库制作一个简单的推箱子小游戏?

源码:

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

#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;
}

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