【CryptZombies】レッスン4チャプター11:ゾンビの敗北(elseステートメント)
ゾンビは負けてもレベルダウンしません。単純にlossCountに負けを追加し、さらにクールダウンが始まるため、また攻撃をするのに一日待たなくてはなりません。
elseステートメント
elseステートメントはifステートメントの延長です。
ifステートメントは、ifを使用した時に、条件が一致すればサブステートメントを実行します。
elseステートメントは、ifの条件式が一致しなければ、違うことを実行させたい時に使用します。
<書式>
if (条件式){ サブステートメント1; } else{ サブステートメント2; }
<例>
if(手持ちのお金 <= 50000) { テレビを買う; }else{ テレビは買わない。; }
テストの実行
①elseステートメントを追加せよ。もし我々のゾンビが負けたら、
a. myZombieのlossCountを増やせ。
function attack(uint _zombieId, uint _targetId) external ownerOf(_zombieId) { 中略 if (rand <= attackVictoryProbability) { myZombie.winCount++; myZombie.level++; enemyZombie.lossCount++; feedAndMultiply(_zombieId, enemyZombie.dna, "zombie"); } else { myZombie.lossCount++; } }
b. enemyZombieのwinCountを増やせ。
function attack(uint _zombieId, uint _targetId) external ownerOf(_zombieId) { 中略 if (rand <= attackVictoryProbability) { myZombie.winCount++; myZombie.level++; enemyZombie.lossCount++; feedAndMultiply(_zombieId, enemyZombie.dna, "zombie"); } else { myZombie.lossCount++; enemyZombie.winCount++; } }
②このelseステートメント外で、myZombieにある_triggerCooldown関数を動かすのだ。こうするとゾンビは一日一回だけ攻撃できるようになる。
_triggerCooldown関数は、zombiefeeding.solにあります。
function _triggerCooldown(Zombie storage _zombie) internal { _zombie.readyTime = uint32(now + cooldownTime); }
これは、レッスン3チャプター6で学習したZombie structを引数にとる関数です。
storageポインタをつけているので、関数にゾンビの参照そのもの(この問ではmyZombie)を渡すことが可能です。
function attack(uint _zombieId, uint _targetId) external ownerOf(_zombieId) { 中略 if (rand <= attackVictoryProbability) { myZombie.winCount++; myZombie.level++; enemyZombie.lossCount++; feedAndMultiply(_zombieId, enemyZombie.dna, "zombie"); } else { myZombie.lossCount++; enemyZombie.winCount++; } _triggerCooldown(myZombie); }
お疲れさまでした!
<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network