Solidity实现智能合约——宠物战斗(四)
在这一节当中我们会实现宠物战斗的功能,我们可以选择自己的宠物和别人的宠物进行战斗,有70%的概率自己的宠物胜利,另外给宠物新加俩个属性winCount(uint16),lossCount(uint16)。用来记录战斗胜利和失败的次数,我们可以设置当我们的宠物战斗胜利等级+1,失败则不变。
首先在AnimalFactory.sol文件当中为我们的Animal结构体添加俩个新属性
struct Animal{
string name;
uint dna;
uint32 level;
uint32 readyTime;
uint16 winCount;
uint16 lossCount;
}
我们先来定义一个AnimalAttack.sol文件,创建AnimalAttack合约,让其继承我们的AnimalHelper合约,并导入AnimalHelper.sol文件。
pragma solidity ^0.4.19;
import "./AnimalHelper.sol";
contract AnimalAttack is AnimalHelper {
}
在合约内定义一个uint的randNonce ,将其值设置为 0。
建立一个函数,命名为 randMod (random-modulus)。它将作为internal 函数,传入一个名为 _modulus的 uint,并 returns 一个 uint。这个函数首先将为 randNonce加一, (使用 randNonce++ 语句)。最后,它应该 (在一行代码中) 计算 now, msg.sender, 以及 randNonce 的 keccak256 哈希值并转换为 uint—— 最后 return % _modulus 的值。
uint randNonce = 0;
function randMod(uint _modulus) internal returns(uint){
randNonce++;
return uint(keccak256(now,msg.sender,randNonce)) % _modulus;
}
// 这个方法首先拿到 now 的时间戳、 msg.sender、 以及一个自增数 nonce (一个仅会被使用一次的数,这样我们就不会对相同的输入值调用一次以上哈希函数了)。
// 然后利用 keccak 把输入的值转变为一个哈希值, 再将哈希值转换为 uint, 然后利用 % 100 来取最后两位, 就生成了一个0到100之间随机数了。
你选择一个自己的宠物,然后选择一个对手的宠物去攻击。如果你是攻击方,你将有70%的几率获胜,防守方将有30%的几率获胜。所有的宠物(攻守双方)都将有一个 winCount 和一个 lossCount,这两个值都将根据战斗结果增长。如果攻击方失败,除了失败次数将加一外,什么都不会发生。无论输赢,当前宠物的冷却时间都将被激活。
uint attackVictoryProbability = 70;
function attack(uint _AnimalId,uint _targetId) external ownerOf(_AnimalId){
Animal storage myAnimal = animals[_AnimalId];
Animal storage enemyAnimal = animals[_targetId];
uint rand = randMod(100);
if(rand
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?