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