Пример #1
0
 public void DoSingleTree(Dictionary<Card, int> possibles, Card card)
 {
     var newTrick = new TrickSimulator(Round);
     newTrick.AddCardToPile(card, player.Number);
     var hands = GetHands();
     hands[player.Number].Remove(card);
     int result = RecBruteForceRound(new int[4], hands, GetNextPlayer(player.Number), newTrick, 0);
     lock (possibles)
     {
         possibles.Add(card, result);
     }
 }
Пример #2
0
        public Card BruteForceRound()
        {
            var cards = player.hand.Cards;
            var possibleCards = cards.Where(c => Round.IsValidPlay(c));

            var trickPossibilities = new List<TrickSimulator>();
            var initialTrick = new TrickSimulator(Round);

            var possibles = new Dictionary<Card, int>();

            Parallel.ForEach(possibleCards, (card) => { DoSingleTree(possibles, card); });
            return possibles.Where(p => p.Value == possibles.Values.Max()).First().Key;
        }
Пример #3
0
        public int RecBruteForceRound(int[] trickWins, List<Card>[] hands, int currentPlayer, TrickSimulator currentTrick, int depth)
        {
            if (depth > 3 || hands.All(h => h.Count == 0))//round is over.
            {
                int teamTricks = 0;
                foreach (Player p in Round.Teams.Where(t => t.Players.Any(p => p == player)).Single().Players)
                {
                    teamTricks += trickWins[p.Number];
                }
                return teamTricks;
            }

            if (currentTrick.TrickEnded())
            {
                trickWins[currentTrick.TrickWinner()]++;
                currentTrick = new TrickSimulator(Round.Trump);
            }

            var possibles = new List<int>();

            var copyOfHand = hands[currentPlayer].ToArray();
            foreach (Card card in copyOfHand)
            {
                if (currentTrick.IsValidCard(card, hands[currentPlayer]))
                {
                    var newTrick = currentTrick.Copy();
                    newTrick.AddCardToPile(card, currentPlayer);
                    hands[currentPlayer].Remove(card);
                    int[] newTrickwins = new int[4];
                    trickWins.CopyTo(newTrickwins, 0);
                    possibles.Add(RecBruteForceRound(newTrickwins, hands, GetNextPlayer(currentPlayer), newTrick, depth++));

                    hands[currentPlayer].Add(card);
                }
            }

            if (Round.Teams.Where(t => t.Players.Any(p => p == player)).Single().Players.Any(p => p.Number == currentPlayer))
                return possibles.Max();
            else
                return possibles.Min();
        }
Пример #4
0
        public void RecBruteForceTrick(List<TrickSimulator> tricks, TrickSimulator trick, List<Card>[] hands, int currentPlayer)
        {
            if (trick.TrickEnded())
            {
                tricks.Add(trick);// trick.TrickWinner();
            }

            foreach (var card in hands[currentPlayer])
            {
                if (trick.IsValidCard(card, hands[currentPlayer]))
                {
                    var newTrick = trick.Copy();
                    newTrick.AddCardToPile(card, currentPlayer);
                    RecBruteForceTrick(tricks, newTrick, hands, GetNextPlayer(currentPlayer));
                }
            }
        }
Пример #5
0
 public TrickSimulator Copy()
 {
     var copy = new TrickSimulator(trump);
     for (int i = 0; i < pile.Count(); i++)
     {
         copy.pile[i] = pile[i];
         copy.players[i] = players[i];
     }
     return copy;
 }