スートは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);
}
}