C语言 风靡一时的黄金矿工游戏实现流程详解

游戏的玩法主要是通过不断采集地下的黄金和钻石,来得到更高的积分。只有完成任务目标,才可以通过相应的关卡。游戏画面中沙滩上的人物便是玩家的角色,下方深褐色的部分是地下,而黄金和钻石就是玩家需要采集的物品。人物右边的四个方框里的物品是游戏中可以使用的道具。 画面中的虚线就是游戏中的探测器,探测器会不断的左右摆动,当摆动到地下的黄金和钻石的位置时,只需要点击矿坑任意处,便可以发射勘探头采集到这些物品,当然一定要瞄准好再出手呦。

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

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

好了,话不多说,开始了

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

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.endx<mine[i].x + mine[i].size &&
			hook.endy>mine[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主一个关注,非常感谢大家了!!!

到此这篇关于C语言 风靡一时的黄金矿工游戏实现流程详解的文章就介绍到这了,更多相关C语言 黄金矿工内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解用C语言实现三子棋游戏流程

    目录 三子棋游戏简介 一.分析及实现 1.棋盘 2.落子 3.判断输赢 二.程序演示 三.完整代码 1.main.c 2.game.c 3.game.h 总结 三子棋游戏简介 这是一个简单的三子棋小游戏,估计大家小时候都玩儿过,只要能连成三个,无论是行,列还是对角线,就可以胜利了.是不是很简单呢,那我们来尝试一下用C语言来写一个简单的三子棋游戏. 一.分析及实现 1.棋盘 想要玩游戏,那首先应该有一个棋盘吧.因为我们玩儿的是三子棋,所以来说一个3X3的棋盘应该可以满足要求.这里使用了一个三行三列

  • 基于C语言实现三子棋小游戏

    在写三子棋之前,我们要先了解三子棋的一个大概的图形,以便于我们整理思路. 首先我们要分模块写代码,不要全部写在主函数里面,模块化的代码便于理解,而且给人一种赏心悦目的感觉,如: game.h game.c test.c game.h---头文件的包含,定义宏变量以及函数声明 #pragma once //头文件的包含 #include<stdio.h> #include<stdlib.h> #include<time.h> //函数的声明 #define ROW 3 #

  • C语言 完整游戏项目坦克大战详细代码

    话不多说 我们今天就来创造出属于我们自己的<坦克大战>,GOGOGO!!! 直接开始吧 这次的源码比较详细,我分了好几个cpp文件,思路更加的清晰,请耐心用心的观看 首先就是我们载入图片的函数tupian.cpp # include "tanke.h" 障碍物 void LaoWang(int * tilex, int * tiley) { IMAGE img; loadimage(&img, _T("res\\tile.bmp")); puti

  • C语言实现简单五子棋游戏

    在生活中五子棋是一个十分普遍的一款游戏,今天让我们一起来实现这款游戏. 1.初始化棋盘 char ret; //数据存储在一个二维数组中,玩家下去*,电脑下去#. char board[row][col] = { 0 };//最开始为全是空格 InitBoard(board,row,col);//初始化棋盘 我们利用InitBoard函数来初始化棋盘,用 * 来表示玩家下棋,用 # 来表示电脑下棋. 代码如图: void InitBoard(char board[row][col], int R

  • 基于C语言实现简单扫雷游戏

    在每一个电脑里总有一个固定的小游戏-扫雷,那今天就让我们一起来实现下扫雷. 1.主函数的构建 int main() { int input = 0; do { menu(); printf("请选择是否开始游戏(1/0):>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戏退出!"); break; default:

  • C语言实现经典扫雷游戏流程

    目录 扫雷小游戏简介 一.分析与实现 1.设计棋盘 2.放置雷以及排雷 二.扫雷小游戏演示 三.源码 总结 扫雷小游戏简介 想必很多人小时候电脑没网的时候都玩儿过这个经典的小游戏,也都被它折磨过.其实这个游戏很简单,通过点击相应位置显示的数字来确定周围雷的数量,在避免踩到雷的同时找出所有的雷就能获得胜利. 这次我们用C语言来实现一个简单的扫雷小游戏. 一.分析与实现 1.设计棋盘 要玩儿扫雷游戏,我们首先应该有一个棋盘.这个棋盘中的雷应该是在开始玩儿游戏的时候就已经布置好了,不能随意变化.但是呢

  • C语言实现简易的扫雷游戏

    本文实例为大家分享了C语言实现简易的扫雷游戏的具体代码,供大家参考,具体内容如下 在正式讲内容之前先说一说扫雷游戏的规则 游戏规则很简单,点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利 .刚开始需要碰运气,只要点开一个区域,就可以正式开始了. 3.根据现有情况,判断出一定有雷的位置. 4.进一步计算,因为"2"右边的"1"已经有从属的雷了,所以右边的"2"的正下方没有雷,因此可以判断出左边有两颗雷,满足两个"2". 5.

  • C语言 小游戏打砖块实现流程详解

    始祖是美国英宝格公司(en:Atari Games,ja:アタリ (ゲーム))于1976年推出的街机游戏"Breakout"(en:Breakout),由该公司在1972年发行的"PONG"(en:PONG,ja:ポン (ゲーム),世界上第一款电子游戏,类似台球)改良而来.相较于其前作,一个人就可以玩与变化丰富这两项特点让Breakout相当卖座,使各家公司竞相模仿. 因为规则简单与游戏性,现在许多移动电话都有内建打砖块游戏,也有许多因特网小游戏版本,目前在网上可以

  • C语言 完整游戏项目推箱子详细代码

    话不多说 我们今天就来创造出属于我们自己的<推箱子>,GOGOGO!!! 直接开始吧 首先是我们用二维数组特定的数字描绘出这个地图 int cas = 0; int map[3][8][8] = { 1,1,1,1,1,1,1,1, 1,3,4,0,0,4,3,1, 1,0,1,3,0,1,0,1, 1,0,1,4,0,1,0,1, 1,0,0,5,0,0,0,1, 1,0,1,0,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

  • C语言 风靡一时的黄金矿工游戏实现流程详解

    游戏的玩法主要是通过不断采集地下的黄金和钻石,来得到更高的积分.只有完成任务目标,才可以通过相应的关卡.游戏画面中沙滩上的人物便是玩家的角色,下方深褐色的部分是地下,而黄金和钻石就是玩家需要采集的物品.人物右边的四个方框里的物品是游戏中可以使用的道具. 画面中的虚线就是游戏中的探测器,探测器会不断的左右摆动,当摆动到地下的黄金和钻石的位置时,只需要点击矿坑任意处,便可以发射勘探头采集到这些物品,当然一定要瞄准好再出手呦. 当然想要顺利采集到丰富的资源也不是那么简单的,地下矿坑中,会有各式各样的困

  • C语言静态与动态通讯录的实现流程详解

    目录 静态通讯录 contact.h contact.c test.c 动态通讯录 contact.h contact.c qsort.c test.c 本次通讯录的代码已经放到我的Gitee仓库中,感兴趣的小伙伴可以去看看 Gitee 静态通讯录 在我们学习完C语言的结构体.指针以及动态内存管理之后,我们就可以实现一些有意思的小项目了,通过这些小项目可以加深我们对于相关知识的理解. 静态通讯录主要要求有 静态大小,可以记录10个人的信息(大小自己定) 记录的信息如下:名字.性别.年龄.电话.住

  • C++ 风靡一时的连连看游戏的实现流程详解

    随着Flash应用的流行,网上出现了多种在线Flash版本"连连看".如"水晶连连看"."果蔬连连看"等,流行的"水晶连连看"以华丽界面吸引了一大批的女性玩家. 2008年,随着社交网络的普及和开放平台的兴起,"连连看"被引入了社交网络."连连看"与个人空间相结合,被快速的传播,成为一款热门的社交游戏,其中以开发者Jonevey在Manyou开放平台上推出的"宠物连连看&quo

  • C语言实现三子棋的步骤和代码详解

    一.问题描述 用c语言实现三子棋. 二.基本流程 在写三子棋的代码之前,我们来看看实现这个游戏的逻辑: 1.菜单界面选择开始或者退出游戏. 2.创建棋盘并初始化. 3.打印棋盘. 4.玩家落子(玩家输入行列坐标的方式来落子),'x'表示玩家落子. 5.判定胜负关系(输,赢,和棋),'q'表示和棋. 6.电脑落子(随机位置落子) ,'o'表示电脑落子. 7.判定胜负关系. 8.回到 步骤2 继续执行. 三.步骤 1.菜单界面 1.开始游戏 0.退出游戏 int menu(){ printf("--

  • C++ 情怀游戏扫雷的实现流程详解

    扫雷最原始的版本可以追溯到1973年一款名为"方块"的游戏. 不久,"方块"被改写成了游戏"Rlogic".在"Rlogic"里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输.两年后,汤姆·安德森在"Rlogic"的基础上又编写出了游戏"地雷",由此奠定了现代扫雷游戏的雏形. 1981年,微软公司的罗伯特·杜尔和卡特·约翰逊两位工程师

  • Java实现经典大富翁游戏的示例详解

    目录 前言 主要设计 功能截图 代码实现 总结 前言 大富翁,又名地产大亨.是一种多人策略图版游戏.参与者分得游戏金钱,凭运气(掷骰子)及交易策略,买地.建楼以赚取租金.英文原名monopoly意为“垄断”,因为最后只得一个胜利者,其余均破产收场. <大富翁>游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 可多人参与的大富翁游戏,玩家有初始资金,通过掷骰子,玩家移动指定骰子点数步骤,根据对应格子上的交易策略,来决定是赚钱还是亏钱,其他玩家破

  • Python实现猜拳与猜数字游戏的方法详解

    至此,我们的 Python零基础入门篇 的系列专栏到今天基本上算是结束了.今天没有任何的知识点,只是运用我们之前学习过的知识做两个小游戏的案例.第一个是模拟猜拳的小游戏,第二个就是猜数字的游戏. 猜拳小游戏 需求: 运用至今所学的 Python 知识编写脚本,实现一个人与计算机玩猜拳的石头剪刀布的小游戏. 这里我们先思考一下,如果将石头.剪刀.布分别用数字0.1.2表示,那么如何判定谁胜谁负呢? user robot 结果 0(石头) 0(石头) 平局 0(石头) 1(剪刀) user 获胜 0

  • 基于JavaScript实现游戏购物车效果详解

    目录 项目展示 登陆界面 注册界面 主界面 项目展示 登陆界面 登陆界面html和js <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <tit

  • Java实现动物换位游戏完整 过程详解

    目录 效果展示 一.效果展示 1.游戏界面 2.测试界面 二.项目介绍 1.总体需求 2.总体设计 三.代码展示 1.图形界面设计(gui包) 2.用户操作设计(data包) ① Animal类 ② LeftAnimal类 ③ RightAnimal类 ④ Point类 ⑤ ViewForAnimal类 3.游戏视图设计(view包) ① AnmialView类 ② GamePanel类 ③ HandleAnimalMove类 ④ HandleRedo类 ⑤ HandleReStart类 四.代

随机推荐