// executes a single trick and stores state in a new TrickContext instance, as well private async Task PlaySingleTrick(int trickNum) { await _frontend.DisplayStartTrick(trickNum); _gameContext.CurRound.Tricks.Add(new TrickContext(trickNum)); var curRound = _gameContext.CurRound; var curTrick = curRound.CurTrick; Player leader = trickNum == 1 ? leader = _players[(_players.IndexOf(curRound.Dealer) + 1) % _players.Count] : leader = curRound.PrevTrick.Winner; int leaderIndex = _players.IndexOf(leader); // create a player list that starts at the trick leader and wraps around List <Player> trickPlayerOrder = _players .GetRange(leaderIndex, _players.Count - leaderIndex) .Concat(_players.GetRange(0, leaderIndex)).ToList(); foreach (var player in trickPlayerOrder) { var cardPlayed = await player.MakeTurn(_gameContext); curTrick.CardsPlayed.Add(cardPlayed); await _frontend.DisplayTurnTaken(cardPlayed, player); } // find winner and save it to trick context var winningCard = CardUtils.CalcWinningCard(curTrick.CardsPlayed, curRound.TrumpSuite, curTrick.LeadingSuite); var winningPlayer = trickPlayerOrder[curTrick.CardsPlayed.IndexOf(winningCard)]; curTrick.Winner = winningPlayer; curTrick.WinningCard = winningCard; await _frontend.DisplayTrickWinner(_gameContext.CurRound); await _frontend.DisplayEndTrick(trickNum); }