CryptZombiesレッスン１(チャプター5~10)の自分なりのまとめ

# はじめに
この記事は私がCryptZombiesを進めていく上で自分なりにまとめたものです。
書いてあることが１００％あってる保証はないです。
前回の記事
https://qiita.com/daichi77/items/6ad0c0244cf3f87b5f4c
**参考にしたサイト**
サイト名: イーサリアム上のDApp開発をゲームを作って学びましょう
URL: https://cryptozombies.io/jp/　
**この記事の問題文と答えについては上の参考にしたサイトから引用しています。**
# チャプター６ 配列
## 用語
**固定長配列**
配列の大きさを決めれる

```
uint[配列の要素数] 配列名；
```
**可変長配列**
決まった大きさがないので無限に入れることができる。

```
uint 配列名；
```
**構造体の配列**
構造体名　配列名；
例(Userという構造体の配列)

```
User[] user;
```
構造体の可変長配列はデータベースのように使える。
コントラクトの構造データを格納するときに便利
**publicの配列**
配列をpublicで宣言すると、solidityが自動的に**getter**メソッドを作成する。
他のコントラクトでも配列を読める（書くことは無理）

```
型　public 配列名;
```
## チャプター６のテスト
**問題文**
1. パブリックなZombie構造体の配列を作り、名前をzombiesとせよ。
**答え**

```Zombie[] public zombies;
```
## チャプター6の感想・まとめ
getterメソッドが完全に理解できていない。
具体的な書き方。どういうときに使うのかは微妙に分からない。
配列の定義とかは大体他の言語と一緒。
**自分なりのgetterメソッドのイメージ**
配列の中身を参照できるメソッド。
他のコントラクトからでも参照できる。

# チャプタ−７　関数の宣言
## 関数の宣言と呼び出し

```
function 関数名(引数の型 _関数名,引数の型 _関数名)　{

}
```
**ポイント**
関数の引数には_をつける
例

```
function people(uint _id, string _name ){

}
```
上の関数の呼び出し方

```
people(1, "daichi77");
```
## チャプター7のテスト
**問題文**
1. createZombieという名前の関数を作成せよ。関数には、_name (string)と、_dna (uint)の、2つのパラメーターを設定せよ。
**答え**

```
function createZombie(string _name, uint _dna){
        
 }
```
##　チャプター7のまとめ・感想
関数の定義も他の言語と大体一緒。
引数の_はグローバル変数と区別するため(必須ではない)
**今回したこと**
createZombie関数の定義
_
# チャプター８　構造体と配列の操作
## 構造体を配列に格納する
1. まず構造体と配列の定義

```
struct Person{
  uint age;
  string name;
}
Person[] public people; 
```

２. 次に新しいPersonを作成し、配列に格納する。

```
//新しいPersonの作成
Person daichi77 = Person(35, "daichi77");
// それを配列に格納する：
people.push(daichi77);
//上記のコードを一行で書いた場合
people.push(Person(35, "daichi77"));
```
**解説**
array.push()は配列の最後に要素を追加する
**例**

```
uint[] array; //配列arrayの定義
array.push(5); //配列に５を追加
array.push(10);// 配列に１０を追加
array.push(15);//配列に１５を追加
//この時点で配列の中身は[5,10.15]となる
```
## チャプター8のテスト
**問題文**
1. 新しいZombieを作れるように関数の中身を埋めて、それを zombies 配列に格納せよ。但し、新しいZombieのname と dnaは関数の引数を使用せよ。
2. 書いたコードを1行で書き直してスッキリさせよ。
答え

```
 zombies.push(Zombie(_name,_dna));
```
## チャプター8のまとめ・感想
array.pushで配列に代入
**今回した作業**
createZombie関数の処理の書き込み
（Zombie構造体を作成(引数をもとに)それを配列zombieにpush）

# チャプター９　private/public関数
solidityでは関数はdefaultで**public**
**public**とは
他のコントラクトからでも呼び出せる。
**private**とは
他のコントラクトから呼び出せない
## private関数の定義

```
function _関数名(引数) private {
}
```
このように書く
**ポイント**
・ 引数の次にprivateと記入  
・ 関数名の最初に_をつける
## チャプター9のテスト
**問題文**
private関数になるように、createZombieを編集せよ。名付けの通例を忘れるなよ！
**答え**

```
function _createZombie(string _name, uint _dna) private{
        zombies.push(Zombie(_name, _dna));
    }
```
チャプター9のまとめ感想
誰でもゾンビを作れるという状況を変えるため
createZombie関数をprivateメソッドにした。

#チャプタ−１０　さらに関数を続けるぞ
## 関数から値を返す時

```
function 関数名(引数) returns (string){
  return 返したい値;
}
```
関数の戻り値を指定する場合戻り値の型をreturns(型)という風に定義する必要がある。
## 関数の修飾子
### view関数
値を変更したり何かを書き込んだりしない読み取り専用の関数には**view**をつける
例

```
function 関数名() public view returns(string){
}
```
### pure関数
引数で受け取ったものしか使えない
読み取りも書き込みもできない
アプリから読み込むこともできない
例

```
function _関数名(uint a, uint　b) private pure returns (uint) {
  return a * b;
}
```
## チャプター１０のテスト
**問題文**
1. _generateRandomDnaという名前のprivate関数を作成せよ。パラメーターは _str(string)という名前で、戻り値をuintに設定せよ。
2. この関数はコントラクトの変数を読み込むことはあるが、編集することはない。そこで修飾子をviewと設定せよ。
3. 関数の中身は空にせよ。中身は後で書き込むぞ。
**答え**

```
function _generateRandomDna(string _str) private view returns(uint){

}
```

## チャプター10のまとめ・感想
viewは読み取り専用
pureは読み取りも書き込みもできない
pureとviewの定義があっているのか分からない。
**今回したこと**
文字列からランダムなDNA番号を生成する_generateRandomDna関数を作った。
コントラクトの変数を読み込むことはあるが書き込みはしないのでviewを定義する

## 次の記事
https://qiita.com/daichi77/items/c494fc23652a476b63ba