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