【学習】コンソールでミニゲーム(状態とループをつなぐ)

広告

これまでの記事で、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 が読みやすくなる

発展アイデア


次へ

コンソールの入出力だけだと、表示やボタンで操作したくなるはずです。画面に載せる第一歩は WinForms でリストの気持ちをつなぐ です。

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

広告

C#

Posted by hidepon