public async Task Play(IEnumerable <IPlayer> players, ICardDealer dealer, ICardDeck deck, ICardTransport transport, ICentralPile centralPile) { deck.Shuffle(); DumpState("Deck", players, centralPile.GetAll()); dealer.Deal(deck, players); while (!HasWinner && players.Any(p => !p.Hand.IsEmpty)) { foreach (var player in players) { player.TakeTurn(centralPile, transport); } DumpState("Play", players, centralPile.GetAll()); await ProcessPlayerSnaps(players, centralPile, transport); if (players.Where(o => o.Hand.IsEmpty).Count() == (players.Count() - 1)) { var winner = (from p in players orderby p.Hand.Count descending select p) .First(); Winner = winner; } } }