public void Update(WinsInstruction instruction) { var profit = instruction.Value; if (Settings.YourBot != instruction.Name) { profit = -profit; } Actor.ApplyProfit(profit); }
public void Simulate(NodeCollection nodes, MT19937Generator rnd) { var bots = new Dictionary<PlayerName, ACDCBot>() { { PlayerName.player1, GetBot(nodes, PlayerName.player1, rnd) }, { PlayerName.player2, GetBot(nodes, PlayerName.player2, rnd) }, }; var matches = new Matches(); matches.Round = 1; var stack1 = 2000; var stack2 = 2000; var blind = 20; for (var round = 1; round < int.MaxValue; round++) { if (round % 10 == 0) { blind += 10; } var small = blind >> 1; matches.Round = round; matches.Current.Player1.Stack = stack1; matches.Current.Player2.Stack = stack2; var mirrored = (round & 1) == 0; var shuffled = Cards.GetShuffledDeck(rnd); var deck1 = Cards.Empty; var deck2 = Cards.Empty; var tabl0 = Cards.Empty; var tabl3 = Cards.Empty; var tabl4 = Cards.Empty; var tabl5 = Cards.Empty; deck1.AddRange(shuffled.Take(2)); deck2.AddRange(shuffled.Skip(2).Take(2)); tabl3.AddRange(shuffled.Skip(4).Take(3)); tabl4.AddRange(shuffled.Skip(4).Take(4)); tabl5.AddRange(shuffled.Skip(4).Take(5)); var tables = new Cards[] { tabl0, tabl3, tabl4, tabl5 }; matches.Current.BigBlind = blind; matches.Current.SmallBlind = small; matches.Current.Player1.Hand = deck1; matches.Current.Player2.Hand = deck2; SetPot(matches.Current, mirrored); var outcome = PlayerName.None; var showdown = false; foreach (var table in tables) { matches.Current.Table = table; outcome = SimulateRound(matches, bots); if (outcome != PlayerName.None) { break; } } if (outcome == PlayerName.None) { showdown = true; outcome = PokerHandEvaluator.GetOutcome(deck1, deck2, tabl5); } if (outcome == PlayerName.None) { matches.Current.Player1.Stack += matches.Current.Pot >> 1; matches.Current.Player2.Stack += matches.Current.Pot >> 1; } else { var realoutcome = outcome; if (!showdown) { realoutcome = PokerHandEvaluator.GetOutcome(deck1, deck2, tabl5); } matches.Current[outcome].Stack += matches.Current.Pot; if (realoutcome == outcome) { var wins = new WinsInstruction(outcome, matches.Current.Pot); bots[PlayerName.player1].Update(wins); bots[PlayerName.player2].Update(wins); } // A bot chickened later, but that should not matter for the bits it played. else { bots[PlayerName.player1].Update(new WinsInstruction(PlayerName.player1, matches.Current.Pot)); bots[PlayerName.player2].Update(new WinsInstruction(PlayerName.player2, matches.Current.Pot)); } } matches.Current.Player1.Pot = 0; matches.Current.Player2.Pot = 0; stack1 = matches.Current.Player1.Stack; stack2 = matches.Current.Player2.Stack; if (stack1 < blind || stack2 < blind) { break; } } }