2025年4月14日月曜日

C# で作成するモグラたたきゲーム

 承知いたしました。C# (C シャープ) で作成するモグラたたきゲームのデスクトッププログラムの基本的なコード例を以下に示します。このコードは Windows Forms アプリケーションとして作成することを想定しています。

注意: これは基本的な例であり、グラフィックやサウンド、より洗練されたゲームロジックは含まれていません。

まず、Visual Studio などの IDE を使用して新しい Windows Forms アプリケーションプロジェクトを作成してください。

次に、Form1.cs のコードを以下の内容で置き換えます。

C#
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;

namespace WhackAMole
{
    public partial class Form1 : Form
    {
        private List<Button> moles;
        private Random random = new Random();
        private int score = 0;
        private Timer gameTimer;
        private int gameDuration = 30; // ゲーム時間 (秒)
        private int timeRemaining;
        private Label scoreLabel;
        private Label timerLabel;

        public Form1()
        {
            InitializeComponent();
            InitializeGame();
        }

        private void InitializeGame()
        {
            // フォームのサイズを設定
            this.ClientSize = new Size(400, 300);

            // スコア表示ラベルの作成
            scoreLabel = new Label();
            scoreLabel.Text = "スコア: 0";
            scoreLabel.Location = new Point(10, 10);
            scoreLabel.AutoSize = true;
            Controls.Add(scoreLabel);

            // タイマー表示ラベルの作成
            timerLabel = new Label();
            timerLabel.Text = "時間: " + gameDuration;
            timerLabel.Location = new Point(10, 30);
            timerLabel.AutoSize = true;
            Controls.Add(timerLabel);

            // モグラボタンのリストを作成
            moles = new List<Button>();
            int moleSize = 50;
            int padding = 10;
            int rows = 3;
            int cols = 3;

            for (int row = 0; row < rows; row++)
            {
                for (int col = 0; col < cols; col++)
                {
                    Button mole = new Button();
                    mole.Size = new Size(moleSize, moleSize);
                    mole.Location = new Point(padding + col * (moleSize + padding), 60 + padding + row * (moleSize + padding));
                    mole.Text = ""; // モグラの表示は画像などにすると良い
                    mole.BackColor = Color.Brown; // モグラの色
                    mole.Click += Mole_Click;
                    moles.Add(mole);
                    Controls.Add(mole);
                }
            }

            // ゲームタイマーの初期化
            gameTimer = new Timer();
            gameTimer.Interval = 1000; // 1秒ごとにイベント発生
            gameTimer.Tick += GameTimer_Tick;

            // ゲームを開始
            StartGame();
        }

        private void StartGame()
        {
            score = 0;
            scoreLabel.Text = "スコア: 0";
            timeRemaining = gameDuration;
            timerLabel.Text = "時間: " + timeRemaining;
            gameTimer.Start();
            ShowRandomMole();
        }

        private async void ShowRandomMole()
        {
            // すべてのモグラを非表示にする
            foreach (var mole in moles)
            {
                mole.Enabled = false; // クリック不可
                mole.BackColor = Color.Brown;
            }

            // ランダムなモグラを選択して表示
            int index = random.Next(moles.Count);
            moles[index].Enabled = true; // クリック可能
            moles[index].BackColor = Color.DarkGray; // 表示されたモグラの色

            // 一定時間後に非表示にする
            await Task.Delay(1500); // 1.5秒表示

            // ゲームが終了していない場合は、再びランダムなモグラを表示
            if (gameTimer.Enabled)
            {
                ShowRandomMole();
            }
        }

        private void Mole_Click(object sender, EventArgs e)
        {
            Button clickedMole = (Button)sender;
            if (clickedMole.BackColor == Color.DarkGray) // 表示されているモグラをクリックした場合
            {
                score++;
                scoreLabel.Text = "スコア: " + score;
                clickedMole.BackColor = Color.Brown; // クリック後は非表示にする
            }
        }

        private void GameTimer_Tick(object sender, EventArgs e)
        {
            timeRemaining--;
            timerLabel.Text = "時間: " + timeRemaining;

            if (timeRemaining <= 0)
            {
                gameTimer.Stop();
                MessageBox.Show($"ゲーム終了!あなたのスコアは {score} です。", "ゲーム終了");
                // 必要であれば、ここでゲームのリスタート処理などを追加
                StartGame(); // デモのため、終了後に再スタート
            }
        }
    }
}

コードの説明:

  1. using ディレクティブ: 必要な名前空間をインポートします。
  2. namespace WhackAMole: プロジェクトのネームスペース。
  3. public partial class Form1 : Form: Windows Forms の基本となるクラス。
  4. フィールド:
    • moles: モグラを表すボタンのリスト。
    • random: 乱数ジェネレーター。
    • score: 現在のスコア。
    • gameTimer: ゲームの進行を管理するタイマー。
    • gameDuration: ゲームの制限時間(秒)。
    • timeRemaining: 残り時間。
    • scoreLabel: スコアを表示するラベル。
    • timerLabel: 残り時間を表示するラベル。
  5. Form1() (コンストラクタ): フォームの初期化とゲームの初期化を行います。
  6. InitializeGame():
    • フォームのサイズを設定します。
    • スコアとタイマーのラベルを作成し、配置します。
    • モグラのボタンをグリッド状に作成し、イベントハンドラー (Mole_Click) を設定してリストに追加します。
    • ゲームタイマーを初期化し、イベントハンドラー (GameTimer_Tick) を設定します。
    • StartGame() メソッドを呼び出してゲームを開始します。
  7. StartGame():
    • スコアをリセットします。
    • 残り時間を初期化します。
    • タイマーを開始します。
    • 最初にランダムなモグラを表示します。
  8. ShowRandomMole():
    • すべてのモグラを一時的に非表示(クリック不可、色を戻す)にします。
    • ランダムなインデックスを選択して、対応するモグラを表示(クリック可能、色を変える)します。
    • Task.Delay() を使用して、一定時間後にモグラを再び非表示にします。
    • ゲームが続いている場合は、再び ShowRandomMole() を呼び出します。
  9. Mole_Click(object sender, EventArgs e):
    • クリックされたボタンがモグラ(表示されている色)であれば、スコアを増やし、表示を元に戻します。
  10. GameTimer_Tick(object sender, EventArgs e):
    • 残り時間を減らし、タイマーラベルを更新します。
    • 残り時間が 0 になったら、タイマーを停止し、メッセージボックスでゲーム終了を知らせます。その後、デモとしてゲームを再スタートします。

使用方法:

  1. Visual Studio で新しい Windows Forms アプリケーションプロジェクトを作成します。
  2. Form1.cs の内容を上記のコードで置き換えます。
  3. 必要に応じて、モグラの数、サイズ、配置、ゲーム時間などを調整してください。
  4. 実行 (F5 キー) してゲームをプレイします。

今後の拡張:

  • グラフィックの追加: ボタンの代わりに画像コントロールを使用し、モグラの画像を表示する。
  • サウンドエフェクト: モグラをクリックしたときなどに音を再生する。
  • 難易度調整: モグラの出現頻度や表示時間を変更できるようにする。
  • ハイスコア機能: ハイスコアを保存・表示する。
  • アニメーション: モグラが出たり引っ込んだりするアニメーションを追加する。

この基本的なコードを参考に、より面白いモグラたたきゲームを作成してみてください。