スートはS,D,H,C、ランクはA,2~9,T,J,Q,Kのそれぞれ一文字で表す。 手札を S2D5H3CQS9 のように10文字で指定する。
using System; using System.Collections.Generic; class Poker { const string Ranks = "A23456789TJQKA"; const string Suits = "SDHC"; public static string Judge(string cards) { if(IsRoyalStraightFlush(cards)) return "Royal straight flush"; else if(IsStraightFlush(cards)) return "Straight flush"; else if(Is4cards(cards)) return "Four of a kind"; else if(IsFullHouse(cards)) return "Full house"; else if(IsFlush(cards)) return "Flush"; else if(IsStraight(cards)) return "Straight"; else if(Is3Cards(cards)) return "Three of a kind"; else if(Is2Pair(cards)) return "Two pair"; else if(Is1Pair(cards)) return "One pair"; else return "No pair"; } static bool IsRoyalStraightFlush(string cards) { if(IsFlush(cards) && IsStraight(cards)) { for(int i = 2; i <= 9; i++) {//2~9までの数字が含まれていたらNG if(cards.IndexOf(i.ToString()) != -1) return false; } return true; } return false; } static bool IsStraightFlush(string cards) { return IsFlush(cards) && IsStraight(cards); } static bool Is4cards(string cards) { return IsAnyCards(cards, 4); } static bool IsFullHouse(string cards) { return Is3Cards(cards) && Is1Pair(cards); } static bool IsFlush(string cards) { foreach(char suit in Suits.ToCharArray()) {//あるスーツの文字を切り取って if(cards.Length - cards.Replace(suit.ToString(), "").Length == 5) return true; //5文字減ったら5枚全て同じスーツ } return false; } static bool IsStraight(string cards) { List<string> rankListInCards = new List<string>();//カードのランクのみ //ランク切り出し for(int i = 1; i <= 9; i = i + 2) { rankListInCards.Add(cards[i].ToString()); } //並び替え rankListInCards.Sort(cardRankSort); //ソート済みカードリスト作成 string sortedCards = ""; foreach(string card in rankListInCards) { sortedCards += card; } //判定 if(Ranks.Contains(sortedCards)) return true; if(sortedCards[0] == 'A') {//先頭がAなら //末尾に移してもう一度判定 if(Ranks.Contains(sortedCards.Remove(0, 1).PadRight(5, 'A'))) return true; } return false; } static bool Is3Cards(string cards) { return IsAnyCards(cards, 3); } static bool Is2Pair(string cards) { foreach(char Rank in Ranks.ToCharArray()) { if(cards.Length - cards.Replace(Rank.ToString(), "").Length == 2) {//One pairだったら return Is1Pair(cards.Replace(Rank.ToString(), ""));//One pairが2回でTwo pair } } return false; } static bool Is1Pair(string cards) { return IsAnyCards(cards, 2); } //あるカードがany枚含まれているかどうかを判定 static bool IsAnyCards(string cards, int any) { foreach(char Rank in Ranks.ToCharArray()) { if(cards.Length - cards.Replace(Rank.ToString(), "").Length == any) return true; } return false; } static int cardRankSort(string x, string y) { return Ranks.IndexOf(x) - Ranks.IndexOf(y); } }