はじめての 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回
ディスカッション
コメント一覧
まだ、コメントがありません