はじめての C# ミニ RPG ― クラス × ループで動かすターン制バトル

RPGのキャラクターを例にしたオブジェクト指向の説明と実装」⁠で解説されている Character クラス (名前・HP などのプロパティと Attack() / Heal() メソッド)の考え方を踏まえつつ、初学者向けに 配列・while ループ・if だけで完結する 超シンプルなターン制バトルゲーム を “まるごと” 再掲します。 


1. ゲーム概要

項目内容
ジャンル1 対 1 のターン制バトル
勝利条件敵スライムの HP を 0 にする
敗北条件自分の HP が 0 になる
操作プレイヤーのターンに ①攻撃 または ②回復 を数字入力
使う C# 機能クラス / メソッド / 配列 / while ループ / if

学習ポイント

  • 配列だけで手番管理(Character[] participants)
  • 未習トピック(List, enum, LINQ など)を排除しているので、配列・ループ・条件分岐まで学んだ直後でも動かせる
  • 1ファイルのコンソールアプリなので Visual Studio で貼り替えてすぐ試せる

2. 完全ソースコード

using System;

namespace TurnBasedGame
{
    // 1. キャラクター基底クラス
    class Character
    {
        public string Name;     // 名前
        public int HP;          // 現在HP
        public int MaxHP;       // 最大HP
        private static Random _rand = new Random();

        // 生存判定
        public bool IsAlive => HP > 0;

        // 攻撃(与えたダメージを返す)
        public int Attack()
        {
            int damage = _rand.Next(10, 21);      // 10〜20
            Console.WriteLine($"{Name} の攻撃! {damage} ダメージ!");
            return damage;
        }

        // 被ダメージ処理
        public void TakeDamage(int damage)
        {
            HP = Math.Max(HP - damage, 0);
        }

        // 回復(5〜15)
        public void Heal()
        {
            int heal = _rand.Next(5, 16);
            HP = Math.Min(HP + heal, MaxHP);
            Console.WriteLine($"{Name} は回復魔法! {heal} 回復(HP: {HP}/{MaxHP})");
        }
    }

    // 2. メインプログラム
    class Program
    {
        static void Main()
        {
            // 2-1. キャラクター生成
            Character player = new Character { Name = "ヒロト",  HP = 100, MaxHP = 100 };
            Character enemy  = new Character { Name = "スライム", HP =  60, MaxHP =  60 };

            // 配列で順番を管理(0:プレイヤー 1:敵)
            Character[] participants = { player, enemy };
            int turn = 0;            // 先攻はプレイヤー

            // 2-2. バトルループ
            while (player.IsAlive && enemy.IsAlive)
            {
                Character current = participants[turn];
                Character target  = participants[1 - turn];

                if (current == player)
                {
                    // --- プレイヤーターン ---
                    Console.WriteLine("\n=== あなたのターン ===");
                    Console.WriteLine($"敵 HP: {target.HP}/{target.MaxHP}");
                    Console.Write("1)攻撃  2)回復 > ");
                    string input = Console.ReadLine();

                    if (input == "2")
                        current.Heal();
                    else
                        target.TakeDamage(current.Attack());
                }
                else
                {
                    // --- 敵ターン(常に攻撃)---
                    Console.WriteLine("\n--- 敵のターン ---");
                    target.TakeDamage(current.Attack());
                }

                turn = 1 - turn;     // 手番交代
            }

            // 2-3. 勝敗表示
            Console.WriteLine(player.IsAlive ? "\n★ 勝利!" : "\n★ 敗北…");
        }
    }
}

3. 実行結果サンプル

※ ダメージと回復量は乱数で毎回変わります。

=== あなたのターン ===
敵 HP: 60/60
1)攻撃  2)回復 > 1
ヒロト の攻撃! 17 ダメージ!
--- 敵のターン ---
スライム の攻撃! 12 ダメージ!

=== あなたのターン ===
敵 HP: 43/60
1)攻撃  2)回復 > 2
ヒロト は回復魔法! 10 回復(HP: 98/100)
--- 敵のターン ---
スライム の攻撃! 14 ダメージ!

=== あなたのターン ===
敵 HP: 43/60
1)攻撃  2)回復 > 1
ヒロト の攻撃! 19 ダメージ!
--- 敵のターン ---
スライム の攻撃! 11 ダメージ!

=== あなたのターン ===
敵 HP: 24/60
1)攻撃  2)回復 > 1
ヒロト の攻撃! 20 ダメージ!
--- 敵のターン ---
スライム の攻撃! 13 ダメージ!

=== あなたのターン ===
敵 HP: 4/60
1)攻撃  2)回復 > 1
ヒロト の攻撃! 15 ダメージ!

★ 勝利!

4. コードの読みどころ

重点ポイント解説
状態とふるまいの一体化Character に「データ(Name/HP)」と「行動(Attack/Heal)」をまとめ、オブジェクト指向の“モノらしさ”を体験できる。 
配列でターン管理Character[] participants + turn = 1 – turn で 0↔1 を交互に切替。わずか2要素の固定長なら配列で十分。
未習機能は使わないList や enum はあえて未使用。授業進度に合わせて乱数や三項演算子を削るなど調整も容易。

5. さらに拡張してみよう(次の学習課題)

学習テーマ追加アイデア例
多次元配列味方3人 vs 敵3体を Character[2,3] で管理
条件分岐強化敵 AI を「HP が少ないと回復」「偶数ターンは強攻撃」などに変更
戻り値パターン比較Attack() を void に書き換え、ダメージ適用を内部処理に
enum 活用行動種別(Attack / Heal / Guard …)を列挙型で管理し switch で分岐

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