【ClassPractice08】HPが0未満にならないようにする


今の Player クラスはこうなっています。

public void TakeDamage(int damage)
{
    Hp = Hp - damage;
}

ここで考えてみましょう。

もし HP が 10 のとき、

p1.TakeDamage(50);

としたらどうなるでしょう?

答えは:

Hp = -40

になります。


問題

HPがマイナスって正しいでしょうか?

普通のゲームでは、

HPは0で止まりますよね。

つまり今の設計は

不正な状態を許している

ということです。


解決方法

TakeDamage の中でチェックします。


① プロジェクトを追加する

  1. ExtraPractice.sln を開く
  2. 右クリック → 「追加」→「新しいプロジェクト」
  3. 「コンソール アプリ」
  4. プロジェクト名
ClassPractice08
  1. 作成

② Playerクラスを書く

namespace ClassPractice08
{
    public class Player
    {
        public string Name;
        private int Hp;

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

        public void TakeDamage(int damage)
        {
            Hp = Hp - damage;

            if (Hp < 0)
            {
                Hp = 0;
            }
        }

        public int GetHp()
        {
            return Hp;
        }
    }
}

③ Program.cs

Player p1 = new Player("勇者", 10);

Console.WriteLine(p1.GetHp());

p1.TakeDamage(50);

Console.WriteLine(p1.GetHp());

実行結果

10
0

ここで重要なこと

外からは

p1.Hp = -999;

できません。

さらに、

ダメージを受けても

HPは0未満になりません。

つまり、

不正な状態を作れない設計

になりました。


今日のポイント

✔ privateで守る

✔ メソッドで制御する

✔ 状態を正しく保つ

これが「設計」の基本です。


まとめ

クラスとは単なる箱ではありません。

正しい状態を保つ仕組み

でもあります。

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