예제 #1
0
        /// <summary>
        /// Log the results of a single round for a game or War.
        /// </summary>
        /// <param name="g">The game instance.</param>
        /// <param name="round">The round instance.</param>
        protected internal void LogRoundResults(Game g, GameRound round)
        {
            #region Param Checking
            if (g == null)
            {
                throw new ArgumentNullException("g");
            }
            if (round == null)
            {
                throw new ArgumentNullException("round");
            }
            if (g.Player1 == null)
            {
                throw new ArgumentNullException("g.Player1");
            }
            if (g.Player2 == null)
            {
                throw new ArgumentNullException("g.Player2");
            }
            #endregion

            try
            {
                using (StreamWriter stream = File.AppendText(g.PathToGameLog))
                {
                    stream.Write(string.Format(round.ToString(), (g.Player1.Name ?? "<UNKNOWN>"), (g.Player2.Name ?? "<UNKNOWN>")));
                    stream.WriteLine(g.ToString());

                    switch (g.Status)
                    {
                        case GameStatus.Player1Wins:
                            stream.WriteLine("*********************************************");
                            stream.WriteLine(string.Format("** {0} Wins!", g.Player1.Name));
                            stream.WriteLine("*********************************************");
                            break;
                        case GameStatus.Player2Wins:
                            stream.WriteLine("*********************************************");
                            stream.WriteLine(string.Format("** {0} Wins!", g.Player2.Name));
                            stream.WriteLine("*********************************************");
                            break;
                        case GameStatus.Draw:
                            break;
                        case GameStatus.InProgress:
                        case GameStatus.NotStarted:
                        case GameStatus.Unknown:
                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("There wa an exception writing to the log file.  See the inner exception for details.", ex);
            }
        }
예제 #2
0
        /// <summary>
        /// Start a new game.
        /// </summary>
        /// <param name="player1Name">The name of player 1.</param>
        /// <param name="player2Name">The name of player 2.</param>
        /// <returns>The newly started game.</returns>
        public Game StartGame(string player1Name, string player2Name)
        {
            #region Param Checking
            if (String.IsNullOrWhiteSpace(player1Name))
            {
                throw new ArgumentNullException("player1Name");
            }
            if (String.IsNullOrWhiteSpace(player2Name))
            {
                throw new ArgumentNullException("player2Name");
            }
            #endregion

            GamePlayer p1 = new GamePlayer(player1Name);
            GamePlayer p2 = new GamePlayer(player2Name);

            PlayingDeck deck = null;

            try
            {
                deck = this.DeckService.GetDeck();

                int shuffleCount = this.ShuffleAmount;

                for (int i = 0; i < shuffleCount; i++)
                {
                    this.DeckService.ShuffleDeck(deck);
                }

                for (int j = 0; j < deck.UndealtCards.Count; j += 2)
                {
                    p1.Cards.Enqueue(deck.UndealtCards[j]);

                    //Odd case where there is an uneven number of cards in the deck.
                    if (deck.UndealtCards.Count > j + 1)
                    {
                        p2.Cards.Enqueue(deck.UndealtCards[j + 1]);
                    }

                }

                deck.UndealtCards.Clear();
            }
            catch (Exception ex)
            {
                throw new Exception("There was a problem dealing out the cards.  See inner exception for details.", ex);
            }

            Game g = null;

            try
            {
                g = new Game(p1, p2, deck, this.LogFilePath);

                g.Status = GameStatus.InProgress;
            }
            catch (Exception ex)
            {
                throw new Exception("There was an exception initializing the game.  See inner exception for details.", ex);
            }

            return g;
        }
예제 #3
0
        /// <summary>
        /// Determine the status of a game and if there is a winner.
        /// </summary>
        /// <param name="g">The game instance.</param>
        /// <param name="round">The round instance.</param>
        protected internal void DetermineGameWinner(Game g, GameRound round)
        {
            #region Param Checking
            if (g == null)
            {
                throw new ArgumentNullException("g");
            }
            if (round == null)
            {
                throw new ArgumentNullException("round");
            }
            if (g.Player1 == null)
            {
                throw new ArgumentNullException("g.Player1");
            }
            if (g.Player2 == null)
            {
                throw new ArgumentNullException("g.Player2");
            }
            #endregion

            switch (round.Outcome)
            {
                case GameRoundOutcome.Player1Winner:
                    g.Status = g.Player2.CardsRemaining == 0 ? GameStatus.Player1Wins : GameStatus.InProgress;
                    break;
                case GameRoundOutcome.Player2Winner:
                    g.Status = g.Player1.CardsRemaining == 0 ? GameStatus.Player2Wins : GameStatus.InProgress;
                    break;
                case GameRoundOutcome.Draw:
                    g.Status = GameStatus.Draw;
                    break;
                default:
                    g.Status = GameStatus.InProgress;
                    break;
            }
        }
예제 #4
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;
        }