private static List <PokerPlayer> KickerLogic(HandRankEvaluator currentPlayerHand, HandRankEvaluator winningHand) { List <PokerPlayer> kickerWinners = new List <PokerPlayer>(); int count = 0; //Check the hand in reverse order for (int i = winningHand.CardsNotInPlay.Count - 1; i >= 0; i--) { if (winningHand.CardsNotInPlay[i].Value < currentPlayerHand.CardsNotInPlay[i].Value) { kickerWinners.Add(currentPlayerHand.Player); break; } else if (winningHand.CardsNotInPlay[i].Value == currentPlayerHand.CardsNotInPlay[i].Value) { count++; } if (count == winningHand.CardsNotInPlay.Count) { kickerWinners.Add(currentPlayerHand.Player); kickerWinners.Add(winningHand.Player); } } return(kickerWinners); }
public static List <PokerPlayer> DetermineWinners(List <PokerPlayer> gamePlayers) { HandRankEvaluator winningHand = null; List <PokerPlayer> winningPlayers = new List <PokerPlayer>(); foreach (var currentPlayer in gamePlayers) { var currentPlayerHand = new HandRankEvaluator(currentPlayer); //if hands out-rank each other if (winningHand == null || currentPlayerHand.CurrentHandRank > winningHand.CurrentHandRank) { winningHand = currentPlayerHand; winningPlayers.Clear(); winningPlayers.Add(currentPlayer); } //in case of tie else if (currentPlayerHand.CurrentHandRank == winningHand.CurrentHandRank) { // if flush if (currentPlayerHand.CurrentHandRank == Enums.HandRank.FLUSH) { //must clear current winners as we are using a null check above winningPlayers.Clear(); List <PokerPlayer> KickerWinners = KickerLogic(currentPlayerHand, winningHand); //loop through KickerWinners adding to winningPlayers foreach (PokerPlayer winner in KickerWinners) { winningPlayers.Add(winner); } } // if Three of A Kind if (currentPlayerHand.CurrentHandRank == Enums.HandRank.THREE_OF_A_KIND) { //compare value of 3 of kind set if (currentPlayerHand.ThreeOfKindValue > winningHand.ThreeOfKindValue) { winningPlayers.Clear(); winningPlayers.Add(currentPlayer); } //if value is same else { //must clear current winners as we are using a null check above winningPlayers.Clear(); List <PokerPlayer> KickerWinners = KickerLogic(currentPlayerHand, winningHand); //loop through KickerWinners adding to winningPlayers foreach (PokerPlayer winner in KickerWinners) { winningPlayers.Add(winner); } } } // if one pair if (currentPlayerHand.CurrentHandRank == Enums.HandRank.ONE_PAIR) { if (currentPlayerHand.OnePairValue > winningHand.OnePairValue) { winningPlayers.Clear(); winningPlayers.Add(currentPlayer); } //if value is same else if (currentPlayerHand.OnePairValue == winningHand.OnePairValue) { //must clear current winners as we are using a null check above winningPlayers.Clear(); List <PokerPlayer> KickerWinners = KickerLogic(currentPlayerHand, winningHand); //loop through KickerWinners adding to winningPlayers foreach (PokerPlayer winner in KickerWinners) { winningPlayers.Add(winner); } } } //if high card if (currentPlayerHand.CurrentHandRank == Enums.HandRank.HIGH_CARD) { if (currentPlayerHand.HighCardValue > winningHand.HighCardValue) { winningHand = currentPlayerHand; winningPlayers.Clear(); winningPlayers.Add(currentPlayer); } else if (currentPlayerHand.HighCardValue == winningHand.HighCardValue) { //must clear current winners as we are using a null check above winningPlayers.Clear(); List <PokerPlayer> KickerWinners = KickerLogic(currentPlayerHand, winningHand); //loop through KickerWinners adding to winningPlayers foreach (PokerPlayer winner in KickerWinners) { winningPlayers.Add(winner); } } else { winningPlayers.Clear(); winningPlayers.Add(winningHand.Player); } } } } return(winningPlayers); }