Unityでのトランプカードの比較メソッドとテスト方法

この技術資料では、Unityで2つのトランプカードの大きい方を返すメソッドの作成方法と、それを自動テストする手順について解説します。トランプのカードは、以下のように値を定義します:

  • 数値カード:2~10
  • 絵札カードJ=11, Q=12, K=13
  • エースA=1

また、Unityの Unity Test Framework を用いてテストを行います。


カードを数値変数として扱う場合

1. トランプカードの大きい方を返すメソッドの実装

まず、カードの数値を比較して、大きい方のカードを返すメソッド GetHigherCard を含む CardComparer クラスを作成します。

CardComparer.cs

using System;

public class CardComparer
{
    // カードの数値を返すメソッド
    public int GetCardValue(string card)
    {
        switch (card)
        {
            case "A": return 1;
            case "J": return 11;
            case "Q": return 12;
            case "K": return 13;
            default:
                if (int.TryParse(card, out int value) && value >= 2 && value <= 10)
                {
                    return value;
                }
                else
                {
                    throw new ArgumentException("無効なカードの値です: " + card);
                }
        }
    }

    // 大きい方のカードを返すメソッド
    public string GetHigherCard(string card1, string card2)
    {
        int value1 = GetCardValue(card1);
        int value2 = GetCardValue(card2);

        if (value1 > value2)
        {
            return card1;
        }
        else if (value2 > value1)
        {
            return card2;
        }
        else
        {
            return "同じ値です";
        }
    }
}

説明

  • GetCardValue:カード名を数値に変換するメソッド。絵札(J, Q, K, A)や数値カード(2〜10)を対応する数値に変換します。
  • GetHigherCard:2枚のカードを比較し、大きい方のカードを返すメソッド。カードが同じ値の場合は「同じ値です」を返します。

2. 自動テストの設定

このメソッドをテストするために、Unityの Unity Test Framework を使用します。

手順

  1. Unity Test Frameworkのインストール
    Unityエディタのメニューから「Window」 > 「Package Manager」を選択し、Unity Test Framework をインストールします。
  2. テストスクリプトの作成
    Assets フォルダ内に「Tests」フォルダを作成し、その中に「CardComparerTests.cs」という名前のテストスクリプトを追加します。

3. テストコードの実装

以下に、 Assert.That を使用したテストコードを示します。

CardComparerTests.cs

using NUnit.Framework;

public class CardComparerTests
{
    private CardComparer comparer;

    [SetUp]
    public void 初期化()
    {
        // テスト前に初期化
        comparer = new CardComparer();
    }

    [Test]
    public void 高いカードを返す()
    {
        // K(13)とA(1)の比較
        string result = comparer.GetHigherCard("K", "A");
        Assert.That(result, Is.EqualTo("K"), "Kが高いカードであるべきです");

        // 5と10の比較
        result = comparer.GetHigherCard("5", "10");
        Assert.That(result, Is.EqualTo("10"), "10が高いカードであるべきです");

        // QとJの比較
        result = comparer.GetHigherCard("Q", "J");
        Assert.That(result, Is.EqualTo("Q"), "Qが高いカードであるべきです");
    }

    [Test]
    public void 同じ値のカードの場合メッセージを返す()
    {
        // 同じ値のカードを渡した場合
        string result = comparer.GetHigherCard("7", "7");
        Assert.That(result, Is.EqualTo("同じ値です"), "カードが同じ値の場合、'同じ値です'を返すべきです");
    }

    [Test]
    public void 無効なカードに対して例外をスローする()
    {
        // 無効なカードのテスト
        Assert.That(() => comparer.GetCardValue("Z"), Throws.ArgumentException, "無効なカードに対して例外をスローするべきです");
    }
}

各テストの説明

  • GetHigherCard_ReturnsHigherCardGetHigherCard が2つの異なるカードを比較し、大きい方を正しく返すかを確認します。
  • GetHigherCard_ReturnsSameValueMessage_WhenCardsAreEqual:同じ値のカードを渡した場合に「同じ値です」というメッセージが返されることを確認します。
  • GetCardValue_ThrowsException_ForInvalidCard:無効なカードの値が渡された場合、ArgumentException がスローされることを確認します。

4. テストの実行方法

  1. テストランナーの起動
    Unityエディタで「Window」 > 「General」 > 「Test Runner」を選択し、テストランナーウィンドウを開きます。
  2. テストの実行
    「PlayMode」または「EditMode」タブを選択し、テストを実行します(この例はエディットモードで動作します)。
  3. 結果の確認
    テストランナーでテスト結果が表示され、成功または失敗の詳細を確認できます。

まとめ

この技術資料では、Unityでトランプカードの値を比較して大きい方を返すメソッドと、それをテストする手順について解説しました。Unity Test Framework を用いることで、開発中にコードの信頼性を維持する自動テストを簡単に導入できます。

カードをクラスにして、カードの比較を行う方法とテストについてまとめます。カードの値を管理するために Card クラスを作成し、その比較を行う CardComparer クラスと自動テストについて説明します。


カードをクラスにした場合

1. カードクラスの実装

まず、Card クラスを作成してカードの情報を格納し、比較できるようにします。

Card.cs

public class Card
{
    public string Name { get; private set; }
    public int Value { get; private set; }

    public Card(string name)
    {
        Name = name;
        Value = GetCardValue(name);
    }

    private int GetCardValue(string name)
    {
        switch (name)
        {
            case "A": return 1;
            case "J": return 11;
            case "Q": return 12;
            case "K": return 13;
            default:
                if (int.TryParse(name, out int value) && value >= 2 && value <= 10)
                {
                    return value;
                }
                else
                {
                    throw new System.ArgumentException("無効なカードの値です: " + name);
                }
        }
    }
}

説明

  • Card クラス:カードの名前(A, 210, J, Q, K)と数値のプロパティを持ちます。カード名を GetCardValue メソッドで数値に変換し、クラス内で保持します。
  • GetCardValue メソッド:カードの名前から対応する数値に変換します。無効なカード名の場合は例外をスローします。

2. カード比較クラスの実装

次に、CardComparer クラスを作成して2つの Card オブジェクトを比較し、大きい方のカードを返すメソッドを実装します。

CardComparer.cs

public class CardComparer
{
    public Card GetHigherCard(Card card1, Card card2)
    {
        if (card1.Value > card2.Value)
        {
            return card1;
        }
        else if (card2.Value > card1.Value)
        {
            return card2;
        }
        else
        {
            return null; // 同じ値の場合は null を返す
        }
    }
}

説明

  • GetHigherCard:2つの Card オブジェクトを比較して、大きい方のカードを返します。カードの値が同じ場合は null を返します。

3. 自動テストの設定

このメソッドをテストするために、Unity Test Framework を使用してテストコードを作成します。

手順

  1. Unityエディタの「Window」 > 「Package Manager」から Unity Test Framework をインストールします。
  2. Assets フォルダに「Tests」フォルダを作成し、その中に「CardComparerTests.cs」という名前のスクリプトを作成します。

4. テストコードの実装

Card クラスと CardComparer クラスをテストするコードを以下に示します。

CardComparerTests.cs

using NUnit.Framework;

public class カード比較テスト
{
    private CardComparer comparer;

    [SetUp]
    public void 初期化()
    {
        comparer = new CardComparer();
    }

    [Test]
    public void 高いカードを返す()
    {
        // KとAの比較
        Card card1 = new Card("K");
        Card card2 = new Card("A");
        Card result = comparer.GetHigherCard(card1, card2);
        Assert.That(result.Name, Is.EqualTo("K"), "Kが高いカードであるべき");

        // 5と10の比較
        card1 = new Card("5");
        card2 = new Card("10");
        result = comparer.GetHigherCard(card1, card2);
        Assert.That(result.Name, Is.EqualTo("10"), "10が高いカードであるべき");

        // QとJの比較
        card1 = new Card("Q");
        card2 = new Card("J");
        result = comparer.GetHigherCard(card1, card2);
        Assert.That(result.Name, Is.EqualTo("Q"), "Qが高いカードであるべき");
    }

    [Test]
    public void 同じカードの場合はNullを返す()
    {
        // 同じ値のカードを渡した場合
        Card card1 = new Card("7");
        Card card2 = new Card("7");
        Card result = comparer.GetHigherCard(card1, card2);
        Assert.That(result, Is.Null, "同じカードの場合はnullを返すべき");
    }

    [Test]
    public void 無効なカードに対して例外を投げる()
    {
        // 無効なカードのテスト
        Assert.That(() => new Card("Z"), Throws.ArgumentException, "無効なカードに対して例外を投げるべき");
    }
}

各テストの説明

  • GetHigherCard_ReturnsHigherCardGetHigherCard メソッドが2つの異なる Card オブジェクトを比較し、大きい方のカードを返すことを確認します。
  • GetHigherCard_ReturnsNull_WhenCardsAreEqual:2つの同じ値のカードを渡した場合に null を返すことを確認します。
  • Card_ThrowsException_ForInvalidCard:無効なカード名で Card オブジェクトを生成した場合、ArgumentException がスローされることを確認します。

5. テストの実行方法

  1. テストランナーの起動
    Unityエディタで「Window」 > 「General」 > 「Test Runner」を選択し、テストランナーウィンドウを開きます。
  2. テストの実行
    「PlayMode」または「EditMode」タブを選択してテストを実行します(この例はエディットモードで動作します)。
  3. 結果の確認
    テストランナーでテスト結果が表示され、各テストの成功または失敗が確認できます。

まとめ

この資料では、カードの値を管理する Card クラスと、2つのカードを比較する CardComparer クラスの実装方法について解説しました。また、Unity Test Framework を使用して自動テストを設定する方法も紹介しました。このように、カードクラスを使用することで、カードのプロパティや動作をカプセル化でき、比較処理がより簡潔で明確になります。

テスト

Posted by hidepon