static List <PlayingCard> GenerateStandardDeck(bool includeJokers) { int cardCount = 52 + (includeJokers ? 2 : 0); List <PlayingCard> cards = new List <PlayingCard>(); for (int i = 0; i < cardCount; i++) { PlayingCard.Suit suit = (PlayingCard.Suit)(i % 4); PlayingCard.Value value = (PlayingCard.Value)((i - (int)suit) / 4); cards.Add(new PlayingCard(suit, value)); } return(cards); }
static Tuple <HandType, ulong> HandValue(List <PlayingCard> cards) { Debug.Assert(cards.Count == 5); cards.Sort(); PlayingCard.Value?firstPairValue, secondPairValue; uint firstPairCardCount, secondPairCardCount; bool isStraight; bool isFlush; CalcHandStats(cards, out isFlush, out firstPairValue, out secondPairValue, out firstPairCardCount, out secondPairCardCount, out isStraight); HandType myHandType; myHandType = GetHandType(firstPairCardCount, secondPairCardCount, isStraight, isFlush); ulong myHandValue; switch (myHandType) { case HandType.StraightFlush: case HandType.Flush: case HandType.HighCard: case HandType.Straight: if (myHandType == HandType.Straight && cards[4].value == PlayingCard.Value.Ace) { myHandValue = 0; } else { myHandValue = GetValue(cards[4].value, cards[3].value, cards[2].value, cards[1].value, cards[0].value); } break; case HandType.FourOfAKind: case HandType.ThreeOfAKind: case HandType.OnePair: int iStartOfPair = 0; for (int i = 0; i < 5; i++) { if (cards[i].value == firstPairValue.Value) { iStartOfPair = i; break; } } myHandValue = GetValue(cards[iStartOfPair].value, cards[iStartOfPair + 1].value, cards[(iStartOfPair + 2) % 5].value, cards[(iStartOfPair + 3) % 5].value, cards[(iStartOfPair + 4) % 5].value); break; case HandType.FullHouse: PlayingCard.Value largerValue = firstPairValue.Value; PlayingCard.Value smallerValue = secondPairValue.Value; if (secondPairCardCount > firstPairCardCount) { largerValue = secondPairValue.Value; smallerValue = firstPairValue.Value; } myHandValue = GetValue(largerValue, largerValue, largerValue, smallerValue, smallerValue); break; case HandType.TwoPair: PlayingCard.Value lastCard = 0; foreach (var card in cards) { if (card.value != firstPairValue.Value && card.value != secondPairValue.Value) { lastCard = card.value; break; } } myHandValue = GetValue(secondPairValue.Value, secondPairValue.Value, firstPairValue.Value, firstPairValue.Value, lastCard); break; default: myHandValue = 0; Debug.Fail(); break; } return(Tuple.Create(myHandType, (ulong)myHandType * 100000000 + myHandValue)); }
static ulong GetValue(PlayingCard.Value value1, PlayingCard.Value value2, PlayingCard.Value value3, PlayingCard.Value value4, PlayingCard.Value value5) { return((ulong)((ulong)value1 * Math.Pow(13, 4) + (ulong)value2 * Math.Pow(13, 3) + (ulong)value3 * Math.Pow(13, 2) + (ulong)value4 * 13 + (ulong)value5)); }