def __init__(self, bot): self.is_done = False self.bot = bot self.board_size = self.bot.board_size() self.board = baduk.Board(self.board_size, self.board_size) self.komi = 7.5 self.game = baduk.GameState.from_board(self.board, baduk.Player.black, self.komi)
def test_rotate_board(self): board = baduk.Board(5, 5) board.place_stone(baduk.Player.black, baduk.Point(3, 3)) board.place_stone(baduk.Player.white, baduk.Point(3, 2)) board.place_stone(baduk.Player.black, baduk.Point(4, 2)) rotated = symmetry.rotate_board(board, 1) self.assertEqual(baduk.Player.black, rotated.get(baduk.Point(3, 3))) self.assertEqual(baduk.Player.white, rotated.get(baduk.Point(3, 2))) self.assertEqual(baduk.Player.black, rotated.get(baduk.Point(2, 2)))
def rotate_board(board, index): size = board.num_rows assert board.num_cols == size new_board = baduk.Board(size, size) for r in range(1, size + 1): for c in range(1, size + 1): p = baduk.Point(row=r, col=c) stone = board.get(p) if stone is not None: new_point = rotate_point(p, index, size) new_board.place_stone(stone, new_point) return new_board
def test_rotate_game_record(self): # Handicap-ish setup board = baduk.Board(5, 5) board.place_stone(baduk.Player.black, baduk.Point(2, 2)) board.place_stone(baduk.Player.black, baduk.Point(2, 4)) game = baduk.GameState.from_board(board, baduk.Player.white) game = game.apply_move(baduk.Move.play(baduk.Point(4, 3))) # 1 == Reflect rows rot_game = symmetry.rotate_game_record(game, 1) self.assertEqual(baduk.Move.play(baduk.Point(2, 3)), rot_game.last_move) rot_board = rot_game.board self.assertEqual(baduk.Player.black, rot_board.get(baduk.Point(4, 2))) self.assertEqual(baduk.Player.black, rot_board.get(baduk.Point(4, 4))) self.assertEqual(baduk.Player.white, rot_board.get(baduk.Point(2, 3))) rot_game = rot_game.previous_state self.assertIsNone(rot_game.last_move) rot_board = rot_game.board self.assertEqual(baduk.Player.black, rot_board.get(baduk.Point(4, 2))) self.assertEqual(baduk.Player.black, rot_board.get(baduk.Point(4, 4))) self.assertIsNone(rot_board.get(baduk.Point(2, 3)))
def main(): parser = argparse.ArgumentParser() parser.add_argument('--auth', type=str, required=True) parser.add_argument('--secret', type=str, required=True) parser.add_argument('--num-games', '-n', type=int, default=100) parser.add_argument('--start-page', type=int) parser.add_argument('--output', '-o', required=True) args = parser.parse_args() with badukai.io.get_input(args.secret) as secret_file: secrets = json.load(open(secret_file)) client = badukai.ogs.get_client('https://online-go.com', args.auth, secrets) user = client.make_request('/api/v1/me') user_id = user['id'] username = user['username'] print('Loading games for {}...'.format(username)) opponents = collections.Counter() total = 0 for game in badukai.ogs.get_game_records(client, start_page=args.start_page): game_id = game['id'] i_was_black = game['players']['black']['id'] == user_id i_was_white = game['players']['white']['id'] == user_id detail_path = game['related']['detail'] fname = '{}.sgf'.format(game['id']) output_fname = os.path.join(args.output, fname) if os.path.exists(output_fname): print('Already downloaded {}'.format(fname)) continue loss = False opponent = None if not game.get('outcome'): print('Game is not over') continue if i_was_black and game['black_lost']: opponent = game['players']['white']['username'] loss = True if i_was_white and game['white_lost']: opponent = game['players']['black']['username'] loss = True if loss: details = client.make_request(detail_path) if 'gamedata' not in details: print('What up with these details?') print(details) continue komi = details['gamedata']['komi'] if len(details['gamedata']['moves']) < 30: print('Too short.') elif details['gamedata']['start_time'] < 1540364400: # was 1527577200 print('Too old.') elif komi < -9 or komi > 9: print('Too much komi.') else: opponents[opponent] += 1 total += 1 handicap = details['gamedata']['handicap'] handicap_stones = [] moves = details['gamedata']['moves'] board = baduk.Board(19, 19) handicap_setup = moves[:handicap] game_moves = moves[handicap:] if handicap > 0: for setup in handicap_setup: move = decode_ogs_move(setup) assert (move.is_play) handicap_stones.append(move.point) board.place_stone(baduk.Player.black, move.point) player = baduk.Player.white else: player = baduk.Player.black g = baduk.GameState.from_board(board, player, komi) for m in game_moves: move = decode_ogs_move(m) g = g.apply_move(move) print('Saving {}'.format(fname)) with open(output_fname, 'w') as outf: badukai.io.save_game_as_sgf( outf, g, 'B+?' if i_was_white else 'W+?', komi=komi, handicap_stones=handicap_stones) print('Total: {} losses'.format(total)) print(opponents)
def handle_clear_board(self): self.board = baduk.Board(self.board_size, self.board_size) self.game = baduk.GameState.from_board(self.board, baduk.Player.black, self.komi) return success('cleared')