Beispiel #1
0
        /// <summary>
        /// When a player claims a trick a next trick is started
        /// Thus the lastTrick is the previous CurrentTrick
        /// The CurrentTrick is set to be empty for each player
        /// </summary>
        public void TrickClaimed(string claimingPlayer)
        {
            if (CurrentTrick.Count < 4)
            {
                return;
            }

            LastTrick = new Dictionary <string, Card>(CurrentTrick);

            int           valueOfTrick  = 0;
            List <string> activePlayers = PlayerStates.Keys.ToList();

            foreach (string players in activePlayers)
            {
                valueOfTrick += CurrentTrick[players].points;
                AllPlayedCards.Add(new Card(CurrentTrick[players]));
                AllPlayedCardsNames.Add(players);
            }
            PlayerStates[claimingPlayer].Points += valueOfTrick;
            PlayerStates[claimingPlayer].numTricks++;

            AllPlayedCardsNames.Add(claimingPlayer);
            AllPlayedCardsNames.Add(valueOfTrick.ToString());

            CurrentTrick = new Dictionary <string, Card>();

            int?numCards = null;

            foreach (string player in PlayerStates.Keys)
            {
                if (numCards == null)
                {
                    numCards = PlayerStates[player].Hand.Count;
                }
                else if (PlayerStates[player].Hand.Count != numCards)
                {
                    throw new System.Exception("number of cards of players differ");
                }
            }

            // set to phase "playing" after first complete trick.
            // maybe people want to withdraw and go back to initial phase for trading cards
            if (numCards > 0)
            {
                gamePhase = GamePhase.Playing;
            }
            else
            {
                gamePhase = GamePhase.Done;
            }
        }
        /// <inheritdoc />
        public override void Play()
        {
            Log();
            // create the first iteration with a simple movement controller
            var currentIteration = CreateIteration <WarCardRoundIteration, SimplePlayerMoveController, WarCardTray>();

            currentIteration.Logger = Logger;
            currentIteration.Play();
            // detect conflict and enter war mode if possible
            while (currentIteration.HasConflict)
            {
                var playersInConflict = currentIteration.PlayersInConflict;
                Logger?.Information("---------------Conflict--------------");
                Logger?.Information("Conflict has been found between players");
                foreach (var player in playersInConflict)
                {
                    Logger?.Information($"Player: {player}");
                }
                Logger?.Information("-------------------------------------");

                currentIteration =
                    CreateIteration <WarCardRoundIteration, WarPlayerMovementController, WarCardTray>(playersInConflict);
                currentIteration.Logger = Logger;
                currentIteration.Play();
            }

            Logger?.Information($"{Winner} Won the round and will claim {AllPlayedCards.Count()} cards");
            Winner?.Deck.Put(AllPlayedCards);
            // Eliminate players with an empty deck
            foreach (var player in Players)
            {
                if (!player.Deck.CanPick)
                {
                    player.Status = PlayerStatus.Lost;
                }
            }
        }