资讯专栏INFORMATION COLUMN

C/C++游戏项目详细教程:《黄金矿工》

cnio / 1879人阅读

摘要:黄金矿工是一款非常经典的游戏。在游戏中,玩家通过不断挖矿,获取金子,最终能够闯入下一关。游戏的玩法主要是通过不断采集地下的黄金和钻石,来得到更高的积分。

     《黄金矿工》是一款非常经典的游戏。在游戏中,玩家通过不断挖矿,获取金子,最终能够闯入下一关。在这个过程中,会不断有岩石、烟雾、老鼠来捣乱,甚至还会出现扛着炸药包的小老鼠,玩家必须战胜它们,才能进入更深的矿坑。

游戏的玩法主要是通过不断采集地下的黄金和钻石,来得到更高的积分。只有完成任务目标,才可以通过相应的关卡。游戏画面中沙滩上的人物便是玩家的角色,下方深褐色的部分是地下,而黄金和钻石就是玩家需要采集的物品。人物右边的四个方框里的物品是游戏中可以使用的道具。

画面中的虚线就是游戏中的探测器,探测器会不断的左右摆动,当摆动到地下的黄金和钻石的位置时,只需要点击矿坑任意处,便可以发射勘探头采集到这些物品,当然一定要瞄准好再出手呦。

当然想要顺利采集到丰富的资源也不是那么简单的,地下矿坑中,会有各式各样的困难和阻碍来干扰玩家的采集,这时我们就要用到人物右边的各种道具了,当矿坑中采集到石块的时候,玩家可以使用炸药棒来炸毁这些石块。当矿坑中有大量石块阻碍玩家的采集时,这时就可以用炸弹来拖拽到矿坑中石块群的位置,会一次性炸毁所有碍事的石块。当矿坑中烟雾桶被引爆后,看不清地下情况的时候,我们可以使用电风扇,它会把所有的烟雾都吹散,让玩家可以清楚的彻底看清矿坑的分布。矿坑中不时也会有小老鼠来捣乱,不用担心,我们有老鼠药来对付这些小东西,只要把老鼠药拖拽到老鼠所在的位置,就会瞬间消灭这些小麻烦,让玩家更顺利的采集到想要得到的资源。

紧张刺激的对战,轻松有趣的玩法,丰富多样的道具,还有精美细致的画面,这就是我们今天要完成的项目《黄金矿工》

在此之前呢,和大家说明一下,因为这是一个比较大的项目了,所以展示所有代码会有些困难,从中还要数据库的参与,所以我裁剪了主要部分的代码,主要目的的让大家明白实现这个项目的难点以及逻辑思路,希望大家可以理解
 

好了,话不多说,开始了

首先我们先创建一个头文件,把一些结构体以及枚举类型的函数放进去,这样会让整个项目看起来更加有序,更好理解,先把枚举类型放进去

enum ATTR{	//图片对应的数组下标	i_gold=1,	i_money=3,	i_role=5,	i_stone=9,	i_bk= i_stone+1,	//窗口尺寸	WIDTH = 1080,	HEIGHT= 640,	//物品数量	MINE_NUM=10,}; enum TYPE{	//物品类型	GOLD,	//金块	MONEY,	//钱袋	STONE,	//石头	//摆动方向	LEFT,	RIGHT,	//摆动状态	M_LONG,	M_NORMAL,	M_SHORT,};

之后把我们的老朋友结构体也放进去

struct Role{	int x;		//贴图的位置	int y;	int width;//图片宽度和高度	int height;	int coin;//金币};struct Mine //物品{	int x;	int y;	int size;//用来计算碰撞	int flag;//物品是否存在	int type;//物品类型,钱袋,石头,金块	int gold;//价值};//钩子struct Hook{	double x;//绳子开始坐标,固定不变的	double y;	double endx;//末端变化的坐标	double endy;	int len;//绳子长度	int dir;//摆动方向	double angle;//摆动角度	double speed;//速度	double vx;//速度分量	double vy;	int swing;//是否在摆动	int state;//伸长状态,伸长,正常,缩短	int index;//抓到的物品下标};

OK,接下来就是我们的主要函数main.Cpp了,记得开始的时候加上我们写的头文件,先写初始化函数

void GameInit(){	//初始化随机数种子	srand(GetTickCount());	//初始化角色数据	role.coin = 0;	role.width = 140;	role.height = 120;	role.x = WIDTH / 2 - role.width / 2;//让角色图片居中显示	role.y = 0;	//加载图片	for (int i = 0; i < 10; i++)	{		char fileName[20];		sprintf(fileName, "./images/%d.jpg", i);		if (i <= 1)		{			loadimage(&img[i], fileName,73,62);		}		else		{			loadimage(&img[i], fileName);		}		}	loadimage(&img[i_bk], "./images/bk.jpg",WIDTH,HEIGHT-role.height);	//初始化物品	for (int i = 0; i < MINE_NUM; i++)	{		mine[i].flag = 1;		mine[i].size = 60;		mine[i].type = rand() % 3;		mine[i].x=rand()%(WIDTH-mine[i].size);		mine[i].y=rand()%(HEIGHT-role.height-100)+ role.height+ 50;		mine[i].gold = rand()%600+rand()%200;	}	//初始化钩子	hook.x = role.x+45;	hook.y = role.y+100;	hook.len = 50;	hook.endx = hook.x;	hook.endy=hook.y+hook.len;	hook.angle = 0.0;	hook.dir = RIGHT;	hook.state = M_NORMAL;	hook.vx = 0;	hook.vy = 0;	hook.speed = 5.0;	hook.index = -1;}

再写我们的绘制函数,这个比较简单,就是贴图

void Gamedraw(){	BeginBatchDraw();	//设置背景颜色	setbkcolor(GREEN);	cleardevice();	putimage(0, role.height, &img[i_bk]);	//透明贴图 两张图片,一张掩码图,一张原图	putimage(role.x, role.y, &img[i_role-1],SRCAND);//掩码图	putimage(role.x, role.y, &img[i_role],SRCPAINT);//原图		//绘制钩子	setlinestyle(PS_SOLID, 5);	setlinecolor(BROWN);	line(hook.x, hook.y, hook.endx, hook.endy);	//绘制物品	for (int i = 0; i < MINE_NUM; i++)	{		if (mine[i].flag)		{			switch (mine[i].type)			{			case GOLD:				putimage(mine[i].x, mine[i].y, &img[i_gold-1],SRCAND);				putimage(mine[i].x, mine[i].y, &img[i_gold],SRCPAINT);				break;			case MONEY:				putimage(mine[i].x, mine[i].y, &img[i_money-1], SRCAND);				putimage(mine[i].x, mine[i].y, &img[i_money], SRCPAINT);				break;			case STONE:				putimage(mine[i].x, mine[i].y, &img[i_stone-1], SRCAND);				putimage(mine[i].x, mine[i].y, &img[i_stone], SRCPAINT);				break;			}		}	}	//绘制分数	char s[30];	sprintf(s, "金币:%d", role.coin);	settextstyle(50, 0, "黑体");	outtextxy(50, 50, s);	EndBatchDraw();}

钩子摆动的函数,钩子该如何的摆,主要是让他不要往天上摆就行

//钩子摆动void hookRock(){	if (hook.state == M_NORMAL)	{		if (hook.dir == RIGHT)		{			hook.angle++;		}		else		{			hook.angle--;		}		if (hook.angle > 80)		{			hook.dir = LEFT;		}		else if (hook.angle < -80)		{			hook.dir = RIGHT;		}		hook.endx = hook.x + sin(π / 180 * hook.angle) * hook.len;		hook.endy = hook.y + cos(π / 180 * hook.angle) * hook.len;	}}int distance(struct Hook hook){	double dis=sqrt((hook.x-hook.endx)* (hook.x - hook.endx) + (hook.y-hook.endy) * (hook.y - hook.endy));	return dis <= hook.len;}void keyControl(){	//按空格伸长	if (GetAsyncKeyState(VK_SPACE) && hook.state == M_NORMAL)	{		hook.state = M_LONG;		hook.vx = sin(π / 180 * hook.angle) * hook.speed;		hook.vy = cos(π / 180 * hook.angle) * hook.speed;	}	if (hook.endx <= 0 || hook.endx >= WIDTH || hook.endy >= HEIGHT)	{		hook.state = M_SHORT;	}		if (hook.state == M_LONG)	{		hook.endx += hook.vx;		hook.endy += hook.vy;	}	else if (hook.state == M_SHORT)	{		hook.endx -= hook.vx;		hook.endy -= hook.vy;		//如果缩短到原来的长度,就停止缩短,判断起点和末端的距离是否等于,长度		if (distance(hook))		{			hook.state = M_NORMAL;		}	}}

接下来是我们的抓取函数,也是比较简单

​void grap(){	//找到抓取的是哪个物品	for (int i = 0; i < MINE_NUM; i++)	{		if (mine[i].flag &&			hook.endx > mine[i].x && hook.endxmine[i].y && hook.endy < mine[i].y + mine[i].size)		{			hook.index = i;//保存抓到的物品的下标			break;		}	}	if (hook.index != -1)	{		hook.state = M_SHORT;		mine[hook.index].x = hook.endx-mine[hook.index].size/2;		mine[hook.index].y = hook.endy- mine[hook.index].size / 2;		if (distance(hook))		{			hook.state = M_NORMAL;			mine[hook.index].flag = 0;			role.coin += mine[hook.index].gold;			hook.state = M_NORMAL;			hook.index = -1;		}	}}​

最后是我们的主函数

int main(){	initgraph(WIDTH,HEIGHT,1);	GameInit();	while (1)	{		printf("%lf,%lf vxy(%lf,%lf)/n", hook.endx, hook.endy,hook.vx,hook.vy);		hookRock();		Gamedraw();		keyControl();   		grap();	}	closegraph();	return 0;}

这就是我们《黄金矿工》的主要代码了,有人会问了,好像也不多呀,从代码上看确实还好,但这个项目牵扯的东西有点多,包括数据库,考虑到有些同学看不懂我就不放在这里了,有兴趣的同学可以进去领取源码之后自己学习,最后想说的是,写游戏项目其实还好,主要是理清初始化函数以及更新函数,包装起来就很好理解了,好啦,希望大家可以在这里得到自己想要的知识以及快乐吧,也希望大家可以给UP主一个关注,非常感谢大家了!!!

                                                        

 后续UP主还会发布更多的项目源码以及学习资料,希望大家可以持续关注,有什么问题可以回帖留言,我尽量回答。想要C/C++学习资料以及其他项目的源码的可以加群【1083227756】了解。想要对程序员的未来发展有兴趣的也可加群闲聊。也可以关注微信公众号:【狐狸的编码时光】,希望和大家一起学习进步!!!


点击下方链接进群更快拿到学习资料以及项目素材 


进群领取学习资料以及项目源码素材包https://jq.qq.com/?_wv=1027&k=sttR3REF

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123068.html

相关文章

  • 你所不知道 ❌ Blockchain

    前言 未来的公司形态会不断地演化,去中心化,分布式,强化合作,适应变化,直到彻底地被网络化。终极公司的形式将会变得与生物体相同,无缝地集成到生态圈中,成为其中的一个环节。—— 凯文·凯利《失控》 小剧场 小二: 糖糖,我爱你哦~ 糖糖: 你骗人!男人的话能信母猪能上树。 小二: 我可以向全世界证明,我说的是真的~ 糖糖: 那你怎么证明啊~ 小二: 我可以用 区块链 写下 糖糖我爱你哦~...

    Tecode 评论0 收藏0
  • 深入了解 CKB 经济模型中的创新点之一:Nervos DAO

    摘要:在上一节秘猿科技小课堂中,我们已经提到了加密经济网络中底层公链经济模型中的创新点和二级发行政策。长期持币者这部分持币者会把当作类似比特币一样的资产来看待。我们都知道拥有一个比特币,代表着拥有两千一百万分之一的比特币稀缺性。 在上一节秘猿科技小课堂中,我们已经提到了Nervos 加密经济网络中底层公链 CKB 经济模型中的创新点:Nervos DAO 和 二级发行政策。在本文中,我们深入...

    Yangyang 评论0 收藏0
  • 从经济模型角度看比特币和以太坊存在的问题

    摘要:比特币和以太坊像两座最早出现的虚拟城市。下面我们先来分析比特币和以太坊这两个最大加密经济体的经济模型,我们经过研究发现它们在可持续性上都存在各自的问题。状态爆炸比特币与智能合约平台,都 公链的竞争是惨烈的,这个战场里的玩家要想生存下来,既要有绝活,还得没短板。在构建加密经济网络上,在技术实现和共识协议部分,我们为大家分享了CKB 的绝活,即: 与时俱进的 Cell 模型 用 RIS...

    thekingisalwaysluc 评论0 收藏0
  • 区块链概念 That You Must Know 第四期(1)

    摘要:挖矿是什么挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程。而成功抢到记账权的矿工,会获得系统新生的比特币奖励。矿机只执行单一的计算程序,实际是矿工之间比拼算力,拥有较多算力的矿工挖到比特币的概率更大。 第四期 有关挖矿和获取比特币(1) 卡酷少Wechat:13260325501 了解了这么多,大家是否想获取一些属于自己的比特币呢?之前我们在第一...

    evin2016 评论0 收藏0
  • 【Filecoin源码仓库全解析】第七章:了解PoRep与PoSt并参与复制证明游戏

    摘要:如上图,验证过程可以表述为验证者会按照一定的规则向矿工提起挑战,挑战是随机生成的,矿工不能提前获知。三时空证明如图所示,可以理解为矿工一定时间内持续地生成复制证明和接受挑战和验证的过程,并通过这个过程,更新全网存储算力。 欢迎大家来到第七章,经过前章《【Filecoin源码仓库全解析】第六章:如何单机部署多节点集群及矿池设计思路》的介绍,我们分享了如何在单机部署多节点集群的知识以及矿池...

    shixinzhang 评论0 收藏0

发表评论

0条评论

cnio

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<