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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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)}");
        }