// 手札を表すクラス(自作クラス - MonoBehaviourではない) using UnityEngine; public class Hand { // カードの配列 Card[] cards = new Card[5]; // 5枚 // カードを設定 // i: 位置(0?4) // suit: スート // number: 数値 public void SetCard(int i, CardSuit suit, int number) { // 範囲を確認 if (i < 0 || i > 5) { Debug.Log("無効なカードの位置!"); return; // なにもしない } // 新しいカードを作る Card card = new Card(); card.Suit = suit; card.Number = number; // 設定 cards[i] = card; } // 同じカードの枚数を数える // number: 数えたい数値(1〜13) private int CountSameNumber(int number) { // 範囲を確認 if (number < 1 || number > 13) { Debug.Log("無効なカードの数値!"); return 0; // なにもしない } int count = 0; foreach (Card c in cards) { if (c.Number == number) count++; } return count; } // ワンペアであるか? private bool IsOnePair() { // いずれかの2枚のカードは同じ数値だったら、ワンペアになる for (int i = 1; i <= 13; i++) { if (CountSameNumber(i) == 2) return true; } return false; } // ツーペアであるか? private bool IsTwoPair() { // ワンペアと似ているが、2つのペアは異なるカードじゃないとだめ int match = 0; // 1つ目のペアの数値 for (int i = 1; i <= 13; i++) { if (CountSameNumber(i) == 2) match = i; } // なにも一致しなかった if (match == 0) return false; // もう一つのペアがないか確認する for (int i = 1; i <= 13; i++) { // 2枚がある「かつ」前のペアと異なる if (CountSameNumber(i) == 2 && i != match) return true; } return false; } // スリー・オブ・ア・カインドであるか? private bool IsThreeOfAKind() { // いずれかの3枚のカードは同じ数値だったら、 スリー・オブ・ア・カインドになる for (int i = 1; i <= 13; i++) { if (CountSameNumber(i) == 3) return true; } return false; } // ストレートであるか? private bool IsStraight() { // 連続になっているのかを確認が必要 // 例えば: 8-9-10-J(11)-Q(12) // まず、最低のカードを求めましょう int smallCard = 14; // Kよりも高いから始まる foreach (Card c in cards) { if (c.Number < smallCard) smallCard = c.Number; // 最低カードを更新 } // では、5枚も連続であれば、各カード +1 は // 必ず1枚ずつがあるはず for (int i = smallCard; i < smallCard + 5; i++) { // 1つだけ! if (CountSameNumber(i) != 1) return false; } // 順番に1枚ずつがあった! return true; // メモ:A-K-Q-J-10 に対応していない // 興味がある学生、ご自分でお試しください。 } // フラッシュであるか? private bool IsFlush() { // すべて同じスートでであればOK CardSuit suit = cards[0].Suit; // 残りのを確認 foreach (Card c in cards) { if (c.Suit != suit) return false; } return true; } // フルハウスであるか? private bool IsFullHouse() { // ツーペアと似ているが、枚数は2枚と3枚になる int match = 0; // 1つ目のペアの数値 for (int i = 1; i <= 13; i++) { if (CountSameNumber(i) == 2) match = i; } // なにも一致しなかった if (match == 0) return false; // 残りの3枚を数える for (int i = 1; i <= 13; i++) { // 3枚がある「かつ」前のペアと異なる if (CountSameNumber(i) == 3 && i != match) return true; } return false; } // フォー・オブ・ア・カインドであるか? private bool IsFourOfAKind() { // いずれかの4枚のカードは同じ数値だったら、 フォー・オブ・ア・カインドになる for (int i = 1; i <= 13; i++) { if (CountSameNumber(i) == 4) return true; } return false; } // ストレートフラッシュであるか? private bool IsStraightFlush() { // ストレート「かつ」フラッシュなので… return IsStraight() && IsFlush(); } // ハンドの判定し、表示する public void CheckResult() { // まず、ハンドの文字列を構築 string result = ""; foreach (Card c in cards) { result += c.ConvertToString(); } result += " - "; // 強い→弱い順番で評価 if (IsStraightFlush()) { result += "ストレートフラッシュ"; } else if (IsFourOfAKind()) { result += "フォー・オブ・ア・カインド"; } else if (IsFullHouse()) { result += "フルハウス"; } else if (IsFlush()) { result += "フラッシュ"; } else if (IsStraight()) { result += "ストレート"; } else if (IsThreeOfAKind()) { result += "スリー・オブ・ア・カインド"; } else if (IsTwoPair()) { result += "ツーペア"; } else if (IsOnePair()) { result += "ワンペア"; } else { result += "ハイカード"; } // 最後に表示 Debug.Log(result); } }