RPGのキャラクターを例にしたオブジェクト指向の説明と実装

2025年1月8日


1. オブジェクト指向って何?

オブジェクト指向は、「現実世界のモノをプログラムで表現する考え方」 です。

例: RPGのキャラクター

  • キャラクターの特徴:
    • 名前、HP(ヒットポイント)、MP(マジックポイント)、職業など。
  • キャラクターの行動:
    • 攻撃する、回復するなど。

これをプログラムで表現するときに、クラスオブジェクト を使います。


2. ソリューションとプロジェクトの作成方法

  1. Visual Studio を起動
    • 「新しいプロジェクトの作成」 を選択。
  2. プロジェクトテンプレートを選択
    • 「コンソールアプリ」 を選びます。
  3. ソリューション名とプロジェクト名を設定
    • ソリューション名: RPGExample
    • プロジェクト名: RPGExample
  4. プロジェクトが作成される
    • プロジェクトの初期状態では Program.cs ファイルが生成されています。

3. クラスの追加方法

  1. プロジェクト内に新しいクラスファイルを作成
    • ソリューションエクスプローラーでプロジェクト名(RPGExample)を右クリック。
      • 「追加」「新しい項目」 を選択。
      • 「クラス」 を選び、名前を Character.cs に設定して追加。
  2. クラスファイルにコードを記述
    • 自動生成されたテンプレートコードを削除し、以下のコードを記述します。

4. キャラクタークラスのコード(Character.cs

using System;

namespace RPGExample
{
    // キャラクタークラス
    class Character
    {
        public string Name; // 名前
        public int HP;      // ヒットポイント
        public int MP;      // マジックポイント
        public string Job;  // 職業

        // 攻撃する
        public void Attack()
        {
            Console.WriteLine($"{Name}は攻撃した!");
        }

        // 回復する
        public void Heal()
        {
            Console.WriteLine($"{Name}は回復魔法を使った!");
        }
    }
}

5. メインプログラムのコード(Program.cs

using System;

namespace RPGExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 勇者「ヒロト」を作成
            Character hero = new Character();
            hero.Name = "ヒロト";
            hero.HP = 100;
            hero.MP = 20;
            hero.Job = "勇者";

            // 魔法使い「リナ」を作成
            Character mage = new Character();
            mage.Name = "リナ";
            mage.HP = 50;
            mage.MP = 80;
            mage.Job = "魔法使い";

            // キャラクターの情報を表示
            Console.WriteLine($"名前: {hero.Name}, 職業: {hero.Job}, HP: {hero.HP}, MP: {hero.MP}");
            Console.WriteLine($"名前: {mage.Name}, 職業: {mage.Job}, HP: {mage.HP}, MP: {mage.MP}");

            // キャラクターの行動
            hero.Attack();
            mage.Heal();
        }
    }
}

6. プログラムの実行結果

名前: ヒロト, 職業: 勇者, HP: 100, MP: 20
名前: リナ, 職業: 魔法使い, HP: 50, MP: 80
ヒロトは攻撃した!
リナは回復魔法を使った!

7. クラスを追加して拡張する

次に、Warrior(戦士)やMage(魔法使い)などのクラスを追加して、具体的なキャラクターを作ります。

手順

  1. 新しいクラスファイルを追加
    • プロジェクト内に Warrior.cs を作成します。
  2. 戦士クラスのコード(Warrior.cs
namespace RPGExample
{
    class Warrior : Character
    {
        public void UseSword()
        {
            Console.WriteLine($"{Name}は剣で攻撃した!");
        }
    }
}

8. メインプログラムに戦士を追加

// 戦士「ゴウ」を作成
Warrior warrior = new Warrior();
warrior.Name = "ゴウ";
warrior.HP = 120;
warrior.MP = 10;
warrior.Job = "戦士";

// 戦士の情報を表示
Console.WriteLine($"名前: {warrior.Name}, 職業: {warrior.Job}, HP: {warrior.HP}, MP: {warrior.MP}");

// 戦士の行動
warrior.Attack();
warrior.UseSword();

9. 拡張プログラムの実行結果

名前: ゴウ, 職業: 戦士, HP: 120, MP: 10
ゴウは攻撃した!
ゴウは剣で攻撃した!

10. プログラムの整理

  • Character.cs: 基本キャラクターの共通部分を定義。
  • Warrior.cs: 戦士特有の行動(剣を振る)を追加。
  • Mage.cs: 魔法使い特有の行動(魔法を唱える)を追加(省略可)。
  • Program.cs: ゲームのメイン処理。

11. 練習問題

やってみよう!

  1. 新しいクラスを追加
    • 弓使いや盗賊などのクラスを作成してみましょう。
  2. キャラクターの属性を増やす
    • レベルや経験値(EXP)を追加し、行動ごとに経験値を増やす仕組みを作りましょう。
  3. 戦闘システムを作成
    • 2人のキャラクターが戦い、HP が減る仕組みをプログラムしてみましょう。

この構成なら、ソリューションの作成からプログラムの実装、拡張方法までを一通り体験でき、オブジェクト指向をしっかり学べます!

以下は、11の練習問題に対する模範解答です。練習問題を順番に解きながら、コードを発展させていきます。


1. 弓使い(Archer)クラスの作成

Archer.cs ファイルを追加して、以下のように記述します。

namespace RPGExample
{
    class Archer : Character
    {
        public void ShootArrow()
        {
            Console.WriteLine($"{Name}は矢を放った!");
        }
    }
}

メインプログラムで使用する例:

// 弓使い「エリー」を作成
Archer archer = new Archer();
archer.Name = "エリー";
archer.HP = 80;
archer.MP = 30;
archer.Job = "弓使い";

// 弓使いの情報を表示
Console.WriteLine($"名前: {archer.Name}, 職業: {archer.Job}, HP: {archer.HP}, MP: {archer.MP}");

// 弓使いの行動
archer.Attack();
archer.ShootArrow();

2. 属性の拡張(レベルと経験値の追加)

Character.cs に属性を追加

class Character
{
    public string Name; // 名前
    public int HP;      // ヒットポイント
    public int MP;      // マジックポイント
    public string Job;  // 職業
    public int Level = 1; // レベル
    public int EXP = 0;   // 経験値

    // 経験値を増やすメソッド
    public void GainExperience(int amount)
    {
        EXP += amount;
        Console.WriteLine($"{Name}は{amount}の経験値を得た!");

        // レベルアップ判定
        if (EXP >= 100)
        {
            LevelUp();
        }
    }

    // レベルアップ処理
    private void LevelUp()
    {
        EXP -= 100;
        Level++;
        HP += 10; // レベルアップでHP増加
        MP += 5;  // レベルアップでMP増加
        Console.WriteLine($"{Name}はレベル{Level}に上がった!");
    }
}

メインプログラムで使用する例:

// 勇者「ヒロト」が経験値を得る
hero.GainExperience(50);
hero.GainExperience(60); // レベルアップする

実行結果例:

ヒロトは50の経験値を得た!
ヒロトは60の経験値を得た!
ヒロトはレベル2に上がった!

3. 戦闘システムの作成

戦闘システムのコード

以下のコードを Program.cs に追加して、キャラクター同士が戦う仕組みを作ります。

using System;

namespace RPGExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // キャラクターの作成
            Character hero = new Character { Name = "ヒロト", HP = 100, MP = 20, Job = "勇者" };
            Character enemy = new Character { Name = "ゴブリン", HP = 60, MP = 10, Job = "敵" };

            Console.WriteLine("戦闘開始!");
            Console.WriteLine($"{hero.Name} VS {enemy.Name}");

            // 戦闘ループ
            while (hero.HP > 0 && enemy.HP > 0)
            {
                // 勇者の攻撃
                Console.WriteLine($"{hero.Name}の攻撃!");
                enemy.HP -= 20;
                Console.WriteLine($"{enemy.Name}のHP: {enemy.HP}");

                // 敵の反撃
                if (enemy.HP > 0)
                {
                    Console.WriteLine($"{enemy.Name}の反撃!");
                    hero.HP -= 10;
                    Console.WriteLine($"{hero.Name}のHP: {hero.HP}");
                }
            }

            // 勝敗判定
            if (hero.HP > 0)
            {
                Console.WriteLine($"{hero.Name}の勝利!");
                hero.GainExperience(50);
            }
            else
            {
                Console.WriteLine($"{enemy.Name}の勝利!");
            }
        }
    }
}

実行結果例:

戦闘開始!
ヒロト VS ゴブリン
ヒロトの攻撃!
ゴブリンのHP: 40
ゴブリンの反撃!
ヒロトのHP: 90
ヒロトの攻撃!
ゴブリンのHP: 20
ゴブリンの反撃!
ヒロトのHP: 80
ヒロトの攻撃!
ゴブリンのHP: 0
ヒロトの勝利!
ヒロトは50の経験値を得た!

ポイント解説

  1. 弓使い(Archer)クラス:
    • 新しい行動「矢を放つ」を持つクラスを追加しました。
    • クラスの継承を使うことで、キャラクターに独自の特徴を持たせています。
  2. レベルと経験値:
    • キャラクターが行動するたびに経験値を獲得し、一定量たまるとレベルアップします。
    • レベルアップ時に属性(HPやMP)が増加する仕様を追加しました。
  3. 戦闘システム:
    • キャラクター同士が攻撃を交互に行うシンプルな戦闘ループを実装。
    • 戦闘後に経験値を獲得する処理を追加しました。

オブジェクト指向のメモリ管理について

応用