C#|ポーカーの役を判定する

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

 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください