コード例 #1
0
        // 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);
        }