【学習】ターン制バトルで学ぶオブジェクト指向(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);
}
}Strength が 20 のとき、20 + 20/2(整数の割り算)で 30 になります。
プログラムの流れ
Warrior のインスタンスを new で作る
↓
GetPower() が内部の Strength を読む
↓
攻撃に使う値が返る
↓
表示WinForms / Unity での当たり所
| 要素 | 本回 | WinForms(イメージ) | Unity(イメージ) |
|---|---|---|---|
| 振る舞い | GetPower() |
モデルのメソッド | ダメージ計算メソッド |
| 呼び出し元 | Main |
ボタン Click |
スキル処理・コリジョン |
重要ポイント
- データと、そのデータを使う処理 を同じクラスに置くと読みやすい
- 「攻撃力はいくつ?」は
warrior.GetPower()のように オブジェクトに任せる のがオブジェクト指向の基本姿勢 - まだ 1種類のキャラ でよい。種類が増えたときの話は次回以降