/// <summary> /// Place the specified card by the specified player in the current trick. /// And evaluate the trick to determine the winner /// </summary> public void PlaceCard(Player player, Card card) { PlayerPosition position = gameSession.GetPlayerPosition(player); if (position == CurrentTurn) { Card tempCard; if (!CurrentTrick.TryGetValue(position, out tempCard)) { if (ValidatePlay(position, card)) { CurrentTrick[position] = card; PlayerCards[position].Remove(card); if (CurrentTrick.Values.Count == 1) { //First card in the trick CurrentTrickBaseSuit = card.Suit; } if (CurrentTrick.Values.Count >= 4) { //Trick is complete -> evalueate PlayerPosition trickWinner = EvaluateCurrentTrick(); CurrentTurn = trickWinner; switch (trickWinner) { case PlayerPosition.North: case PlayerPosition.South: TricksWon[TeamPosition.NorthSouth]++; break; case PlayerPosition.East: case PlayerPosition.West: TricksWon[TeamPosition.EastWest]++; break; } CleanCurrentTrick(); currentNumberOfTricks++; if (IsComplete) { gameSession.GameComplete(); } } else { NextTurn(); } } else { throw new ArgumentException("The played card is invalid"); } } else { throw new InvalidOperationException("The player already placed card for the current trick"); } } else { throw new InvalidOperationException("The player has played not in the right turn"); } }