public async Task StartRoundAsync() { var deck = Card.ShuffledDeck(); foreach (PlayerLog playerLog in playerLogs) { var cardsPassed = deck.Take(13).ToList(); playerLog.Hand = cardsPassed; foreach (Card card in cardsPassed) { deck.Remove(card); } } var startPlayer = playerLogs.Single(p => p.Hand.Any(card => card.Rank == Rank.Two && card.Suit == Suit.Clubs)); while (startPlayer.Hand.Count > 0) { var currentTrick = new List <Move>(); PlayerLog currentPlayer = startPlayer; while (currentTrick.Count < 4) { var cardPlayed = await currentPlayer.PlayCardAsync().ConfigureAwait(false); foreach (IPlayer player in playerLogs.Select(l => l.Player)) { player.NotifyCardPlayed(cardPlayed); } currentTrick.Add(new Move(currentPlayer, cardPlayed)); var currentPlayerIndex = playerLogs.IndexOf(currentPlayer); currentPlayer = playerLogs[(currentPlayerIndex + 1) % 4]; } var firstSuit = currentTrick.Single(move => move.Player == startPlayer).Card.Suit; startPlayer = (from move in currentTrick orderby move.Card.Rank descending where move.Card.Suit == firstSuit select move.Player).First(); startPlayer.Score += CalculateScore(currentTrick.Select(move => move.Card).ToList()); } }
public Game(params IPlayer[] players) { if (players.Length != 4) { throw new ArgumentException("Exactly 4 players must play.", nameof(players)); } const int count = 0; foreach (IPlayer player in players) { playerLogs[count] = new PlayerLog { Player = player }; } }