// 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; }
// 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); }