游戏方法如何在合同"NCD.L1.sample--lottery"运作?



这是合约回购。 https://github.com/Learn-NEAR/NCD.L1.sample--lottery

我不明白这里的玩法 https://github.com/Learn-NEAR/NCD.L1.sample--lottery/blob/2bd11bc1092004409e32b75736f78adee821f35b/src/lottery/assembly/lottery.ts#L11-L16

play(): bool {
const rng = new RNG<u32>(1, u32.MAX_VALUE);
const roll = rng.next();
logging.log("roll: " + roll.toString());
return roll <= <u32>(<f64>u32.MAX_VALUE * this.chance);
}

我不明白获胜过程,但我确信它隐藏在这种方法中。那么有人可以详细解释一下这种play方法的工作原理吗?

要了解获胜过程,我们应该查看合约中lottery.ts文件中的play方法。

https://github.com/Learn-NEAR/NCD.L1.sample--lottery/blob/2bd11bc1092004409e32b75736f78adee821f35b/src/lottery/assembly/lottery.ts#L11-L16

play(): bool {
const rng = new RNG<u32>(1, u32.MAX_VALUE);
const roll = rng.next();
logging.log("roll: " + roll.toString());
return roll <= <u32>(<f64>u32.MAX_VALUE * this.chance);
}

在阅读此代码之前,我们应该了解几件事。

  • 布尔
  • U32
  • F64
  • RNG<32>

bool意味着我们的play方法应该只返回 true 或 false。

u32 是一个 32位无符号整数。它是使用 32 位存储的正整数。

U8 的最大值为 255。 U16 的最大值为 65535。 U32 的最大值为 4294967295。 U64 的最大值为 18446744073709551615。因此,这些无符号整数不能是负值。

f64是一个具有小数位的数字。此类型可以表示各种十进制数,如 3.5、27、-113.75、0.0078125、34359738368、0、-1。因此,与整数类型(如 i32)不同,浮点类型也可以表示非整数。

RNG代表Random Number Generator.它基本上给你一个u32范围内的随机数 .它需要两个参数来定义方法的范围。在这种情况下,范围介于1u32 之间。MAX_VALUE。换句话说,它是14294967296。 下一行创建一个名为roll的变量,并将其分配给rng.next()的值。

那么,next()是做什么的呢?rng想象成一台大机器,上面只有一个大的红色按钮。当你点击那个红色的大按钮时,它会给你一个这台机器能够生产的数字。意思是,每次你点击那个按钮时,它都会给你一个介于1u32 之间的数字。MAX_VALUE

第三行只是将roll记录到控制台中。您应该在控制台中看到类似的东西roll: 3845432649

最后一行在开头看起来令人困惑,但让我们逐个看一下。

在这里,u32.MAX_VALUE * this.chance我们将这个最大值乘以一个名为chance的变量,我们在Lottery类中将其定义为0.2

然后,我们在此计算的开头放置<f64>,因为结果始终是0.2的浮点数。

然后,我们将<32>放在开头,将该浮点数转换为无符号整数,因为我们需要将其与无符号整数roll进行比较。不能将浮点数与无符号整数进行比较。

最后,如果roll小于或等于<u32>(<f64>u32.MAX_VALUE * this.chance),则玩家获胜。

相关内容

  • 没有找到相关文章

最新更新