【学習】List で人数を増やす(変数名を増やさない)

広告

前回の クラスでまとめる では、Player で名前と HP をひとまとまりにしました。

しかし、次の壁にぶつかります。

人数が増えるほど、Player p1, p2, p3, ... と変数が増えそう

という不安です。

今回は 変数名の個数ではなく、データの個数 で人数を増やす方法として List<Player> を使います。


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

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

ファイル先頭に using System.Collections.Generic; が必要です。


違和感の出発点

3人分を、変数で持とうとします。

Player p1 = new Player("勇者A", 100);
Player p2 = new Player("勇者B", 100);
Player p3 = new Player("勇者C", 100);

動きます。でも次を想像してください。

  • 10人にしたい
  • 人数は 実行するときに決めたい

このとき p10 まで書くのは、もう 別のやり方 を探したくなります。


List という「入れ物」

同じ型のデータを、順番付きでたくさん入れられる のが List です。

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

List<Player> は読み方でいうと 「Player の List」 です。


人数は Add で増やす

players.Add(new Player("勇者A", 100));
players.Add(new Player("勇者B", 100));
players.Add(new Player("勇者C", 100));

増えたのは players の中身 であって、変数 p1 p2 p3 を増やしていません。


全員の HP を表示したい(まずは添字で)

foreach は次回にまわして、まず 番地で取り出す やり方だけ見ます。

for (int i = 0; i < players.Count; i++)
{
    Player p = players[i];
    Console.WriteLine($"{p.Name} HP={p.Hp}");
}
  • Count … 今入っている個数
  • players[i] … i 番目の Player

ここで考えてみる

表示1行は for で書けました。

でも、次のような処理を考えるとどうでしょう。

  • 全員にダメージ
  • 全員を回復
  • HP が 0 の人だけスキップ

毎回 for を書くのは悪くない のですが、C# ではもうひとつ 読みやすい書き方 があります。

それが次回の foreach です。


完成コード(例)

using System;
using System.Collections.Generic;

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

        public Player(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("勇者A", 100));
            players.Add(new Player("勇者B", 100));
            players.Add(new Player("勇者C", 100));

            for (int i = 0; i < players.Count; i++)
            {
                Player p = players[i];
                Console.WriteLine($"{p.Name} HP={p.Hp}");
            }
        }
    }
}

プログラムの流れ

List を new する
        ↓
Add で Player を追加(人数が増える)
        ↓
Count と添字 [i] で1人ずつ扱う

重要ポイント

  • 増やしたいのはデータの個数 であって、ソース上の変数名の個数ではない
  • List<Player> は Player の入れ物 と考えると迷いにくい
  • 全員に同じ処理を書きたいときは、次回の foreach が相性よい

最後の問い

全員に 10 ダメージを与えるとしたら、players[0] players[1] players[2] と 3行書く のは気持ちよいですか?


発展アイデア

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

広告