public HandCompareResult Compare(Hand firstHand, Hand secondHand) { var firstRank = _evaluator.Evaluate(firstHand); var secondRank = _evaluator.Evaluate(secondHand); if (firstRank == secondRank) { return(CompareSameRanks(firstRank, firstHand, secondHand)); } else { return(firstRank > secondRank ? HandCompareResult.FirstHandWins : HandCompareResult.SecondHandWins); } }
/// <summary> /// Run the simulatiuon with a list of player and a sorter with all the cards /// </summary> /// <param name="players"></param> /// <param name="sorter"></param> public IEnumerable <Player> Run(IEnumerable <Player> players, IEnumerable <Hand[]> sorter) { // local function to determine who is the winner of each game Player EachGameWinner(Hand[] hands) { // each player receives a hand var game = players.Select((p, i) => { p.Hand = hands[i]; return(p); }); // evaluate hand rank on individual player by using HandCategoriserChain with Chain of Responsibility Pattern game = game.Select(p => { p.Hand = _handEvaluator.Evaluate(p.Hand); return(p); }); // evaluate the winner return(_winnerEvaluator.ShowWinner(game)); } var sorterArray = sorter as Hand[][] ?? sorter.ToArray(); // sorter gives hands to each game which will return a winner or null when it is tie. var winners = sorterArray.Select(EachGameWinner) .Where(w => w != null); // winning count on total and individual player var totalGameHasWinner = winners.Sum(w => { w.WinCount++; return(1); }); // total number of tie if it is required var tie = sorterArray.Length - totalGameHasWinner; return(players); }
public void Should_GetCorrectRankAndHighCard_With_TestHandRankData(string cards, Rank expectedRank, Value expectedValue) { var hand = cards.Split(" ").StringToHand(); hand = _handEvaluator.Evaluate(hand); Assert.Equal(expectedRank, hand.Rank); Assert.Equal(expectedValue, hand.HighCard?.Value ?? Value.None); }
static void Main(string[] args) { Deck deck = new Deck(); deck.Shuffle(); Hand hand = new Hand(); for (int i = 0; i < 5; i++) { Card card = deck.Deal(); hand.PickUp(card); } Console.WriteLine(hand); IHandEvaluatorChainFactory factory = new HandEvaluatorChainFactory(); IHandEvaluator chain = factory.Create(); Console.WriteLine($"Hand evaluation of {hand} is {chain.Evaluate(hand)}"); }