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

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 <= attackVictoryProbability){
              myAnimal.winCount++;
              myAnimal.level++;
              enemyAnimal.lossCount++;
                require(_isReady(myAnimal));
               _triggerCooldown(myAnimal);
         }else{
              myAnimal.lossCount++;
              enemyAnimal.winCount++;
                require(_isReady(myAnimal));
              _triggerCooldown(myAnimal);
         }
    
    }

到这里我们就可以完成宠物攻击的功能,大家可以尝试一下。

Guess you like

Origin blog.csdn.net/qq_43537319/article/details/121393204