黄金矿工—小游戏

黄金矿工(使用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;
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平