学習記事一覧 · ターン制OOP入門

【学習】ターン制バトルで学ぶオブジェクト指向(2)行動を持たせる 〜メソッドと「データ+処理」〜

第1回では Player名前・HP・攻撃力 というデータを持たせました。

しかしゲームでは、「このキャラなら攻撃力はこう計算する」 のように、データに紐づいた処理も一緒に置きたくなります。

クラスは「データの箱」だけでなく、「データ+処理のまとまり」

として使うのが自然です。

今回は 戦士(Warrior) を例に、メソッド で振る舞いを足します。


今回の最小ゴール

  • Warrior力(Strength) を持ち、GetPower() で攻撃に使う値を返す
  • Main から GetPower() を呼び、コンソールに攻撃力を表示する

前回からの差分

  • 第1回の Player(データ中心)に対し、今回は メソッド で「振る舞い」を追加する
  • クラス名を Warrior に変え、攻撃力の計算をクラスの中に閉じる

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

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

第1回のプロジェクトを流用して差し替えても構いません。


Warrior クラス(データ+処理)

public class Warrior
{
    public string Name { get; set; }
    public int Hp { get; set; }
    public int Strength { get; set; }

    public Warrior(string name, int hp, int strength)
    {
        Name = name;
        Hp = hp;
        Strength = strength;
    }

    public int GetPower()
    {
        return Strength + Strength / 2;
    }
}

GetPower()この戦士の Strength を使って 値を決めます。外から Strength を読んで計算するのではなく、「攻撃に使う力はオブジェクトに聞く」 形にします。


Main から使う

internal class Program
{
    private static void Main(string[] args)
    {
        Warrior warrior = new Warrior("せんし", 100, 20);
        int power = warrior.GetPower();

        Console.WriteLine(warrior.Name + "の攻撃力:" + power);
    }
}

Strength20 のとき、20 + 20/2(整数の割り算)で 30 になります。


プログラムの流れ

Warrior のインスタンスを new で作る

GetPower() が内部の Strength を読む

攻撃に使う値が返る

表示

WinForms / Unity での当たり所

要素 本回 WinForms(イメージ) Unity(イメージ)
振る舞い GetPower() モデルのメソッド ダメージ計算メソッド
呼び出し元 Main ボタン Click スキル処理・コリジョン

重要ポイント

  • データと、そのデータを使う処理 を同じクラスに置くと読みやすい
  • 「攻撃力はいくつ?」は warrior.GetPower() のように オブジェクトに任せる のがオブジェクト指向の基本姿勢
  • まだ 1種類のキャラ でよい。種類が増えたときの話は次回以降

次に読む