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

2025年7月15日

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★ 敗北…");
        }
    }
}

全体の流れ

  1. キャラクタークラスを作って、名前・HP・攻撃・回復の機能をまとめる
  2. プレイヤーと敵を作って、ターン制で交互に行動させる
  3. HPが0になったらバトル終了、勝敗を表示する

1. キャラクタークラス Character

役割

ゲームに登場する「キャラクター(プレイヤーも敵も)」が共通で持つデータと動きをまとめたクラスです。


主なメンバー

項目説明
Nameキャラクターの名前です。(例:ヒロト、スライム)
HP / MaxHP現在のHPと最大HPを表す整数です。
IsAliveHPが0より大きいかを調べて、生きているかを判定します。
Attack()ランダムで10〜20のダメージを発生させ、攻撃したことを表示してそのダメージを返します。
TakeDamage(int damage)ダメージを受けてHPを減らします(HPがマイナスにならないように調整)。
Heal()5〜15の範囲で回復します(HPは最大HPを超えないようにします)。

ポイント

  • Random はランダムな数を作るために使っています。
  • Math.Max は「値がマイナスにならないように最低0にする」ために使っています。
  • Math.Min は「HPが最大HPを超えないようにする」ために使っています。

2. メインプログラム Program

役割

ゲームを動かす「シナリオ」部分です。


流れ

2-1. キャラクター生成

Character player = new Character { Name = "ヒロト", HP = 100, MaxHP = 100 };
Character enemy  = new Character { Name = "スライム", HP =  60, MaxHP =  60 };
  • player と enemy を作成します。
  • Name、HP、MaxHP を設定しています。

2-2. バトルループ

while (player.IsAlive && enemy.IsAlive)
{
    // ...
}
  • どちらかのHPが0になるまで繰り返します。
  • turn という変数で「どっちのターンか」を切り替えます。

プレイヤーターン
  • コンソールに 1)攻撃  2)回復 を表示
  • 入力を Console.ReadLine() で読み取る
  • 入力が “2" なら Heal()、それ以外なら Attack() して相手に TakeDamage() します。

敵ターン
  • 敵は常に攻撃します。入力は不要。
  • Attack() してプレイヤーに TakeDamage() します。

2-3. 勝敗表示

Console.WriteLine(player.IsAlive ? "\n★ 勝利!" : "\n★ 敗北…");
  • プレイヤーが生きていれば勝利、そうでなければ敗北です。
  • ? は条件演算子と呼ばれ、「もし条件が true なら左、false なら右」と分岐します。

3. まとめ

このコードで学べるポイント:

✅ クラスの作り方

✅ フィールド(データ)の使い方

✅ メソッド(行動)の使い方

✅ while 文での繰り返し処理

✅ if 文での条件分岐

✅ 配列で参加者を管理する方法

✅ Random でランダムな数値を作る方法


4. アドバイス

  • 「自分のHPがどう変わっているか」を Console.WriteLine() で何度も表示して確認してみると理解が深まります。
  • クラスを作ると、同じ機能を複数のキャラクターに使い回せるのが便利です。
  • 改造して敵を複数にしたり、攻撃の威力をキャラごとに変えたりしてみましょう!

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 で分岐

訪問数 59 回, 今日の訪問数 1回