【学習】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回


ディスカッション
コメント一覧
まだ、コメントがありません