【学習】Enemy クラスを追加する(種類が増えても考え方は同じ)

広告

前回 までで、Player の List を foreach で回せるようになりました。

しかし、ゲームやシミュレーションでは次の欲求が出ます。

味方と敵は別の集まりとして持ちたい

今回は Enemy という 別のクラス を1つ増やし、中身の形は似ていても、入れ物を分ける 感覚をつかみます。


ソリューションとプロジェクトを作る

  • テンプレート: コンソール アプリ
  • プロジェクト名ClassAwakening04(任意)

違和感:全部 Player に入れる?

敵まで Player 型で持つと、名前が紛らわしいです。

Player boss = new Player("魔王", 500); // 動くけど、読み手は混乱しやすい

「味方っぽい名前の型」に敵を無理やり載せる のをやめたい、というのが動機で十分です。


Enemy クラスを増やす(形はシンプルでOK)

class Enemy
{
    public string Name;
    public int Hp;

    public Enemy(string name, int hp)
    {
        Name = name;
        Hp = hp;
    }
}

Player と フィールドの形が似ている のは普通です。大切なのは 役割が違うから型を分ける ことです。


入れ物も分ける

List<Player> players = new List<Player>();
List<Enemy> enemies = new List<Enemy>();

foreach も同じ型の話

味方側:

foreach (Player p in players)
{
    Console.WriteLine($"味方 {p.Name} HP={p.Hp}");
}

敵側:

foreach (Enemy e in enemies)
{
    Console.WriteLine($"敵 {e.Name} HP={e.Hp}");
}

ループの形は同じ で、in の後ろの List の型が違うだけです。


ここで考えてみる

「将来、味方と敵を 同じ List に入れたい」という発想もあります。そのときは 共通の型(インターフェースや基底クラス)を使う、という次の段階になります。

今回の段階では、まず分けて書ける ことが目標です。


完成コード(例)

using System;
using System.Collections.Generic;

namespace ClassAwakening04
{
    class Player
    {
        public string Name;
        public int Hp;

        public Player(string name, int hp)
        {
            Name = name;
            Hp = hp;
        }
    }

    class Enemy
    {
        public string Name;
        public int Hp;

        public Enemy(string name, int hp)
        {
            Name = name;
            Hp = hp;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            List<Player> players = new List<Player>();
            players.Add(new Player("勇者", 120));

            List<Enemy> enemies = new List<Enemy>();
            enemies.Add(new Enemy("スライム", 40));
            enemies.Add(new Enemy("ゴブリン", 60));

            foreach (Player p in players)
            {
                Console.WriteLine($"味方 {p.Name} HP={p.Hp}");
            }

            foreach (Enemy e in enemies)
            {
                Console.WriteLine($"敵 {e.Name} HP={e.Hp}");
            }
        }
    }
}

プログラムの流れ

役割ごとに class を分ける
        ↓
役割ごとに List を分ける
        ↓
foreach は「その List の型」に合わせて書く

重要ポイント

  • クラスを分ける理由 は「処理の都合」だけでなく 読み手の頭の中を整理する ためでもある
  • 形が似たクラスが複数あってよい(無理に1つに統合しない)
  • 「同じ List に入れたい」は発展テーマとして先に残せる

最後の問い

敵が残り HP によって 攻撃したり逃げたり したくなったら、条件分岐が増えます。状態が動くプログラム全体を回したくなったら、次は コンソールでミニゲーム へ。


発展アイデア

訪問数 2 回, 今日の訪問数 2回

広告