【C#】魔王となってモンスターを産み出し、インスタンスを理解する

#はじめに
プログラムを学び始めると、「インスタンスって何や？」という疑問に必ずぶつかると思う。
よく「実体」と訳され、教則本などでも紹介されるが正直いまいちピンとこないだろう。
また、クッキーの調理にも例えられ、「クラスは型抜きでインスタンスはクッキー」と表現されることも多い。
ある程度慣れてきたら「ああそういうことだったのね」となるが、初学者には正直意味が分からないと思う。僕もそうだった。
この記事では、インスタンスの概念を知るきっかけとして簡単なプログラムを紹介しようと思う。

#設定
あなたは魔王です。
世界を征服するため、まずは部下のモンスターを10匹産み出すことになりました。
しかし、産み出されたモンスターのHPは最初たったの「3」しかありません。
産み出されたモンスターはみんな同じHPなので無個性です。
そこで魔王は、闇の力を使ってモンスターに追加でランダムなHPを与えることにしました。
するとHPが高いモンスター、低いモンスターが産み出され、個性豊かになりました。

#サンプルプログラム
```C#:Program.cs
using System;
using System.Collections.Generic;
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        MonsterGenerator(10);

        ReadKey();
    }

    /// <summary>
    /// モンスターを生成する
    /// </summary>
    /// <param name="number">生成したいモンスターの数</param>
    static void MonsterGenerator(int number)
    {
        Random rd = new Random();
        var MonsterList = new List<Monster>(); //モンスターを格納するリスト

        for (int i = 0; i < number; i++)
        {
            //リストに生成したモンスターのインスタンスを追加
            MonsterList.Add(new Monster());
        }

        int RoopCount = 0; ;
        foreach (var Monster in MonsterList)
        {
            //Randomクラスからランダム値を生成
            //HP値が最大100になるように範囲を設定
            int randomValue = rd.Next(97);
            RoopCount++;

            string AddHP = "";
            for (int i = 1; i <= randomValue; i++)
            {
                //ランダム値の分だけ「|」を生成してAddHPに追加
                AddHP = AddHP + "|";
            }

            //出力
            WriteLine("Moster" + Convert.ToString(RoopCount) + "HP:" +
                      Monster.initHP + AddHP);
        }
    }
}

/// <summary>
/// モンスタークラス　パラメータとして初期HP「|」を3本所持
/// </summary>
class Monster
{
    public string initHP = "|||";
}
```

#解説
MonsterGeneratorメソッドを使ってモンスターを作成する。

```
/// <summary>
/// モンスタークラス　パラメータとして初期HP「|」を3本所持
/// </summary>
class Monster
{
    public string initHP = "|||";
}
```

モンスターの元となるのはMonsterクラスであり、initHP(初期HP)というパラメータが設定されている。
このMonsterクラスがモンスターの「設計図」にあたる。

MonsterGeneratorメソッド内の

```
for (int i = 0; i < number; i++)
{
    //リストに生成したモンスターのインスタンスを追加
    MonsterList.Add(new Monster());
}
```

の部分で、設計図(Monsterクラス)からモンスターを産み出している。
これがいわゆる「インスタンス」である。
「設計図から実際に産み出されたもの」なので、これが「実体」と訳される理由となるのだ。

ただ、これだけではせっかく10匹のモンスターを産み出してもみんなHPが「3」で無個性である。
いうなれば、産み出されたモンスターは全員ただのスライムであるということだ。
スライムだけじゃなくてドラキーとかドラゴンとか、もっと色んな種類のモンスターが欲しくなるだろう。

```
foreach (var Monster in MonsterList)
{
    //Randomクラスからランダム値を生成
    //HP値が最大100になるように範囲を設定
    int randomValue = rd.Next(97);
    RoopCount++;

    string AddHP = "";
    for (int i = 1; i <= randomValue; i++)
    {
        //ランダム値の分だけ「|」を生成してAddHPに追加
        AddHP = AddHP + "|";
    }

    //出力
    WriteLine("Moster" + Convert.ToString(RoopCount) + "HP:" +
              Monster.initHP + AddHP);
}
```

この部分で、リストに格納したスライム達(Monsterクラスのインスタンス)を順番に取り出し、闇の力を使ってランダムに追加のHPを与えている。
そうすることでスライムはHPがたくさん増えてドラゴンになったり、ちょっとしか増えずにドラキーになったりするわけだ。

#出力結果

```
Moster1HP:||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Moster2HP:||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Moster3HP:|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Moster4HP:|||||||||||||||||||||||||||||||||||||||||||||||||||||
Moster5HP:||||||||||||||||||||||||||||||||||||||
Moster6HP:||||||||||||||||||||||
Moster7HP:|||||||||||||||||||||||||||||||
Moster8HP:|||||||||||||
Moster9HP:|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Moster10HP:||||||||||||||||||||
```

いろいろなHPを持ったモンスターが産み出されて、多種多様になった。
世界征服はここから始まる！

#おわりに
今回のプログラムではシンプルにモンスターのHPだけを設定したが、応用すれば攻撃力や防御力など様々なパラメータを与えることも可能になる。
プログラムの世界では、自分が魔王(もしくは神)になったつもりでプログラミングをするとイメージがつきやすいかもしれない。
オブジェクト指向はまだまだ奥が深く、こんな記事ではなかなか理解に到達するには程遠いが、最初の一歩として理解を進めていくきっかけになればと思う。