区块链应用:NAS星云链DAPP开发之宠物养成游戏

3,219 阅读7分钟

NAS星云链DAPP开发之宠物养成游戏

本文同步自wing的地方酒馆

上一篇文章中,我们开发了自己第一个demo级别的DAPP,并且获得了NAS官方的奖励。现在提交随着提交的应用越来越多,审核力度也在加大,所以demo级的应用已经很难以通过了。

于是和小伙伴一起开发一个区块链游戏,来帮助自己更好的学习区块链。

这次的想法是做一个宠物养成游戏,已经发布的地址如下:鸡神养成记http://inspoy.cc/dapp/pet/,欢迎大家来玩耍~,可以随便点一点,一起分得奖池NAS的奖励。

如果你没有NAS,那么在评论发出你的钱包地址,我会给你转入0.011NAS(足够养鸡并购买双倍积分卡),帮助你来体验区块链和部署自己的合约。

需求

列了一下主要的需求有如下几点:

  • 宠物拥有饱食度,可以喂养宠物。
  • 宠物拥有心情值,可以陪宠物玩耍。
  • 宠物拥有经验值,经验值满了可以成神。
  • 系统拥有积分系统,玩耍,成神,喂食都会获得一定积分。
  • 宠物如果饱食度过低,则会死亡,死亡扣除积分。
  • 系统拥有排行榜,排行榜根据积分来排行。
  • 系统拥有双倍积分卡,购买双倍积分卡的币会进入奖池,满足一定额度会分给排行榜前十。

本来想做个最简单的宠物养成游戏,没想到需求也这么复杂。。 先来看看最后的成品吧~

哈哈,因为我跟朋友都不是没接触过前端,所以界面比较简单,也比较丑,不要笑~

需求分析完了,来说说分工,朋友负责的是前端,因为没有接触过,所以跟上次一样,选择bootstrap+jQuery。合约就是js。

使用教程

鉴于可能有小伙伴不太懂怎么使用,这里写一下简单的教程。 首先安装一个chrome的钱包插件: github.com/ChengOrange…

  • 点击下载zip包,或者clone下来。
  • 打开chrome菜单的更多工具--扩展程序。
  • 打开右上角的开发者模式。
  • 点击加载已解压的差距,将下载的导入。

这个时候你就可以看到插件已经下好了~ 打开是这样的:

点击新建钱包,保存你的钱包文件和密码。生成的n1xxxxxx.json 文件名(不带json)代表你的钱包地址。

这个时候,打开鸡神养成记,输入你的钱包地址,点击登陆,会弹出这样的窗口:

点击生成交易,即可获得一只你的小鸡了~~

有时候提示Nonce必须大于什么什么,这种是你手点太快了,关闭这个插件窗口重新点击登陆即可。

另外登陆需要消耗一些GAS,一般是1000000, 1NAS = 10^18 gas,所以你只需要有0.01个nas就可以交易很多次。

如果你没有NAS,那么在评论发出你的钱包地址,我会给你转入0.011NAS(足够养鸡并购买双倍积分卡),帮助你来体验区块链和部署自己的合约。

之后,只需要对宠物进行喂食,玩耍,当分数处于排行榜内,且购买双倍积分卡的金额大于0.5NAS的时候,则会向排行榜分发这些NAS哦~~

实现

数据结构

首先思考怎么存储数据,这里因为NAS本身提供map类型的存储,所以定义一个map类型存储空间,用来存储游戏数据,key是用户地址,value是自定义类型的游戏数据。

下面思考游戏数据都包含什么东西,因为宠物有心情、饱食度、经验等属性,所以这些不可少。另外玩耍和喂食都要做出时间限制,防止无限喂食,所以应该包含上次喂食和玩耍时间。包括分数、成神数、双倍时间数、等等信息:

数据结构定义好了。接下来完成各种行为。

查询数据

首先肯定是领养一只宠物,在区块链中读取有没有游戏数据,如果没有游戏数据,则生成一个数据:

这里有一些问题就是我目前不知道如何定时执行代码,所以我只能在查询宠物信息的时候,弄一个登陆状态,来在查询中储存游戏数据(比如饱食度每分钟会下降),所以第一次查询的时候,消耗gas,就会有一种饱食度事实在下降的效果,实际上是用户登陆的时候,动态根据时间计算的。这里先完成饱食度下降的计算,如果下降超过一定额度,则小鸡死亡:

其次更新一下游戏状态,也就是存储数据,并且每天12点会重置心情值:

关于saveGameData方法,其实就是将游戏数据存储在map类型里:

行为

玩耍

接下来,需要完成一系列行为,首先是玩耍。 玩耍主要有几点,第一点是玩耍的间隔判断,所以这里根据玩耍间隔和上次玩耍时间来计算。 另外如果处于双倍积分卡内,则获得的积分将会*2,心情的最大值为1.

心情每次增长有一定比例。

投食

投食和玩耍差不多,主要区别在于喂食的时候,小鸡可以成神,这里判断一下经验值即可:

购买双倍积分卡

这里双倍积分卡其实也是一个时间属性,用户付费以后,增加对应时间即可。需要注意的是,需要判断一下用户的支付数量,如果不对则拒绝交易。另外在合约内部无法得知合约现在的余额,所以我们需要自己额外维护。这里NAS官方使用的BigNumber库来计算大数。

每次接收到付费的时候判断奖池余额是否大于0.5NAS,如果大于,则向前十分钱,并且清空排行榜数据。

获取排行榜数据

这里有一个特别的地方就是,因为官方map不提供遍历的功能。所以只能另外寸一个map,来存放index对应的用户地址,需要遍历的时候,先从地址map里面获取地址,再从数据map里面取出来数据:

这样完整的合约代码就完成了(吐槽一句,真的不好调试,有一点点小修改就需要重新部署~)

接下来是前端部分

前端部分其实核心就是根据sdk来调用区块的数据。 首先封装两个方法,一个是需要支付的,写入数据函数。一个是不需要支付的查询数据函数:

页面初始化的时候,对ui进行显隐控制,并且只查询游戏在线人数:

登陆

点击登陆按钮,查询宠物信息数据,并且登陆完成后,向合约轮训来事实刷新游戏数据:

投食&&玩耍

点击对应的按钮,进行对应的接口调用。

投食按钮:

玩耍按钮:

购买双倍积分卡:

这样,基本的操作界面已经有了: 这里有基本的玩耍介绍:

本文也就到此结束啦~ 人生中第二个DAPP完成了。

如果你觉得对你有帮助,可以点赞,分享~

并且十分建议你来玩《鸡神养成记》,可以获得NAS哦~ 是兄弟,就来砍我吧~ 鸡神养成记地址:http://inspoy.cc/dapp/pet/

如果你没有NAS,那么在评论发出你的钱包地址,我会给你转入0.011NAS(足够养鸡并购买双倍积分卡),帮助你来体验区块链和部署自己的合约。

欢迎加入qq群一起讨论区块链技术: 615075629