"NCD.L1.sample--lottery" 合约的游戏方法如何运作?
How play method works at "NCD.L1.sample--lottery" contract?
这是合约回购。 https://github.com/Learn-NEAR/NCD.L1.sample--lottery
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
方法。
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
方法应该只 return 真或假。
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
范围内的随机数。它需要两个参数来定义您的方法的范围。在这种情况下,范围在 1 和 u32.MAX_VALUE 之间。也就是说,就是1和4294967296。
下一行创建一个名为 roll
的变量并将其赋值给 rng.next()
.
那么,next()
是做什么的呢?把 rng
想象成一台只有一个红色大按钮的大机器。当你按下那个红色的大按钮时,它会给你一个这个机器能够生产的数字。意思是,每次你点击那个按钮,它都会给你一个介于 1 和 u32.MAX_VALUE
之间的数字
第三行只是将 roll
记录到控制台。您应该会在控制台中看到类似的内容 roll: 3845432649
最后一行一开始看起来很混乱,但让我们一块一块地看。
在这里,u32.MAX_VALUE * this.chance
我们将这个最大值乘以一个名为 chance
的变量,我们在 Lottery
class.
然后,我们把<f64>
放在这个计算的开始,因为由于0.2.
,结果总是一个浮点数
然后,我们把<32>
放在所有的开头,将那个浮点数转换成无符号整数,因为我们需要将它与roll
进行比较这是一个 无符号整数 。您不能将浮点数与无符号整数进行比较。
最后,如果 roll
小于或等于 <u32>(<f64>u32.MAX_VALUE * this.chance)
则玩家获胜。
这是合约回购。 https://github.com/Learn-NEAR/NCD.L1.sample--lottery
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
方法。
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
方法应该只 return 真或假。
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
范围内的随机数。它需要两个参数来定义您的方法的范围。在这种情况下,范围在 1 和 u32.MAX_VALUE 之间。也就是说,就是1和4294967296。
下一行创建一个名为 roll
的变量并将其赋值给 rng.next()
.
那么,next()
是做什么的呢?把 rng
想象成一台只有一个红色大按钮的大机器。当你按下那个红色的大按钮时,它会给你一个这个机器能够生产的数字。意思是,每次你点击那个按钮,它都会给你一个介于 1 和 u32.MAX_VALUE
第三行只是将 roll
记录到控制台。您应该会在控制台中看到类似的内容 roll: 3845432649
最后一行一开始看起来很混乱,但让我们一块一块地看。
在这里,u32.MAX_VALUE * this.chance
我们将这个最大值乘以一个名为 chance
的变量,我们在 Lottery
class.
然后,我们把<f64>
放在这个计算的开始,因为由于0.2.
然后,我们把<32>
放在所有的开头,将那个浮点数转换成无符号整数,因为我们需要将它与roll
进行比较这是一个 无符号整数 。您不能将浮点数与无符号整数进行比较。
最后,如果 roll
小于或等于 <u32>(<f64>u32.MAX_VALUE * this.chance)
则玩家获胜。