/// <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; }
/// <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; }