黄金矿工—小游戏

黄金矿工—小游戏黄金矿工一、游戏思路游戏的核心是如何让钩子动起来、怎么伸缩、怎么抓物品3个部分

黄金矿工(使用easy-x图形库制作)

一、游戏思路

游戏的核心是如何让钩子动起来、怎么伸缩、怎么抓物品3个部分。

1.钩子的转动

钩子的转动可以根据角度的变化来决定,我们让起始坐标不变,让钩子的结尾坐标变化,在限定角度的范围即可,求结尾坐标思路过程如下,实现代码在后面

在这里插入图片描述

2.钩子的伸缩

钩子的伸缩:分为两部分:伸和缩。当接收到空格时,伸长,遇到边界与物品时要缩回来。
不管伸长还是缩短都与钩子的结尾坐标有关(反正钩子的起始坐标不会变),当按下空格时,要以一定的速度去伸长或者缩回,要注意,当钩子伸长与缩短时,角度要保持不变,所以要设置钩子的状态。实现代码在后面
在这里插入图片描述

3.物品的抓取

抓取是要判断钩子的结尾坐标有没有,在物品坐标的指定范围内,当在该范围时,将物品坐标跟着钩子的结尾坐标走(即物品坐标等于钩子的结尾坐标)。
在这里插入图片描述

在这里插入图片描述

二、游戏代码

头文件

#pragma once
#define Stuff_Max 8 //物品数量
#define PI 3.1426926
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <cmath>
#include <time.h>
IMAGE img[12];       //定义12张图片
using namespace std;
enum state
{ 
   
	extend,//伸长
	shorten,//缩短
	nomal,//正常
	left,//左
	right,//右
};
typedef struct _Role//角色
{ 
   
	int x;//位置
	int y;
	int width;//角色宽度
	int height;//角色高度
	byte w :1;//角色上,下控制
}Role;
typedef struct _Hook//钩子
{ 
   
	double x;//钩子开始坐标
	double y;
	double enx;//钩子结束坐标
	double endy;
	double angle;//钩子转动角度
	double vx;   //速度分量(伸长是以什么速度增长)
	double vy;
	int state;//状态
	int dir;//方向
	double len;//钩子长度
	int index;//抓到物品号数
}Hook;
typedef struct _Stuff//物品
{ 
   
	int size;      //物品大小
	double place_x;//位置指标
	double plaxe_y;
	int type;      //类型
	bool exsit;	   //是否存在
	int worth;     //物品价值
}stf;
Role* role = (Role*)calloc(1, sizeof(Role));//创建角色
Hook* hook = (Hook*)calloc(1, sizeof(Hook));//创建钩子
stf stuf[Stuff_Max];//创建物品
int score = 0;//统计分数
void init_IMAGE();//加载图片
void chartlet();//贴图
void init_role();//角色初始化
void init_stste();//钩子初始化
void swing(double angle);//钩子的摆动
void flex(double speed);//钩子的伸缩
void grab();//抓取物品的判断

main函数

#include "GoldMiner.h"


void init_IMAGE()//加载图片
{ 
   
	for (int i = 0; i < 10; i++)
	{ 
   
		char str[1020] = "";
		sprintf_s(str, "./%d.jpg", i);
		loadimage(img+i,str);
	}
	loadimage(img + 10, "./bk.jpg", getwidth(), getheight());
}
void chartlet()//贴图
{ 
   
	cleardevice();
	putimage(0, 120, img + 10);//背景
	switch ((role->w)+1)//角色上下转动
	{ 
   
	case 1:
		putimage(role->x, role->y, img + 6);
		putimage(role->x, role->y, img + 7);
		break;
	case 2:
		putimage(role->x, role->y, img + 4);
		putimage(role->x, role->y, img + 5);
		break;
	}
	//钩子的绘制
	setlinecolor(YELLOW);
	setlinestyle(PS_SOLID,5);
	line((int)hook->x, (int)hook->y, (int)hook->enx, (int)hook->endy);
	solidcircle((int)hook->enx, (int)hook->endy, 5);
	//物品的绘制
	for (int i = 0; i < Stuff_Max; i++)
	{ 
   
		if (stuf[i].exsit == true)
		{ 
   
			switch (stuf[i].type)
			{ 
   
			case 0://金块
				putimage((int)stuf[i].place_x, (int)stuf[i].plaxe_y, img, SRCAND);
				putimage((int)stuf[i].place_x, (int)stuf[i].plaxe_y, img + 1, SRCPAINT);
				stuf[i].worth=5;//物品价值
				break;
			case 1://钱袋
				putimage((int)stuf[i].place_x, (int)stuf[i].plaxe_y, img + 2, SRCAND);
				putimage((int)stuf[i].place_x, (int)stuf[i].plaxe_y, img + 3, SRCPAINT);
				stuf[i].worth = 10;
				break;
			case 2://石头
				putimage((int)stuf[i].place_x, (int)stuf[i].plaxe_y, img + 8, SRCAND);
				putimage((int)stuf[i].place_x, (int)stuf[i].plaxe_y, img + 9, SRCPAINT);
				stuf[i].worth = 1;
				break;
			}
		}
		
	}
	//分数绘制
	char str[30] = "";
	sprintf(str, "分数:%d", score);
	settextcolor(WHITE);
	setbkmode(TRANSPARENT);
	settextstyle(40, 0, "楷体");
	outtextxy(20, 20, str);
}
void init_role()//角色初始化
{ 
   
	role->height = 120;
	role->width = 140;
	role->x = (getwidth() - role->width)/2;//居中
	role->y = 0;
	role->w= 0;
}
bool size_line(Hook* hook)//求当前线的长度
{ 
   
	double size= sqrt((hook->enx - hook->x)*(hook->enx - hook->x) + (hook->endy - hook->y)*(hook->endy - hook->y));
	return size <= hook->len;
}
void init_stste()//初始化钩子
{ 
   
	hook->len = 50;
	hook->x = getwidth() / 2 -25;
	hook->y = role->height / 2 +35;
	hook->enx = hook->x;
	hook->endy = hook->y + hook->len;
	hook->angle = 0;
	hook->state = nomal;
	hook->vx = 0;
	hook->vy = 0;
	hook->index = -1;
}
void swing(int angle)//摆动
{ 
   
	if (hook->state == nomal)//正常状态下时转动,伸缩时不转
	{ 
   
		hook->endy = cos(PI / 180 * hook->angle)*hook->len + hook->y;
		hook->enx = sin(PI / 180 * hook->angle)*hook->len + hook->x;
		if (hook->angle > 80)
		{ 
   
			hook->dir = left;
		}
		else if (hook->angle< -80)
		{ 
   
			hook->dir = right;
		}

		if (hook->dir == right)
		{ 
   
			hook->angle += angle ;
		}
		else
		{ 
   
			hook->angle -= angle ;
		}
	}
}
void stuff()//物品
{ 
   
	//用随机数生成物品位置
	for (int i = 0; i < Stuff_Max; i++)
	{ 
   
		stuf[i].size = 50;
		stuf[i].place_x = rand() % (getwidth() - stuf[i].size);
		stuf[i].plaxe_y = rand() % (getheight() -150 ) + 150;	
		stuf[i].type = rand() % 3;
		stuf[i].exsit = true;
	}
}
void flex(int speed)//伸缩
{ 
   
	if ( GetAsyncKeyState(VK_SPACE ))//伸长
	{ 
   
		
		hook->state = extend;
		hook->vy = cos(PI / 180 * hook->angle)*speed;
		hook->vx = sin(PI / 180 * hook->angle)*speed;
	}
	if (hook->state == extend)
	{ 
   
		hook->endy += hook->vy;
		hook->enx += hook->vx;
		role->w++;
	}
	else if (hook->state == shorten)
	{ 
   
		hook->endy -= hook->vy;
		hook->enx -= hook->vx;
		if (size_line(hook))
		{ 
   
			hook->state = nomal;
		}
		role->w++;//角色上下转动
	}
	//边界
	if (( hook->enx >= getwidth() || hook->enx <= 0 ) || ( hook->endy >= getheight() || hook->endy <= 0 ))
	{ 
   
		hook->state = shorten;
	}
}
void grab()//抓取
{ 
   
	for (int i = 0; i < Stuff_Max; i++)
	{ 
   
		//根据图片大小来决定在哪个范围抓取
		if (stuf[i].type ==0 )
		{ 
   
			if ((stuf[i].exsit == true && hook->enx < (stuf[i].place_x + 100) && hook->enx >stuf[i].place_x+80) && (hook->endy < (stuf[i].plaxe_y + 90) && hook->endy > stuf[i].plaxe_y+70))
			{ 
   
				hook->index = i;
				break;
			}
		}
		if (stuf[i].type == 1||stuf[i].type==2 )
		{ 
   
			if ((stuf[i].exsit == true && hook->enx < (stuf[i].place_x + 47) && hook->enx > stuf[i].place_x + 27) && (hook->endy < (stuf[i].plaxe_y +43) && hook->endy > stuf[i].plaxe_y + 23))
			{ 
   
				hook->index = i;
				break;
			}
		}
	}
	if (hook->index != -1)
	{ 
   
		hook->state = shorten;//缩短
		stuf[hook->index].place_x = hook->enx-30;
		stuf[hook->index].plaxe_y = hook->endy-30;
		
		if (size_line(hook))
		{ 
   
			score += stuf[hook->index].worth;//统计分数
			stuf[hook->index].exsit = false;
			hook->index = -1;
			hook->state = nomal;//缩短
		}
	}
}
int main()
{ 
   
	srand((unsigned)time(NULL));
	initgraph(1080, 640);
	init_role();//初始化角色
	init_stste();//初始化钩子
	stuff();//物品
	init_IMAGE();//加载图片
	BeginBatchDraw();//双缓冲
	while (1)
	{ 
   
		chartlet();//贴图
		FlushBatchDraw();//双缓冲
		flex(1);//伸缩
		swing(1);//摆动
		grab();//抓取
	}
	while (1);
	return 0;
}

今天的文章黄金矿工—小游戏分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/67727.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注