Пример #1
0
 def reset(self):
     if 1 in player.players:
         player.remove_player(1)
     player.add_player(1, self.name)
     self.player = player.players[1]
     self.hooks = BlackjackHooks(self.strat, self.bet_system, self.output)
     self.hooks.set_anti_fallacy(self.anti_fallacy)
     self.hooks.set_positive_prog(self.positive_prog)
     self.player.hooks = self.hooks
     self.stats = stats.BlackjackStats()
     self.reset_gold()
     self.bet_system.set_player(self.player)
     self.bet_system.reset()
Пример #2
0
 def __init__(self, strat, bet_system, bet_options, starting_gold,
              target_gold, uid):
     self.uid = int(uid)
     player.add_player(self.uid, self.name)
     self.player = player.players[self.uid]
     self.strat = strat
     self.bet_system = bet_system
     self.bet_system.set_player(self.player)
     self.bet_options = bet_options
     self.starting_gold = starting_gold
     self.target_gold = target_gold
     self.gold = starting_gold
     self.stats = stats.BlackjackStats()
     self.player.gold = self.gold
Пример #3
0
def worker(num, iterations, outq, bjs, rounds, gold):
    total_stats = stats.BlackjackStats()
    total_stats.gold_min = gold
    reasons = {}
    for _ in range(iterations):
        bjs.reset()
        (reason, st) = bjs.run(rounds)

        total_stats.add(st)
        if reason not in reasons:
            reasons[reason] = {"count": 0, "gold_end": [], "hands": []}
        reasons[reason]["count"] += 1
        reasons[reason]["gold_end"].append(st.gold_end)
        reasons[reason]["hands"].append(st.total_hands)
    outq.put((reasons, total_stats))
Пример #4
0
 def reset(self):
     self.stats = stats.BlackjackStats()
     self.gold = self.starting_gold
     self.stats.gold_start = self.starting_gold
     self.stats.gold_max = self.starting_gold
     self.stats.gold_min = self.starting_gold
     if self.uid in player.players:
         player.remove_player(self.uid)
     player.add_player(self.uid, self.name)
     self.player = player.players[self.uid]
     self.player.gold = self.gold
     self.bet_system.reset()
     self.bet_system.set_player(self.player)
     self.bet_system.set_starting_gold(self.starting_gold)
     self.ended = False
     return self
Пример #5
0
def worker(num, iterations, outq, bj, rounds, gold, players):
    total_stats = []
    reasons = []
    for i, _ in enumerate(players):
        total_stats.append(stats.BlackjackStats())
        total_stats[i].gold_min = gold[i]
        reasons.append({})
    for _ in range(iterations):
        bj.reset()
        pls = bj.run(rounds)

        for i, pl in enumerate(pls):
            total_stats[i].add(pl.stats)
            reason = pl.end_reason
            if reason not in reasons[i]:
                reasons[i][reason] = {"count": 0, "gold_end": [], "hands": []}
            reasons[i][reason]["count"] += 1
            reasons[i][reason]["gold_end"].append(pl.stats.gold_end)
            reasons[i][reason]["hands"].append(pl.stats.total_hands)
    outq.put((reasons, total_stats))
Пример #6
0
def main():
    if len(sys.argv) < 2:
        usage(sys.argv[0])
        sys.exit(1)

    try:
        opts, _ = getopt.getopt(sys.argv[1:], "hvf:s:i:g:b:o:pr:t:", [
            "help", "verbose", "threads=", "out-file=", "strat=", "iterations=", "gold=", "bet-system=", "bet-options=", "positive-prog", "list-bet-systems", "rounds=", "target=", "anti-fallacy"])
    except getopt.GetoptError as err:
        print(err)
        usage(sys.argv[0])
        sys.exit(2)

    verbose = False
    out_file = None

    def verbose_print(*args, **kwargs):
        if verbose:
            print(*args, **kwargs)

    def just_print(*args, **kwargs):
        print(*args, **kwargs)
        if out_file is not None:
            kwargs["file"] = out_file
            print(*args, **kwargs)

    # Default options
    iterations = 1
    starting_golds = []
    strat_file = "strats/strat.txt"

    bet_system_names = []
    bet_options = []
    bet_anti_fallacy = False
    bet_positive_prog = False

    # End conditions, at least one should be enabled
    target_gold = []
    rounds = 0

    threads = 0

    for o, a in opts:
        if o in ('-v', '--verbose'):
            verbose = True
        elif o in ('-h', '--help'):
            usage(sys.argv[0])
            sys.exit()
        elif o == '--threads':
            threads = int(a)
        elif o in ('-f', '--out-file'):
            out_file = open(a, mode='w')
        elif o in ('-s', '--strat'):
            strat_file = a
        elif o in ('-b', '--bet-system'):
            bet_system_names.append(a)
        elif o in ('-o', '--bet-options'):
            bet_options.append(a)
        elif o in ('-p', '--positive-prog'):
            bet_positive_prog = True
        elif o == '--list-bet-systems':
            print("Available betting systems:", ", ".join(
                sorted(BETTING_SYSTEMS.keys())))
            sys.exit()
        elif o in ('-i', '--iterations'):
            iterations = int(a)
        elif o in ('-r', '--rounds'):
            rounds = int(a)
        elif o in ('-g', '--gold'):
            starting_golds.append(int(a))
        elif o in ('-t', '--target'):
            target_gold.append(int(a))
        elif o == '--anti-fallacy':
            bet_anti_fallacy = True
        else:
            assert False, "unhandled option"

    if not (len(bet_system_names) == len(starting_golds)):
        just_print('You must have an equal amount of --bet-system and --gold')
        sys.exit(1)

    playernum = len(bet_system_names)

    if playernum > 6:
        just_print('6 players is the maximum, you provided', playernum, 'players.')
        sys.exit(1)

    if any(x not in BETTING_SYSTEMS for x in bet_system_names) or len(bet_system_names) == 0:
        just_print("Invalid betting system '{}'".format(bet_system_names))
        just_print("Available systems:", ", ".join(
            sorted(BETTING_SYSTEMS.keys())))
        sys.exit(1)

    if len(bet_system_names) > 0 and len(starting_golds) == 0:
        just_print("gold required to use a betting system")
        sys.exit(1)

    if len(target_gold) == 0 and rounds == 0:
        just_print(
            "At least one end condition (--target or --rounds) needs to be enabled.")
        sys.exit(1)

    if threads == 0:
        threads = multiprocessing.cpu_count()

    # we don't need 4 threads to run 1 iteration
    if iterations < threads:
        threads = iterations

    just_print("Casino Simulator 9000!")
    just_print("Using strat file:", strat_file)
    just_print("Using betting system:", bet_system_names)
    just_print("  with options:", bet_options)
    if bet_anti_fallacy:
        just_print("Using anti-fallacy strategy")
    just_print("Players: " + str(playernum))

    # if len(starting_golds) > 0:
    #     just_print()
    #     just_print("{:.<16}{:.>20,}".format("Starting gold", starting_gold))

    # if target_gold > 0:
    #     just_print("{:.<16}{:.>20,}".format("Gold target", target_gold))

    just_print("{:.<16}{:.>20,}".format("Max rounds", rounds))

    just_print()
    just_print("Running {0} iterations of blackjack using {1} processes...".format(
        iterations, threads))

    total_reasons = []

    def add_reasons(many_reasons):
        for i, reas in enumerate(many_reasons):
            total_reasons.append({})
            for reason in reas.keys():
                if reason not in total_reasons[i]:
                    total_reasons[i][reason] = reas[reason]
                else:
                    total_reasons[i][reason]["count"] += reas[reason]["count"]
                    total_reasons[i][reason]["gold_end"].extend(
                        reas[reason]["gold_end"])
                    total_reasons[i][reason]["hands"].extend(reas[reason]["hands"])

    out_q = multiprocessing.Queue()
    procs = []
    chunksize = int(math.ceil(iterations / float(threads)))

    bet_systems = [BETTING_SYSTEMS[name].from_options(bet_options[i]) for i, name in enumerate(bet_system_names)]

    strat = strategy.BlackjackStrategy.from_file(strat_file)

    # Track stats over all iterations my merging each iteration's
    # own stats instance with this one
    total_stats = []
    for i in range(playernum):
        players.append(simulator.Player(strat, bet_systems[i], bet_options[i], starting_golds[i], target_gold[i], str(i + 1)))
        total_stats.append(stats.BlackjackStats())
        total_stats[i].gold_start = starting_golds[i]
        total_stats[i].gold_min = starting_golds[i]
        if len(target_gold) >= playernum:
            total_stats[i].gold_target = target_gold[i]
        else:
            total_stats[i].gold_target = target_gold[0]

    bj = simulator.BlackjackSimulator(players)
    bj.set_anti_fallacy(bet_anti_fallacy)
    bj.set_positive_prog(bet_positive_prog)
    bj.set_target_gold(target_gold[0])

    start = time.perf_counter()
    # threads = 1
    for i in range(threads):
        p = multiprocessing.Process(
            target=worker,
            args=(i, chunksize, out_q, bj, rounds, starting_golds, players))
        procs.append(p)
        p.start()

    for _ in range(threads):
        (reasons, st) = out_q.get()
        add_reasons(reasons)
        for i in range(playernum):
            total_stats[i].add(st[i])

    for p in procs:
        p.join()

    end = time.perf_counter()

    just_print("Completed in {:.2f}s".format(end - start))
    just_print()

    # Display end reasons and stats
    just_print("Results:")
    for i in range(playernum):
        just_print('\n\nPlayer: ' + str(i + 1))
        just_print('Strat: ' + bet_system_names[i])
        just_print('Starting gold: ' + str(starting_golds[i]))
        just_print('Bet options: ' + str(bet_options[i]))
        if len(target_gold) >= playernum:
            just_print('Target gold: ' + str(target_gold[i]))
        elif len(target_gold) > 0:
            just_print('Target gold: ' + str(target_gold[0]))
        just_print()
        for rs in sorted(total_reasons[i].keys()):
            s = total_reasons[i][rs]
            just_print("  {:.<22}{:.>12,} ({:>6.2%})".format(
                rs, s["count"], s["count"] / iterations))
            # just_print(s["gold_end"])
            just_print("    {:.<16}{:.>16,.2f}".format(
                "Avg. end gold", statistics.mean(s["gold_end"])))
            just_print("    {:.<16}{:.>16,.2f}".format(
                "Avg. hands dealt", statistics.mean(s["hands"])))
        just_print("\nStats:")
        total_stats[i].print(just_print)
        if out_file is not None:
            out_file.close()