您当前的位置: 首页 > 

柠檬味小发糕

暂无认证

  • 4浏览

    0关注

    84博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Solidity实现智能合约——宠物战斗(四)

柠檬味小发糕 发布时间:2021-11-18 09:39:43 ,浏览量:4

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             
关注
打赏
1640351950
查看更多评论
0.0345s