public Game(Rules rules, Agent agent, double pp_multiplier, Random random) { dealer_hand = new Hand(); player_handset = new HandSet(); shoe = new CardSet(); this.rules = rules; this.agent = agent; this.pp_multiplier = pp_multiplier; this.random = random; this.player_money = 0; this.bet = rules.MinBet; this.split_count = 0; party_points = 0; ResetShoe(); }
static void CompareStrategies() { Random masterRandom = new NPack.MersenneTwister(); Random random1 = new NPack.MersenneTwister(); Random random2 = new NPack.MersenneTwister(); Rules rules = new Rules { Decks = 8, MinBet = 100, MaxBet = 20000, Splits = 3 }; int max_bet = 5000; double pp_multiplier = 4.0; double ev_cutoff = 0.0015; DiffStrategy b1 = new DiffStrategy( new SuperOptStrategy(max_bet, ev_cutoff, pp_multiplier), new OptStrategy(max_bet, ev_cutoff, pp_multiplier) ); OptStrategy b2 = new OptStrategy(max_bet, ev_cutoff, pp_multiplier); Game game1 = new Game(rules, b1, pp_multiplier, random1); Game game2 = new Game(rules, b2, pp_multiplier, random2); int runs = 0; double expected = 0; double expected_diff = 0; int diff_count = 0; while (true) { if (runs % 1000 == 0) { double total1 = TotalMoney(game1); double total2 = TotalMoney(game2); Console.WriteLine(); Console.WriteLine("Runs: {0}", runs); Console.WriteLine("Expected total: $ {0:0.00}", expected); Console.WriteLine("SuperOpt total: $ {1:0.00} ({2:0.00} c/hand)", b1.GetType(), total1, total1 * 100.0 / (double)runs); Console.WriteLine("Opt total: $ {1:0.00} ({2:0.00} c/hand)", b2.GetType(), total2, total2 * 100.0 / (double)runs); Console.WriteLine("Different choices: {0:0} ({1:0.00}%)", diff_count, 100.0 * diff_count / (double)runs); Console.WriteLine("Difference: $ {0:0.00}", total1 - total2); Console.WriteLine("Expected difference: $ {0:0.00}", expected_diff); TextWriter writer = new StreamWriter("compare.txt", true); writer.WriteLine(string.Format("{0} {1} {2} {3}", runs, expected, TotalMoney(game1), TotalMoney(game2))); writer.Close(); } int seed = masterRandom.Next(); game1.Random = new NPack.MersenneTwister(seed); game2.Random = new NPack.MersenneTwister(seed); game1.ResetShoe(); game2.ResetShoe(); int remove_count = masterRandom.Next(84); game1.RemoveCards(remove_count); game2.RemoveCards(remove_count); expected += b1.ShoeEV() * b1.Bet(game1) / 100.0; game1.StartRound(); game2.StartRound(); game1.DealRound(); game2.DealRound(); if (b1.IsDiff) { expected_diff += game1.Bet * b1.Diff / 100.0; diff_count++; b1.IsDiff = false; } runs++; } }
static void TestSuper() { Random random = new NPack.MersenneTwister(); Rules rules = new Rules { Decks = 8, MinBet = 100, MaxBet = 20000, Splits = 3 }; int max_bet = 5000; double pp_multiplier = 4.0; double ev_cutoff = 0.0015; SuperOptStrategy b = new SuperOptStrategy(max_bet, ev_cutoff, pp_multiplier); //PseudoOptStrategy b = new PseudoOptStrategy(); Game game = new Game(rules, b, pp_multiplier, random); game.PlayerMoney = 0; double expected_money = (double)game.PlayerMoney; game.Bet = 100; // 1$ int lowest = game.PlayerMoney, highest = game.PlayerMoney; int runs = 0; while (true) { double total_money = (game.PlayerMoney + pp_multiplier * game.PartyPoints) / 100.0; if (runs % 10000 == 0) { Console.WriteLine("runs: " + runs + " win: " + (double)game.PlayerMoney / 100.0 + "$" + " pp: " + game.party_points); Console.WriteLine("lowest: " + (double)lowest / 100.0 + "$" + " highest: " + (double)highest / 100.0 + "$"); Console.WriteLine("total: " + total_money + "$ | expected: " + expected_money / 100.0 + "$"); Console.WriteLine(); } game.StartRound(); game.DealRound(); expected_money += b.ShoeEV() * game.Bet; if (game.PlayerMoney < lowest) lowest = game.PlayerMoney; if (game.PlayerMoney > highest) highest = game.PlayerMoney; runs++; } }
static void MakeTestRun(int run_number, Random random, int targetRuns, double ev_cutoff, BettingSystem betting_system, ResetSystem reset) { Console.WriteLine(run_number + " - EV cutoff " + ev_cutoff + " " + betting_system); TextWriter deal_file = new StreamWriter(string.Format("expected{0}.txt", run_number)); TextWriter roll_file = new StreamWriter(string.Format("roll{0}.txt", run_number)); double pp_multiplier = 0; Rules rules = new Rules { Decks = 8, MinBet = 100, MaxBet = 20000, Splits = 3 }; //OptStrategy b = new OptStrategy(10000, ev_cutoff, pp_multiplier); BasicStrategy b = new BasicStrategy(20000, ev_cutoff, pp_multiplier, betting_system); Game game = new Game(rules, b, pp_multiplier, random); int start_roll = 20000 * 100; //game.PlayerMoney = 10000000; // 100000$ game.PlayerMoney = start_roll; double expected_money = (double)game.PlayerMoney; game.Bet = 100; // 1$ double lowest = TotalMoney(game), highest = TotalMoney(game); int runs = 0; double total_big_bet_ev = 0; double total_big_bet = 0; int num_big_bets = 0; int resets = 0; int reset_counter = 0; bool written_200k = false; while (true) { double total_money = TotalMoney(game); if (total_money < lowest) lowest = total_money; if (total_money > highest) highest = total_money; if (runs % 5000 == 0) { Console.WriteLine(runs + " " + (double)game.PlayerMoney / 100.0 + "$" + " pp: " + game.PartyPoints + " expected: " + expected_money / 100.0 + "$"); Console.WriteLine("lowest: " + (double)lowest + "$" + " highest: " + (double)highest + "$"); Console.WriteLine("Total: ${0}", game.PlayerMoney/100.0); Console.WriteLine("Expected: ${0}", expected_money/100.0); /*Console.WriteLine("Average big bet: {0:0.00} ({1:0.0000})", (total_big_bet / 100.0) / num_big_bets, (total_big_bet_ev / 100.0) / num_big_bets); Console.WriteLine("Resets {0} ({1:0.000}%)", resets, resets / (double)runs); */ Console.WriteLine(); } if (game.PlayerMoney <= 0) { deal_file.WriteLine(expected_money / 100.0); roll_file.WriteLine(game.PlayerMoney / 100.0); Write200kResult(0); WriteFinalResult(0); break; } if (runs % 1000 == 0) { //file.WriteLine(string.Format("{0} {1} {2} {3} {4} {5}", runs, game.PlayerMoney / 100.0, game.PartyPoints, total_money, lowest, highest)); deal_file.WriteLine(expected_money / 100.0); roll_file.WriteLine(game.PlayerMoney / 100.0); if (runs >= targetRuns) { if (!written_200k) { Write200kResult(game.PlayerMoney / 100.0); written_200k = true; } if (game.PlayerMoney >= start_roll) { WriteFinalResult(game.PlayerMoney / 100.0); break; } } //if (game.party_points >= 20000) break; } if (reset_counter > 0) { reset_counter--; runs++; continue; } if (reset!=null && reset.Reset(52 * game.Rules.Decks - game.Shoe.Count, b.ShoeEV())) { resets++; runs++; reset_counter = 1; game.ResetShoe(); continue; } b.CurrentRoll = game.PlayerMoney; Shoe shoe = new Shoe(8); shoe.Clear(); shoe.Add(game.Shoe); game.StartRound(); game.DealRound(); Card p1 = game.PlayerHandSet[0][0], p2 = game.PlayerHandSet[0][1], d = game.DealerHand[0]; shoe.Remove(p1); shoe.Remove(p2); shoe.Remove(d); BjEval.Eval.CacheDealerProbs(d.PointValue, shoe.ToArray()); double deal_ev = BjEval.Eval.DealEv( p1.PointValue, p2.PointValue, d.PointValue, shoe.ToArray(), game.Bet); //Console.WriteLine("EV: {0} {1} {2} {3} {4}", p1.PointValue, p2.PointValue, d.PointValue, shoe.CardCount, deal_ev); expected_money += deal_ev * game.Bet; if (game.Bet > 100) { total_big_bet += game.Bet; total_big_bet_ev += game.Bet * deal_ev; num_big_bets++; } runs++; } deal_file.Close(); roll_file.Close(); b.Stop(); }
static void CompareStrategies2() { Random masterRandom = new NPack.MersenneTwister(); Rules rules = new Rules { Decks = 8, MinBet = 100, MaxBet = 20000, Splits = 3 }; int max_bet = 5000; double pp_multiplier = 4.0; double ev_cutoff = 0.0015; SuperOptStrategy b1 = new SuperOptStrategy(max_bet, ev_cutoff, pp_multiplier); OptStrategy b2 = new OptStrategy(max_bet, ev_cutoff, pp_multiplier); BasicStrategy b3 = new BasicStrategy(max_bet, ev_cutoff, pp_multiplier); Game game1 = new Game(rules, b1, pp_multiplier, new NPack.MersenneTwister()); Game game2 = new Game(rules, b2, pp_multiplier, new NPack.MersenneTwister()); Game game3 = new Game(rules, b3, pp_multiplier, new NPack.MersenneTwister()); int runs = 0; double expected = 0; while (true) { if (runs % 10000 == 0) { double total1 = TotalMoney(game1); double total2 = TotalMoney(game2); double total3 = TotalMoney(game3); Console.WriteLine(); Console.WriteLine("Runs: {0}", runs); Console.WriteLine("Expected total: $ {0:0.00}", expected); Console.WriteLine("SuperOpt total: $ {1:0.00} ({2:0.00} c/hand)", b1.GetType(), total1, total1 * 100.0 / (double)runs); Console.WriteLine("Opt total: $ {1:0.00} ({2:0.00} c/hand)", b2.GetType(), total2, total2 * 100.0 / (double)runs); Console.WriteLine("Basic total: $ {1:0.00} ({2:0.00} c/hand)", b3.GetType(), total3, total3 * 100.0 / (double)runs); TextWriter writer = new StreamWriter("compare.txt", true); writer.WriteLine(string.Format("{0} {1} {2} {3} {4}", runs, expected, total1, total2, total3)); writer.Close(); } int seed = masterRandom.Next(); game1.Random = new NPack.MersenneTwister(seed); game2.Random = new NPack.MersenneTwister(seed); game3.Random = new NPack.MersenneTwister(seed); game1.ResetShoe(); game2.ResetShoe(); game3.ResetShoe(); int remove_count = masterRandom.Next(84); game1.RemoveCards(remove_count); game2.RemoveCards(remove_count); game3.RemoveCards(remove_count); expected += b1.ShoeEV() * b1.Bet(game1) / 100.0; game1.StartRound(); game2.StartRound(); game3.StartRound(); game1.DealRound(); game2.DealRound(); game3.DealRound(); runs++; } }