public PokerPlayerHandEvaluator(PlayingCardList playerCards, PlayingCardList tableCards) : base(null) { Debug.Assert(playerCards.Count == 2); Debug.Assert(tableCards.Count == 5); Tuple<HandType, ulong> bestHandValue = HandValue(tableCards); PlayingCardList bestHand = tableCards; // swap one, or the other player card for any one table card. foreach(var card in playerCards) { for(int i = 0; i < 5; i++) { var cards = new PlayingCardList(); for(int iNewHand = 0; iNewHand < 5; iNewHand++) { if(iNewHand == i) { cards.Add(card); } else { cards.Add(tableCards[iNewHand]); } } var newHand = new PlayingCardList(cards); Tuple<HandType, ulong> newHandValue = HandValue(newHand); if(newHandValue.Item2 > bestHandValue.Item2) { bestHandValue = newHandValue; bestHand = newHand; } } } // swap both for any two table cards. for(int iCard1 = 0; iCard1 < 4; iCard1++) { for(int iCard2 = iCard1; iCard2 < 5; iCard2++) { var cards = new PlayingCardList(); for(int iNewHand = 0; iNewHand < 5; iNewHand++) { if(iNewHand == iCard1) { cards.Add(playerCards[0]); } else if(iNewHand == iCard2) { cards.Add(playerCards[1]); } else { cards.Add(tableCards[iNewHand]); } } var newHand = new PlayingCardList(cards); Tuple<HandType, ulong> newHandValue = HandValue(newHand); if(newHandValue.Item2 > bestHandValue.Item2) { bestHandValue = newHandValue; bestHand = newHand; } } } this.cards = bestHand; this.handType = bestHandValue.Item1; this.handValue = bestHandValue.Item2; }
static PlayingCardList GenerateStandardDeck(bool includeJokers) { int cardCount = 52 + (includeJokers ? 2 : 0); PlayingCardList cards = new PlayingCardList(); 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; }