Beispiel #1
0
        /// <summary>
        /// Determine the outcome of a single pair of cards.
        /// </summary>
        /// <param name="pair">The pair of cards to compare.</param>
        /// <returns>The outcome of the comparison.</returns>
        protected internal PlayingCardPairOutcome GetPairOutcome(PlayingCardPair pair)
        {
            #region Param Checking
            if (pair == null)
            {
                throw new ArgumentNullException("pair");
            }
            if (pair.Player1Card == null)
            {
                throw new ArgumentNullException("pair.Player1Card");
            }
            if (pair.Player2Card == null)
            {
                throw new ArgumentNullException("pair.Player2Card");
            }
            #endregion

            PlayingCardPairOutcome returnValue = PlayingCardPairOutcome.Unknown;

            int outcome = pair.Player1Card.CompareTo(pair.Player2Card);

            switch (outcome)
            {
                case -1:
                    returnValue = PlayingCardPairOutcome.Player2Wins;
                    break;
                case 0:
                    returnValue = PlayingCardPairOutcome.Draw;
                    break;
                case 1:
                    returnValue = PlayingCardPairOutcome.Player1Wins;
                    break;
                default:
                    break;
            }

            return returnValue;
        }
Beispiel #2
0
        /// <summary>
        /// For the given game, run a round.
        /// </summary>
        /// <param name="g">The game to run a round for.</param>
        /// <returns>The round.  Also update the status of the game as required.</returns>
        public GameRound RunRound(Game g)
        {
            #region Private Members
            if (g == null)
            {
                throw new ArgumentNullException("g");
            }
            if (g.Player1 == null)
            {
                throw new ArgumentNullException("g.Player1");
            }
            if (g.Player2 == null)
            {
                throw new ArgumentNullException("g.Player2");
            }
            #endregion

            GameRound returnValue = new GameRound();

            //1. While the outcome of the card pair is in question:
            while (returnValue.Outcome == GameRoundOutcome.Unknown)
            {
                //A. Create a Card Pair
                PlayingCardPair pair = new PlayingCardPair();
                pair.Player1Card = g.Player1.GetNextCard();
                pair.Player2Card = g.Player2.GetNextCard();

                //B. Determine the outcome of the Pair
                pair.Status = this.GetPairOutcome(pair);

                returnValue.Pairs.Add(pair);

                //C. Loop if there was not a winner.
                if (pair.Status == PlayingCardPairOutcome.Player1Wins)
                {
                    returnValue.Outcome = GameRoundOutcome.Player1Winner;
                }
                else if (pair.Status == PlayingCardPairOutcome.Player2Wins)
                {
                    returnValue.Outcome = GameRoundOutcome.Player2Winner;
                }
                else
                {
                    if (g.Player1.CardsRemaining == 0 && g.Player2.CardsRemaining == 0)
                    {
                        returnValue.Outcome = GameRoundOutcome.Draw;
                    }
                    else
                    {
                        //D. In the case of a draw, add the burn card.
                        pair = new PlayingCardPair();
                        pair.Player1Card = g.Player1.GetNextCard();
                        pair.Player2Card = g.Player2.GetNextCard();
                        pair.Status = PlayingCardPairOutcome.FaceDown;

                        returnValue.Pairs.Add(pair);
                    }
                }
            }

            //2. Add the Loser's and Winner's cards to the winner's queue.
            GamePlayer roundWinner = null;

            switch (returnValue.Outcome)
            {
                case GameRoundOutcome.Player1Winner:
                    roundWinner = g.Player1;
                    break;
                case GameRoundOutcome.Player2Winner:
                    roundWinner = g.Player2;
                    break;
                case GameRoundOutcome.Draw:
                case GameRoundOutcome.Unknown:
                default:
                    break;
            }

            if (roundWinner != null)
            {
                foreach (PlayingCardPair p in returnValue.Pairs)
                {
                    roundWinner.StoreCard(p.Player1Card);
                    roundWinner.StoreCard(p.Player2Card);
                }
            }

            //3. Determine if there was a game winner.
            DetermineGameWinner(g, returnValue);

            //3. Log the results
            this.LogRoundResults(g, returnValue);

            //4. Return the round.
            return returnValue;
        }