Exemple #1
0
def main(args):
    if len(args) == 4:
        common.init_players()
    elif len(args) == 5:
        common.init_players(args[4])
    else:
        sys.exit(
            'Usage: <white player> <white seed> <black player> <black seed> [player config]'
        )
    white_player = common.get_player(args[0])
    white_seed = int(args[1])
    black_player = common.get_player(args[2])
    black_seed = int(args[3])
    run_game([
        start_bot(white_player, 0, white_seed),
        start_bot(black_player, 1, black_seed)
    ])
def fight(args):
    [common.get_player(name) for name in args.players]  # Validate
    players = {
        name + ('/%d' % args.players[:i].count(name)) *
        (args.players.count(name) > 1): name
        for i, name in enumerate(args.players)
    }
    task_q = queue.Queue()
    out_q = queue.Queue()

    def worker():
        while True:
            player_w, seed_w, player_b, seed_b = task_q.get()
            proc_args = [
                sys.executable,
                os.path.join(common.base_dir, 'game_helper.py'),
                players[player_w],
                str(seed_w), players[player_b],
                str(seed_b)
            ]
            if args.player_config is not None:
                proc_args.append(args.player_config)
            try:
                out = subprocess.check_output(proc_args)
            except subprocess.CalledProcessError:
                banner('ERROR in game_helper subprocess', '!')
                os._exit(2)
            out_q.put((player_w, player_b, out))

    for _ in range(args.parallelism):
        thread = threading.Thread(target=worker)
        thread.daemon = True
        thread.start()

    print('Seed:', args.seed)
    rando = random.Random(args.seed)
    score = {p: 0 for p in players}
    matches = [(a, b) for a in players for b in players if a is not b]
    move_log = open(args.move_log, 'w')
    for c in range(args.cycles):
        rando.shuffle(matches)
        for w, b in matches:
            task_q.put((w, make_seed(rando), b, make_seed(rando)))
        for _ in range(len(matches)):
            name_w, name_b, output = out_q.get()
            ((winner, how),
             notation) = map(str.strip,
                             output.decode('ascii').splitlines())
            score[name_w] += {'W': 2, 'D': 1, 'B': 0}[winner]
            score[name_b] += {'W': 0, 'D': 1, 'B': 2}[winner]
            print('%-20s %-20s %s %s %4d' %
                  (name_w, name_b, winner, how, notation.count('.')),
                  file=sys.stderr)
            print(name_w, name_b, winner, how, notation, file=move_log)
        banner('Standings after %d cycle%s:' % (c + 1, 's'[:c]), '=')
        for z in sorted(score.items(), key=lambda z: z[1], reverse=True):
            print('  %-20s %5d' % z)
        banner('', '=')
def check(args):
    players = [common.get_player(name) for name in args.players]
    for p in players:
        banner('Checking ' + p.name, '=')
        for color in 'wb':
            seed = make_seed(random)
            out0, out1 = (sample_output(p, color, seed) for _ in range(2))
            if out0 != out1:
                banner('Failed: ' + p.name, '!')
                sys.exit(
                    'Player produced two different outputs given args %s %d' %
                    (color, seed))
        banner('OK: ' + p.name, '=')
def build(args):
    players = [common.get_player(name) for name in args.players]
    for p in players:
        if p.build:
            banner('Building ' + p.name, '=')
            os.chdir(p.dir)
            for cmd in p.build:
                try:
                    subprocess.check_call(cmd)
                except OSError as e:
                    banner('Failed to build ' + p.name, '!')
                    print('This command returned failed to start: %s' % cmd)
                    sys.exit(1)
                except subprocess.CalledProcessError as e:
                    banner('Failed to build ' + p.name, '!')
                    print('This command returned %d: %s' % (e.returncode, cmd))
                    sys.exit(1)
            banner('Successfully built ' + p.name, '=')