private bool isOnePair(ref HAND hand) { Rank mOnePairRank = 0; bool returnStatus = false; for (int i = 0; i < _cards.Count - 1; i++) { Rank mRank = _cards[i].Rank; int rankCount = 1; for (int j = i + 1; j < _cards.Count; j++) { if (mRank == _cards[j].Rank) { rankCount++; } if (rankCount == 2) { break; } } if (rankCount == 2) { hand.OnePair3cards = new Card[3]; mOnePairRank = mRank; hand.pokerHand = PokerHand.OnePair; hand.onePairRank = mRank; int z = 0; foreach (var card in _cards) { if (card.Rank != mRank && (z < 3)) { hand.OnePair3cards[z] = card; z++; } } Array.Sort(hand.OnePair3cards); returnStatus = true; } } return(returnStatus); }
//determine poker hand public HAND determinePokerHand() { HAND ahand = new HAND(); if (isFlush()) { ahand.pokerHand = PokerHand.Flush; } else if (isThreeOfAKind(ref ahand)) { } else if (isOnePair(ref ahand)) { } else { ahand.pokerHand = PokerHand.HighCard; } return(ahand); }
private bool isThreeOfAKind(ref HAND hand) { for (int i = 0; i < _cards.Count - 2; i++) { Rank mRank = _cards[i].Rank; int rankCount = 1; for (int j = i + 1; j < _cards.Count; j++) { if (mRank == _cards[j].Rank) { rankCount++; } if (rankCount == 3) { break; } } if (rankCount == 3) { hand.threeOfAKind2cards = new Card[2]; hand.pokerHand = PokerHand.ThreeOfAKind; hand.threeOfAKindRank = mRank; int z = 0; foreach (var card in _cards) { if (card.Rank != mRank && (z < 2)) { hand.threeOfAKind2cards[z] = card; z++; } } Array.Sort(hand.threeOfAKind2cards); return(true); } } return(false); }
// Determine winner players public List <Player> evaluate() { List <HAND> winnersHand = new List <HAND>(); List <Player> winners = new List <Player>(); //determine winners by only checking PokerHand foreach (var player in _players) { HAND tempHand = player.determinePokerHand(); if (winners.Count == 0 || (winnersHand[0].pokerHand == tempHand.pokerHand)) { winnersHand.Insert(0, tempHand); winners.Insert(0, player); } else if (winnersHand[0].pokerHand < tempHand.pokerHand) { winners.Clear(); winnersHand.Clear(); winnersHand.Add(tempHand); winners.Add(player); } } //Tie breaker switch (winnersHand[0].pokerHand) { case PokerHand.Flush: case PokerHand.HighCard: { // going from highest rank card, remove players that have // lower rank in each level until remaining winner is left for (int i = _numCard - 1; i >= 0; i--) { if (winners.Count == 1) { break; } Player winnerInitial = winners[0]; List <Player> playersToBeRemoved = new List <Player>(); foreach (var awinner in winners) { if (awinner.Cards[i].Rank < winnerInitial.Cards[i].Rank) { playersToBeRemoved.Add(awinner); } if (awinner.Cards[i].Rank > winnerInitial.Cards[i].Rank) { playersToBeRemoved.Add(winnerInitial); winnerInitial = awinner; } } foreach (var awinner in playersToBeRemoved) { winners.Remove(awinner); } } } break; case PokerHand.ThreeOfAKind: { Player winner = winners[0]; List <Player> playersToBeRemoved2 = new List <Player>(); // Remove players that have less rank of the three of a kind card foreach (var awinner in winners) { if (awinner.determinePokerHand().threeOfAKindRank < winner.determinePokerHand().threeOfAKindRank) { playersToBeRemoved2.Add(awinner); } if (winner.determinePokerHand().threeOfAKindRank < awinner.determinePokerHand().threeOfAKindRank) { playersToBeRemoved2.Add(winner); winner = awinner; } } foreach (var awinner in playersToBeRemoved2) { winners.Remove(awinner); } // going from highest rank in the two kicker cards, // remove players that have lower rank in each level // until remaining winner is left for (int i = 1; i >= 0; i--) { if (winners.Count == 1) { break; } Player winnerInitial = winners[0]; List <Player> playersToBeRemoved = new List <Player>(); foreach (var awinner in winners) { if (awinner.determinePokerHand().threeOfAKind2cards.Length != 2 || winnerInitial.determinePokerHand().threeOfAKind2cards.Length != 2) { throw new Exception(); } if (awinner.determinePokerHand().threeOfAKind2cards[i].Rank < winnerInitial.determinePokerHand().threeOfAKind2cards[i].Rank) { playersToBeRemoved.Add(awinner); } if (awinner.determinePokerHand().threeOfAKind2cards[i].Rank > winnerInitial.determinePokerHand().threeOfAKind2cards[i].Rank) { playersToBeRemoved.Add(winnerInitial); winnerInitial = awinner; } } foreach (var awinner in playersToBeRemoved) { winners.Remove(awinner); } } } break; case PokerHand.OnePair: { Player winner = winners[0]; List <Player> playersToBeRemoved = new List <Player>(); foreach (var awinner in winners) { if (awinner.determinePokerHand().onePairRank < winner.determinePokerHand().onePairRank) { playersToBeRemoved.Add(awinner); } if (winner.determinePokerHand().onePairRank < awinner.determinePokerHand().onePairRank) { playersToBeRemoved.Add(winner); winner = awinner; } } foreach (var awinner in playersToBeRemoved) { winners.Remove(awinner); } // going from highest rank in the three kicker cards, // remove players that have lower rank in each level // until remaining winner is left for (int i = 2; i >= 0; i--) { if (winners.Count == 1) { break; } Player winnerInitial = winners[0]; List <Player> playersToBeRemoved2 = new List <Player>(); foreach (var awinner in winners) { if (awinner.determinePokerHand().OnePair3cards.Length != 3 || winnerInitial.determinePokerHand().OnePair3cards.Length != 3) { throw new Exception(); } if (awinner.determinePokerHand().OnePair3cards[i].Rank < winnerInitial.determinePokerHand().OnePair3cards[i].Rank) { playersToBeRemoved2.Add(awinner); } if (awinner.determinePokerHand().OnePair3cards[i].Rank > winnerInitial.determinePokerHand().OnePair3cards[i].Rank) { playersToBeRemoved2.Add(winnerInitial); winnerInitial = awinner; } } foreach (var awinner in playersToBeRemoved2) { winners.Remove(awinner); } } } break; default: break; } return(winners); }