ようやく自家用車全てタイヤ交換完了しました!毎度のことではありますが、これからは機械ではなく十字レンチで作業をしなきゃないので、慣れておかないとね!以前は仕事の合間に会社でやってましたからね、、、
北海道ではまだスタートしませんが、SmartDriveというサービスが試験的に開始するとのことで、早く北海道でもそういった試みがスタートすることを期待して、時を待とうと思います!
車検、保険などの費用が全て込み込みで、月定額で支払いをするリースのようなサービスですが、ポイントがつく新しい仕組みがあったり、今後の自動運転にもつながる気がするサービスなので、私個人としてはとても期待しているサービスの一つです!
今後の動向を見つつ、楽しみにしています!
それではレッスン3最後の更新をしたいと思います!
チャプター12:For ループ
ふむふむふむ、、、なるほど。
前にハードコードという言葉に触れた際に消費税を計算する関数の事について触れた時のことを思い出して欲しい。👉過去記事「レッスン3:Solidityの高度なコンセプト①」
消費税の計算に使うために、消費税という名前の変数を定義して、その中に0.08という数値を代入してから、計算させるというやり方にすると、後からでもこの計算は消費税込みの計算をする際に使う変数であると理解できるような明確な形を取っている。
楽をしようとすると、計算の最後に0.08を掛け算してやれば済むが、後々変更しなくてはならない場合に大いに苦労してしまう事になる。
そのため、1つの工程(消費税と言う名前の変数を定義し、0.08を代入)を増やして、後々のためにわかりやすくしておく、という事をする必要がある。
正直手間ではあるが、後々のことを考えると、トータル的には1つの工程を増やした作業の方が良い事になる。
この消費税の説明のように、先に手間を加える事により、後の手間を省く作業をするという工程の説明ですね。しかもブロックチェーン上に手を加える作業というのは、ガスコストが大いにかかるため、できるだけかからないような仕組みにする必要が大いにある。
プレイヤーであるUserが支払わなければならないコストだからね、、コストが高いゲームなんて、正直需要はないのだから、できるだけコストを低くして、楽しんでもらえるゲームにした方がよい。ということですね。
工程を考えると4つ例としてあげていますね、、
旧オーナーがA,B,C,Dと4体のゾンビを所有しているとします。
新オーナーがAゾンビをもらう場合、新オーナーにAゾンビを追加する事となり、
旧オーナーからAゾンビを削除する必要がでてきます。
しかも旧オーナーはもともと4体のゾンビを所有していたので、Aを削除したら、全部で3体のゾンビの保有に変更しなければならない。その際にはAがいた配列の中にBが入り、Bの配列の中にCが入り、Cの配列の中にはDが入るという、処理が必要になる。もともとDが入っていた配列は空になるため、4のlengthを1減らす工程が必要となる。
結果としては、
新オーナー所有 Aゾンビ
旧オーナー所有 B,C,Dゾンビ
先ほどの例でいうと、旧オーナーからAゾンビをもらう場合、全体的を直す必要があったが、例えばAではなくCゾンビをもらった場合であれば、DゾンビをCの入っていた配列の中に移動するだけの処理になるので、Aが抜けた場合とCが抜けた場合ではガスコストが変わってくる。これも問題だと指摘しています。このままではどのゾンビをもらったらどれくらいのガスコストがかかるのかわからない不透明なゲームとして、ブロックチェーンの特徴に反したゲームになってしまいます、、、それではいけませんね。
view関数・forループを使えば、その問題を解決できるという事なので、これはSolidityでの必須項目ですな!
for (uint i = 1; i <= 10; i++) {}
この読み方としては、
uint型の「i」にまずは1を代入して、iが10以下であるうちは、「i++」でiに1を加算していく、という作業を繰り返す、という事ですね。セミコロン「;」で区切り、「定義;条件;式」という風になっていますね。
if文を利用して、偶数のみ結果を返すという式が入っていますね。
1では、、uint型のcounterに0を設定せよ、とのことなので、
uint counter = 0;
となるのだが、result配列のインデックスをトラックせよ。との文言に関しては、後ほどresult配列のインデックスとして使用するので、読み飛ばしてください。
2では、forループを宣言せよ、との事なので、、
for (uint i = 0; i < zombies.length; i++) {}
となりますね。
3では、ループ内にif文を追加し、判定せよ、との事なので、、
if (zombieToOwner[i] == _owner) {}
となり、4では、正しければresult配列内にゾンビIDを追加せよとの事と、counterを1増やせとの事なので、、、
result[counter] = i;
counter++;
となります。
まとめると、、
uint counter = 0;
for (uint i = 0; i < zombies.length; i++) {
if (zombieToOwner[i] == _owner) {
result[counter] = i;
counter++;
}
}
となりますね。
これでDapp内の全てのゾンビをループさせ、オーナーが一致するかどうかを判定し、result配列にも格納できましたね。
これでこのチャプターも完了しましたね!
次のチャプターはまとめ、と終了の証明となるので、レッスンとしてはここで終了です!
今までやってきたことの内容をまとめてくれた事で、自分がこれまでやった作業がどういう事だったのかっという事がわかりました!
このレッスン3ではガスコストの事が特に重要だと気づかされましたね。
Dappのキモである、Gasに関してはより知識を深める必要があるので、微妙だなと感じている方は再度復習してみることをオススメします。
この写真ではすでに名前を変えてあるが、自分の好きなように名前を変えてくれ!
これにてレッスン3は終了だ!
これをTwitterなりFacebookなりに投稿すると、開発チームが喜ぶので、是非ともやったらツイートしてやってくれ!!
一人でも多くの人がCryptoZombiesにふれ、Solidity言語にふれれる素晴らしい機会なので、見逃すのは損ですからね。
あっ、言っておきますけどステマではありませんからねw
こんなど素人を起用する訳もありませんしw
ただ勝手に、個人的に自分の学びのためにブログにして記録しているだけなので、、
スクショ投稿しまくってるから、もし削除してくださいって言われたら削除しますので、、、
不適切だったら指摘されると思うので、それまでは投稿を続けますw
という事で本日はこれにて終了いたします!
次回からはレッスン4ですので、バトルシステムの構築になりそうですな!!ワクワク!!
ではまた明日!