摘要:黄金矿工是一款非常经典的游戏。在游戏中,玩家通过不断挖矿,获取金子,最终能够闯入下一关。游戏的玩法主要是通过不断采集地下的黄金和钻石,来得到更高的积分。
在此之前呢,和大家说明一下,因为这是一个比较大的项目了,所以展示所有代码会有些困难,从中还要数据库的参与,所以我裁剪了主要部分的代码,主要目的的让大家明白实现这个项目的难点以及逻辑思路,希望大家可以理解
好了,话不多说,开始了
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;//抓到的物品下标};
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;}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123068.html
前言 未来的公司形态会不断地演化,去中心化,分布式,强化合作,适应变化,直到彻底地被网络化。终极公司的形式将会变得与生物体相同,无缝地集成到生态圈中,成为其中的一个环节。—— 凯文·凯利《失控》 小剧场 小二: 糖糖,我爱你哦~ 糖糖: 你骗人!男人的话能信母猪能上树。 小二: 我可以向全世界证明,我说的是真的~ 糖糖: 那你怎么证明啊~ 小二: 我可以用 区块链 写下 糖糖我爱你哦~...
摘要:在上一节秘猿科技小课堂中,我们已经提到了加密经济网络中底层公链经济模型中的创新点和二级发行政策。长期持币者这部分持币者会把当作类似比特币一样的资产来看待。我们都知道拥有一个比特币,代表着拥有两千一百万分之一的比特币稀缺性。 在上一节秘猿科技小课堂中,我们已经提到了Nervos 加密经济网络中底层公链 CKB 经济模型中的创新点:Nervos DAO 和 二级发行政策。在本文中,我们深入...
摘要:比特币和以太坊像两座最早出现的虚拟城市。下面我们先来分析比特币和以太坊这两个最大加密经济体的经济模型,我们经过研究发现它们在可持续性上都存在各自的问题。状态爆炸比特币与智能合约平台,都 公链的竞争是惨烈的,这个战场里的玩家要想生存下来,既要有绝活,还得没短板。在构建加密经济网络上,在技术实现和共识协议部分,我们为大家分享了CKB 的绝活,即: 与时俱进的 Cell 模型 用 RIS...
摘要:挖矿是什么挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程。而成功抢到记账权的矿工,会获得系统新生的比特币奖励。矿机只执行单一的计算程序,实际是矿工之间比拼算力,拥有较多算力的矿工挖到比特币的概率更大。 第四期 有关挖矿和获取比特币(1) 卡酷少Wechat:13260325501 了解了这么多,大家是否想获取一些属于自己的比特币呢?之前我们在第一...
摘要:如上图,验证过程可以表述为验证者会按照一定的规则向矿工提起挑战,挑战是随机生成的,矿工不能提前获知。三时空证明如图所示,可以理解为矿工一定时间内持续地生成复制证明和接受挑战和验证的过程,并通过这个过程,更新全网存储算力。 欢迎大家来到第七章,经过前章《【Filecoin源码仓库全解析】第六章:如何单机部署多节点集群及矿池设计思路》的介绍,我们分享了如何在单机部署多节点集群的知识以及矿池...
阅读 1834·2021-11-11 16:55
阅读 1965·2021-10-08 10:13
阅读 716·2019-08-30 11:01
阅读 2132·2019-08-29 13:19
阅读 3257·2019-08-28 18:18
阅读 2604·2019-08-26 13:26
阅读 554·2019-08-26 11:40
阅读 1835·2019-08-23 17:17