【Winform】初級:簡易ステートマシンを使ったゲーム状態管理

2024年8月29日

この技術資料では、WinFormアプリでシンプルなステートマシンを実装する方法を紹介します。このサンプルは、ゲームの簡単な状態遷移を実装する例です。

ステートマシンとは

ステートマシン(State Machine)は、システムやアプリケーションの状態を管理し、各状態に対して特定の動作を定義する手法です。この資料では、ゲームの「開始」「プレイ中」「ゲームオーバー」という3つの状態を持つシンプルなステートマシンを実装します。

サンプルコード

以下は、ステートマシンを用いたWinFormアプリのサンプルコードです。このコードでは、ゲームの状態に応じてラベルとボタンの表示を更新します。

using System;
using System.Windows.Forms;

namespace SimpleStateMachineSample
{
    public partial class Form1 : Form
    {
        private enum GameState
        {
            Start,
            Playing,
            GameOver
        }

        private GameState currentState;

        public Form1()
        {
            InitializeComponent();
            currentState = GameState.Start;
            UpdateUI();
        }

        private void UpdateUI()
        {
            // 状態に応じてラベルとボタンのテキストを更新
            switch (currentState)
            {
                case GameState.Start:
                    stateLabel.Text = "「開始」ボタンを押してゲームを始めてください";
                    actionButton.Text = "開始";
                    break;
                case GameState.Playing:
                    stateLabel.Text = "ゲームが進行中です...";
                    actionButton.Text = "終了";
                    break;
                case GameState.GameOver:
                    stateLabel.Text = "ゲームオーバーです。「再開」ボタンで再度プレイできます";
                    actionButton.Text = "再開";
                    break;
            }

            // 現在の状態をcurrentStatusLabelに表示
            currentStatusLabel.Text = $"現在の状態: {currentState}";
        }

        private void actionButton_Click(object sender, EventArgs e)
        {
            // ボタンのクリックに応じて状態を遷移
            switch (currentState)
            {
                case GameState.Start:
                    currentState = GameState.Playing;
                    break;
                case GameState.Playing:
                    currentState = GameState.GameOver;
                    break;
                case GameState.GameOver:
                    currentState = GameState.Start;
                    break;
            }
            UpdateUI();
        }
    }
}

詳細解説

1. 状態の定義

GameStateという列挙型(enum)を使用して、ゲームの3つの状態を定義しています。

private enum GameState
{
    Start,
    Playing,
    GameOver
}

2. 状態の管理

currentStateという変数で現在のゲームの状態を管理し、ボタンのクリックに応じて状態が遷移します。

private GameState currentState;

3. UIの更新

UpdateUI()メソッドで、現在の状態に応じてUIを更新します。状態に応じてラベルのテキストとボタンのラベルを変更し、さらに現在の状態を stateLabel に表示します。

private void UpdateUI()
{
    switch (currentState)
    {
        case GameState.Start:
            stateLabel.Text = "「開始」ボタンを押してゲームを始めてください";
            actionButton.Text = "開始";
            break;
        case GameState.Playing:
            stateLabel.Text = "ゲームが進行中です...";
            actionButton.Text = "終了";
            break;
        case GameState.GameOver:
            stateLabel.Text = "ゲームオーバーです。「再開」ボタンで再度プレイできます";
            actionButton.Text = "再開";
            break;
    }

    // 現在の状態をcurrentStatusLabelに表示
    currentStatusLabel.Text = $"現在の状態: {currentState}";
}

4. 状態遷移の実行

actionButton_Clickメソッドで、ボタンがクリックされた際に状態を遷移させます。

private void actionButton_Click(object sender, EventArgs e)
{
    switch (currentState)
    {
        case GameState.Start:
            currentState = GameState.Playing;
            break;
        case GameState.Playing:
            currentState = GameState.GameOver;
            break;
        case GameState.GameOver:
            currentState = GameState.Start;
            break;
    }
    UpdateUI();
}

まとめ

このサンプルでは、ステートマシンを使った基本的な状態管理の方法を紹介しました。また、現在の状態をフォームに表示することで、ユーザーが状態の変化を視覚的に確認できるようにしました。これを基に、さらに複雑な状態や動作を追加することで、ゲームやアプリケーションの挙動を柔軟に制御することが可能です。