Solidity言語

レッスン4:BattleOfZombie④

オーバーフローについても軽く復習しているよ。storageポインタも登場するが、登場するってだけでまだ深い理解には繋がっていません、、orz…
無理して理解しようとしても身につかないので、するっと入るタイミングを待ち、するっと入る物を先にどんどん入れていこうと思いつつ、続きにうつりたいと思います!

CryptoZombies | イーサリアムでのゲーム開発を学ぶ

それでは開演します!

チャプター8:Attackへ戻ろう

19

さてさて、リファクタリングはできたと思うので、本題に戻ってattack関数の続きに戻りましょう。。

という事で早速テストだ!!

現状がまずどうなっていたか思い出すためにコーディングスペースの写真も添付するぞ!
41
関数の宣言はしてたけど、中身は空っぽですね、、それではテストに戻りましょう。

27

1ではownerOf修飾子をattack関数に加え、確認せよ、との事なので、確認に関してはownerOf修飾子の内容に入っているので、、、

function attack(uint _zombieId, uint _targetId) external ownerOf(_zombieId) {
}

となりますね。※黄色部分が追加になる。

2-aではmyZombieという名のZombie storageを宣言して、それがzombies[_targetId]と等しくなるよう設定せよとのことなので、、、

Zombie storage myZombie = zombies[_zombieId];

となりますね。

2-bでは2-aとほとんど同じ事をしろと言っているので、、

Zombie storage enemyZombie = zombies[_targetId];

となりますね。

3ではuint型のrandを宣言して、randMod関数に引数100を渡したものと同等に設定せよ、との事なので、、

uint rand = randMod(100);

となりますね。

まとめると、、、

function attack(uint _zombieId, uint _targetId) external ownerOf(_zombieId) {
Zombie storage myZombie = zombies[_zombieId];
Zombie storage enemyZombie = zombies[_targetId];
uint rand = randMod(100);
}

となりますね!

ここはそんなに悩まずに進めたのではないでしょうか!!
この調子で次行ってみよう!!

チャプター9:ゾンビの勝敗

19
ここではバトルした勝敗を記録していく方法について解説している、やり方は色々あるとのことだが今回はZombie構造体に追加する、という形で進めていくとのことだ!!

ではテストだ!!

52

おお〜、問題読んでいると項目を追加して、その追加した項目を反映させるべく変更しなさいというような流れができているのがわかりますね。もちろん、いろんな機能を追加した場合は、関連する部分も変えていかないともちろん変わることはないし、むしろ変えないと変になる可能性だってあるのだから、追加する部分と関連する部分っていうのが明確である必要がある、、ので自分でアプリを開発する際にはしっかりとわかりやすくコメントを入れるなりしておく事が重要ですね。

1ではZombie構造体を修正(追加だね)して、さらに2つのプロパティを持つようにせよ!との事なので、aとbまとめてやっちゃうと、、、

uint16 winCount;    //aの場合
uint16 lossCount;
   //bの場合

となりますね!注意書きにもありますが、なぜuint16なのか、はここに書いてますね!

1日に1度だけ攻撃が可能なので、毎日攻撃したら365回攻撃ができる計算になり、uint8だと256回以上になると、0に戻ってしまう現象(オーバーフロー)が発生しエラーの原因となるので、そうならないようにスペースを確保する、という事でuint16になってるのだ!

さすがに179年も生きてこのゲームを続けている人間は存在しないでしょうw

2では_createZombie()の関数定義を変える必要があり、スタートさせる際は0勝0敗としたいので、パラメータを追加するのだが、、このテストの1で追加したプロパティの他にいくつプロパティがあったかを思い出して欲しい。
08
Zombie構造体(stract)には以上のプロパティがある、全部で6つだ!

新規で追加したのはwinCountとlossCountなのだから、追加の仕方はわかるだろうか??
追加する箇所を見てみよう。長くてスクショだと撮れないので、書くぞ!

uint id = zombies.push(Zombie(_name, _dna, 1, uint32(now + cooldownTime))) – 1;となっている。

文字にするとわかりやすいと思うが、今の状況のままだとZombie(名前,DNA,レベル,準備時間)なので、勝ち数と負け数を追加してやらなければいけない。

なので、追加する際に勝ち数は0、負け数は0なので、、

uint id = zombies.push(Zombie(_name, _dna, 1, uint32(now + cooldownTime), 0, 0)) – 1;

となります!

よろしいだろうか??

まとめると、、

Zombie構造体の最後に下記二行を追加する。

uint16 winCount;
uint16 lossCount;

_createZombie関数の「uint id =」からはじまる文章に下記のように追加する。

uint id = zombies.push(Zombie(_name, _dna, 1, uint32(now + cooldownTime), 0, 0)) – 1;

以上となりますね!!

だんだんといろんな箇所を直す事が多くなってきたので、最後のまとめが大変ですわw

午前の部はこれにて終了したいと思います!

昼からはwinCountに追加する方法とlossCountに追加する方法を紹介して、レッスン4の終了をお伝えできると思いますので、午後からも楽しみにしててください!

CryptoZombies | イーサリアムでのゲーム開発を学ぶ

それではまた後ほど!

ABOUT ME
shidayuu
元バンドマンで読書・書評をしている函館在住32歳、しだゆうと申します! このブログでは主に読書した内容を元に、「ヒラメキを発信する」をテーマとして毎日更新しています。 書評をメインに、たまに元バンドマンの知識を発信していきます! あなたの役に立てる記事を書いていきます!