Example #1
0
        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();
        }
Example #2
0
        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++;
            }
        }
Example #3
0
        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++;
            }
        }
Example #4
0
        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();
        }
Example #5
0
        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++;
            }
        }