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