示例#1
0
        // simulates playing each card in _hand against an in-progress trick, plays random cards to finish and score the trick
        // returns a dictionary of cards in _hand to number of wins
        // @param hiddenCards refers to the cards in the deck that could potentialy be played by other players
        private Dictionary <Card, int> SimulateTrick(TrickContext trick, List <Card> hiddenCards, CardSuite trumpSuite, int playerCount, int simCount)
        {
            var playableCards = CardUtils.GetPlayableCards(_hand, trick.LeadingSuite);
            Dictionary <Card, int> winsByCard = playableCards.Aggregate(new Dictionary <Card, int>(), (acc, card) => { acc[card] = 0; return(acc); });

            for (int i = 0; i < simCount; i++)
            {
                foreach (var card in playableCards)
                {
                    var curSimRemainingCards = new List <Card>(hiddenCards);
                    var simPlayedCards       = new List <Card>(trick.CardsPlayed);
                    simPlayedCards.Add(card);

                    // each remaining player plays a random card from a randomly generated hand
                    for (int j = simPlayedCards.Count(); j < playerCount; j++)
                    {
                        // rand hand selected from the remaining cards specific to this simulation
                        var randHand = takeRandomCardsFromList(curSimRemainingCards, _hand.Count());
                        var playableCardsFromRandHand = CardUtils.GetPlayableCards(randHand, trick.LeadingSuite);
                        simPlayedCards.Add(playableCardsFromRandHand[_rand.Next() % playableCardsFromRandHand.Count()]);
                    }
                    var winningCard = CardUtils.CalcWinningCard(simPlayedCards, trumpSuite, trick.LeadingSuite);

                    if (card.Equals(winningCard))
                    {
                        winsByCard[card]++;
                    }
                }
            }

            return(winsByCard);
            //Dictionary<Card, double> winPercentagesByCard = new Dictionary<Card, double>();
            //foreach(var winCardPair in winsByCard)
            //{
            //    double winPctg = winCardPair.Value * 1.0 / SIMULATION_COUNT;
            //    winPercentagesByCard[winCardPair.Key] = winPctg;
            //}
            //return winPercentagesByCard;
        }
示例#2
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[trickNum] = 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();

            for (int i = 0; i < trickPlayerOrder.Count; i++)
            {
                var player     = trickPlayerOrder[i];
                var cardPlayed = await player.MakeTurn(_gameContext);

                curTrick.CardsPlayed[i] = cardPlayed;
                await _frontend.DisplayTurnTaken(cardPlayed, player);
            }

            // find winner and save it to trick context
            var winningCard   = CardUtils.CalcWinningCard(curTrick.CardsPlayed.Values.ToList(), curRound.TrumpSuite, curTrick.LeadingSuite);
            var winningPlayer = trickPlayerOrder[curTrick.CardsPlayed.Values.ToList().IndexOf(winningCard)];

            curTrick.Winner      = winningPlayer;
            curTrick.WinningCard = winningCard;
            await _frontend.DisplayTrickWinner(_gameContext.CurRound);

            await _frontend.DisplayEndTrick(trickNum);
        }