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
を使用します。
手順
- Unity Test Frameworkのインストール
Unityエディタのメニューから「Window」 > 「Package Manager」を選択し、Unity Test Framework
をインストールします。 - テストスクリプトの作成
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_ReturnsHigherCard
:GetHigherCard
が2つの異なるカードを比較し、大きい方を正しく返すかを確認します。GetHigherCard_ReturnsSameValueMessage_WhenCardsAreEqual
:同じ値のカードを渡した場合に「同じ値です」というメッセージが返されることを確認します。GetCardValue_ThrowsException_ForInvalidCard
:無効なカードの値が渡された場合、ArgumentException
がスローされることを確認します。
4. テストの実行方法
- テストランナーの起動
Unityエディタで「Window」 > 「General」 > 「Test Runner」を選択し、テストランナーウィンドウを開きます。 - テストの実行
「PlayMode」または「EditMode」タブを選択し、テストを実行します(この例はエディットモードで動作します)。 - 結果の確認
テストランナーでテスト結果が表示され、成功または失敗の詳細を確認できます。
まとめ
この技術資料では、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
,2
~10
,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
を使用してテストコードを作成します。
手順
- Unityエディタの「Window」 > 「Package Manager」から
Unity Test Framework
をインストールします。 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_ReturnsHigherCard
:GetHigherCard
メソッドが2つの異なるCard
オブジェクトを比較し、大きい方のカードを返すことを確認します。GetHigherCard_ReturnsNull_WhenCardsAreEqual
:2つの同じ値のカードを渡した場合にnull
を返すことを確認します。Card_ThrowsException_ForInvalidCard
:無効なカード名でCard
オブジェクトを生成した場合、ArgumentException
がスローされることを確認します。
5. テストの実行方法
- テストランナーの起動
Unityエディタで「Window」 > 「General」 > 「Test Runner」を選択し、テストランナーウィンドウを開きます。 - テストの実行
「PlayMode」または「EditMode」タブを選択してテストを実行します(この例はエディットモードで動作します)。 - 結果の確認
テストランナーでテスト結果が表示され、各テストの成功または失敗が確認できます。
まとめ
この資料では、カードの値を管理する Card
クラスと、2つのカードを比較する CardComparer
クラスの実装方法について解説しました。また、Unity Test Framework
を使用して自動テストを設定する方法も紹介しました。このように、カードクラスを使用することで、カードのプロパティや動作をカプセル化でき、比較処理がより簡潔で明確になります。
ディスカッション
コメント一覧
まだ、コメントがありません