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

C语言/C++项目——黄金矿工

程序员文章站 2024-03-18 23:55:28
...

C语言/C++项目源码分享——黄金矿工

这里是一个C语言/C++项目黄金矿工的源码。
这个源码还有待完善,希望大家共同改进。
编译软件:VS2013

游戏的初始界面是这样子的C语言/C++项目——黄金矿工
在这里我并没有写开始游戏的界面,大家可以自己加上去。
在没有抓取的条件下,钩子按照一个固定的速度左右摆动,想要抓取金子,石块或者随机奖励按空格键抓取,如果钩子碰到黄金,则钩子与金子一同回拉,金子在拉取到转轴处消失,地图上的金子减少一个。
下面是项目源码,做的不完整,欢迎大家指正。

#include<stdio.h>
#include<math.h>
#include<graphics.h>//easyx 包含头文件,可以使用提供的接口,函数
#define WIN_WIDTH 1080
#define WIN_HEIGHT 640
#define MAX_IMAGE 11  //最大图片数量
#define MAX_MINE 10   //最大物品数量
#define MAX_ANGLE 80 //最大角度
#define PI 3.1415926535898
//int a,char b
enum MINE //枚举图片数组下标
{
	i_gold=1,
	i_money=3,
	i_soledown=5,
	i_soleup=7,
	i_stone=9,
	i_bk = MAX_IMAGE-1,
};
enum MINE_TYPE //物品类型枚举
{
	GOLD,
	MONEY,
	STONE,
	//方向
	LEFT,
	RIGHT,
	//状态,正常,伸长,缩短
	M_NOMAL,
	M_LONG,
	M_SHORT,
};
struct Sole //角色信息
{
	int x;//贴图位置
	int y;
	int width;//图片宽高
	int height;
	int coin;//金币
}sole;
struct Mine //物品
{
	int x;
	int y;
	int szie; //边界判断
	bool flag;//是否存在
	int type;//物品类型,石头,金块,钱袋
	int gold;//物品价值
}mine[MAX_MINE];
struct Hook //钩子
{
	int x;
	int y;
	int endx;
	int endy;
	int len;//长度
	int angle;//角度
	int dir;//摆动方向
	int vx;//速度分量
	int vy;
	int state;
	int index;//记录抓到的物品下标
}hook;
IMAGE img[MAX_IMAGE];
int distance(Hook hook);
//初始化数据
void GameInit()
{
	//创建窗口 init 初始化  graphics图形界面
	initgraph(WIN_WIDTH, WIN_HEIGHT,SHOWCONSOLE);
	//设置随机数种子
	srand(GetTickCount());
	//加载图片
	for (int i = 0; i < MAX_IMAGE-1; i++)
	{
		char temp[25]="";
		sprintf(temp, "./images/%d.jpg", i);
		if (i <= 1)
		{
			loadimage(&img[i], temp,73,62);//注意:字符集问题
		}
		else
		{
			loadimage(&img[i], temp);//注意:字符集问题
		}
		
	}
	loadimage(&img[i_bk], "./images/bk.jpg", WIN_WIDTH, WIN_HEIGHT-120);
	//初始化角色信息
	sole.width = 140;
	sole.height = 120;
	sole.x = WIN_WIDTH/2-sole.width/2;//x轴居中
	sole.y = 0;
	sole.coin = 0;

	//初始化物品信息
	for (int i = 0; i < MAX_MINE; i++)
	{
		mine[i].flag = true;
		mine[i].gold = rand() % 200+1;
		mine[i].szie = 60;
		mine[i].type = rand()%3;
		mine[i].x = rand() % (WIN_WIDTH - 60);
		mine[i].y = rand() % (WIN_HEIGHT - 150) + 150;
	}
	//初始化钩子
	hook.x = sole.x + 40;
	hook.y = sole.y + 100;
	hook.len = 50;
	hook.endx = hook.x;
	hook.endy = hook.y + hook.len;
	hook.angle = 0;
	hook.dir = RIGHT;
	hook.vx = 0;
	hook.vy = 0;
	hook.state = M_NOMAL;
	hook.index = -1;
}
//游戏绘制
void GameDraw()
{
	//绘制背景
	putimage(0, 120, &img[i_bk]);
	//绘制角色背景颜色
	setfillcolor(RGB(255, 208, 52));
	solidrectangle(0, 0, WIN_WIDTH, 120);
	//绘制角色
	putimage(sole.x, sole.y, &img[i_soledown-1],SRCAND);//知道为啥减1不?
	putimage(sole.x, sole.y, &img[i_soledown],SRCPAINT);
	//绘制物品
	for (int i = 0; i < MAX_MINE; i++)
	{
		if (mine[i].flag == true)
		{
			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;
			}
		}
	}
	//绘制钩子
	setlinecolor(BROWN);
	setlinestyle(PS_SOLID, 5);
	line(hook.x, hook.y, hook.endx, hook.endy);

	//绘制分数
	char score[30] = "";
	sprintf(score, "分数:%d", sole.coin);
	settextcolor(WHITE);
	setbkmode(TRANSPARENT);
	settextstyle(50, 0, "楷体");
	outtextxy(20, 20, score);
}
//钩子摆动
void HookRock()
{
	if (hook.state == M_NOMAL)
	{
		if (hook.dir == RIGHT)
		{
			hook.angle++;
		}
		else
		{
			hook.angle--;
		}
		if (hook.angle > MAX_ANGLE)
		{
			hook.dir = LEFT;
		}
		else if (hook.angle<-MAX_ANGLE)
		{
			hook.dir = RIGHT;
		}
		//角度转弧度  360 2pai  180  PI  
		hook.endx = hook.x + sin(PI / 180 * hook.angle)*hook.len;
		hook.endy = hook.y + cos(PI / 180 * hook.angle)*hook.len;
	}
	
}

//游戏控制
void GameControl(int speed)
{
	if (GetAsyncKeyState(VK_SPACE) && hook.state==M_NOMAL)
	{
		//按键,求出速度分量
		hook.vx = sin(PI / 180 * hook.angle)*speed;
		hook.vy = cos(PI / 180 * hook.angle)*speed;
		hook.state = M_LONG;
	}
	//碰到边界返回
	if (hook.endx<0 || hook.endx>WIN_WIDTH || hook.endy > WIN_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_NOMAL;
		}
	}
	//接下来就是让hook.endx 加上hook.vx
	printf("%d %d\n", hook.vx, hook.vy);
}
void JudgeGrap()
{
	//判断抓到那个物品
	for (int i = 0; i < MAX_MINE; i++)
	{
		if (mine[i].flag == true &&
			hook.endx>mine[i].x && hook.endx<mine[i].x+mine[i].szie &&
			hook.endy>mine[i].y && hook.endy<mine[i].y+mine[i].szie)
		{
			hook.index = i;
			break;
		}
	}
	//如果抓到了
	if (hook.index != -1)
	{
		hook.state = M_SHORT;
		mine[hook.index].x = hook.endx;
		mine[hook.index].y = hook.endy;
		//缩短完成
		if (distance(hook))
		{
			mine[hook.index].flag = false;
			hook.index = -1;
			hook.state = M_NOMAL;
		}
	}
}
//void main 
int main()
{
	GameInit();
	DWORD t1 , t2;
	t1 = t2 = GetTickCount();
	BeginBatchDraw();
	while (1)
	{
		if (t2 - t1 > 15)
		{
			HookRock();
			t1 = t2;
		}
		t2 = GetTickCount();
		GameDraw();
		FlushBatchDraw();
		GameControl(10);
		JudgeGrap();
		//防止闪退
	}
	return 0;
}
int distance(Hook hook)
{
	int dis = sqrt((float)(hook.x - hook.endx)*(hook.x - hook.endx) + (hook.y - hook.endy)*(hook.y - hook.endy));
	return dis <= hook.len;
}

大家有兴趣学习C语言/C++的欢迎大家进群一起学习啊,我把进群链接放在下面
Q群