【学習】コンソールでミニゲーム(状態とループをつなぐ)
これまでの記事で、List と foreach、そして Enemy を分ける感覚を押さえました。
しかし 「ゲームっぽく動かす」 には、もうひとつ必要です。
状態(HP など)が変化しながら、同じ型の処理を繰り返す
今回はルールを増やしすぎない 超小さなターン制 で、ループと条件をつなぎます。
今日作るもの
コンソールで、次のような流れです。
- 敵が複数いる
- 毎ターン、プレイヤーは 攻撃 か 回復 を選ぶ
- 敵の HP がすべて 0 以下になったら勝ち
入力は数字(1 または 2)だけにします。
ソリューションとプロジェクトを作る
- テンプレート: コンソール アプリ
- プロジェクト名:
ClassAwakeningMiniGame(任意)
設計の考え方(短く)
- データ …
PlayerとList<Enemy>(前回までの延長) - 1ターン … 入力を読む → 攻撃なら敵にダメージ → 敵が反撃(ここでは全員が1人ずつ攻撃、シンプルに)
- 勝敗 … 敵が全滅、またはプレイヤーの HP が 0 以下
ルールは授業や記事の都合で差し替えて構いません。while と foreach と if が同じ画面に出る ことが目的です。
完成コード(例)
難しければ、このコードを動かしてから読み返してください。
using System;
using System.Collections.Generic;
namespace ClassAwakeningMiniGame
{
class Player
{
public string Name;
public int Hp;
public Player(string name, int hp)
{
Name = name;
Hp = hp;
}
}
class Enemy
{
public string Name;
public int Hp;
public Enemy(string name, int hp)
{
Name = name;
Hp = hp;
}
}
internal class Program
{
static void Main(string[] args)
{
Player player = new Player("勇者", 100);
List<Enemy> enemies = new List<Enemy>();
enemies.Add(new Enemy("スライム", 30));
enemies.Add(new Enemy("ゴブリン", 45));
Console.WriteLine("1=攻撃(全体に15ダメージ) 2=回復(+20) でEnter");
while (true)
{
if (AllEnemiesDown(enemies))
{
Console.WriteLine("勝ち!");
break;
}
if (player.Hp <= 0)
{
Console.WriteLine("負け…");
break;
}
ShowStatus(player, enemies);
string line = Console.ReadLine() ?? "";
if (line == "1")
{
foreach (Enemy e in enemies)
{
if (e.Hp > 0)
{
e.Hp -= 15;
}
}
}
else if (line == "2")
{
player.Hp += 20;
}
// 敵の反撃:生存している敵がそれぞれ 5 ずつ
foreach (Enemy e in enemies)
{
if (e.Hp > 0)
{
player.Hp -= 5;
}
}
}
}
static bool AllEnemiesDown(List<Enemy> enemies)
{
foreach (Enemy e in enemies)
{
if (e.Hp > 0)
{
return false;
}
}
return true;
}
static void ShowStatus(Player player, List<Enemy> enemies)
{
Console.WriteLine($"--- {player.Name} HP={player.Hp} ---");
foreach (Enemy e in enemies)
{
Console.WriteLine($" {e.Name} HP={e.Hp}");
}
}
}
}
プログラムの流れ
初期状態を作る(Player と List<Enemy>)
↓
while(ゲームが続くあいだ)
↓
勝敗チェック → 表示 → 入力
↓
foreach で敵に処理 / プレイヤーに処理
↓
再び while の先頭へ
重要ポイント
- ミニゲームの目的 は「おもしろさ」より 状態+コレクション+ループ の結合を体験すること
e.Hp > 0のチェックは 「死んだ敵に処理しない」 ための典型的な型ですAllEnemiesDownのように 意味の塊 をメソッドにすると、Mainが読みやすくなる
発展アイデア
- 敵を1体ずつ狙う(インデックス入力)
Randomでダメージに幅を持たせる- WinForms やタイマーに進むなら WinForms でリストの気持ちをつなぐ と WinForms 入門シリーズ
次へ
コンソールの入出力だけだと、表示やボタンで操作したくなるはずです。画面に載せる第一歩は WinForms でリストの気持ちをつなぐ です。
訪問数 3 回, 今日の訪問数 3回





ディスカッション
コメント一覧
まだ、コメントがありません