level 属性表示区块宠物的级别。在我们的配对系统中,配对成功的区块宠物会逐渐升级并获得更多的能力。
strength 属性表示区块宠物的体力值,初始为10,最大也为10,最小为0,关于体力值的用处我们会在之后说明。
readyTime 稍微复杂点。我们需要增加一个“间隔周期”,表示区块宠物在两次配对之间必须等待的时间。如果没有它,区块宠物每天可能会配对无数次,这样游戏就太简单了。
为了记录区块宠物在下一次配对前需要等待的时间,我们使用了 Solidity 的时间单位。
时间单位
Solidity 提供了一些自带的时间单位来处理时间,比如变量 now 将返回当前的unix时间戳(自1970年1月1日以来经过的秒数)。比如2020年1月1日的 unix 时间戳是 1577836800。
Solidity 还包含秒(seconds),分钟(minutes),小时(hours),天(days),周(weeks) 和 年(years) 等时间单位。它们都会转换成对应的秒数放入 uint 中。所以 1分钟 就是 60,1小时是 3600(60秒×60分钟),1天是86400(24小时×60分钟×60秒),以此类推。
下面是一些使用时间单位的实用案例:
uint lastUpdated;
// 将‘上次更新时间’ 设置为 ‘现在’
function updateTimestamp() public {
lastUpdated = now;
}
// 如果到上次`updateTimestamp` 超过5分钟,返回 'true'
// 不到5分钟返回 'false'
function fiveMinutesHavePassed() public view returns (bool) {
return (now >= (lastUpdated + 5 minutes));
}有了这些工具,我们可以为区块宠物设定“冷静时间”功能。
实战演习
咱们给区块宠物添3个新功能:level 、 readyTime 和 strength - readyTime是用来实现一个“间隔定时器”,以限制区块宠物配对的频率,strength是区块宠物的体力值,体力值初始为10,最小为0,后面我们会介绍体力值的用途。
咱们给DApp添加一个“间隔周期”的设定,让区块宠物两次配对之间必须等待 1天。
1.为间隔周期声明一个 uint 类型的名为 gapTime 的变量,并将其设置为 1 days。(没错,1 days使用了复数, 否则通不过编译器)
2.为 Pet 结构体 添加三个属性:level(uint类型),readyTime(uint类型)和strength(uint类型)。因为希望同类型数据打成一个包,所以把它们放在结构体的末尾。
3.现在创建一个新的 Pet 结构体时,需要修改 _createPet(),在其中把新旧参数都初始化一下。修改 pets.push 那一行, 添加加3个参数:1(表示当前的 level ),now + gapTime(现在+间隔时间,表示下次允许配对的时间 readyTime)和10(表示当前的初始体力值为10 strength) 。now + gapTime 将等于当前的unix时间戳(以秒为单位)加上”1天“里的秒数 - 这将等于从现在起1天后的unix时间戳。然后我们就比较,看看这个区块宠物的 readyTime是否大于 now,以决定再次启用区块宠物的时机有没有到来。
下一步,我们将讨论如何通过 readyTime 来规范区块宠物的行为。

