def __init__(self, state, value, priors, parent, last_move): self.state = state self.value = value self.parent = parent # <1> self.last_move = last_move # <1> self.total_visit_count = 1 self.branches = {} for move, p in priors.items(): if state.is_valid_move(move) and not is_point_an_eye( state.board, move.point, state.next_player): self.branches[move] = Branch(p) self.children = {} # <2>
def select_move(self, game_state): dim = (game_state.board.num_rows, game_state.board.num_cols) if dim != self.dim: self._update_cache(dim) idx = np.arange(len(self.point_cache)) np.random.shuffle(idx) for i in idx: p = self.point_cache[i] if game_state.is_valid_move(Move.play(p)) and \ not is_point_an_eye(game_state.board, p, game_state.next_player): return Move.play(p) return Move.pass_turn()
def select_move(self, game_state): """Choose a random valid move that preserves our own eyes.""" candidates = [] for r in range(1, game_state.board.num_rows + 1): for c in range(1, game_state.board.num_cols + 1): candidate = Point(row=r, col=c) print("kkk", candidate.row, candidate.col) if game_state.is_valid_move(Move.play(candidate)) and \ not is_point_an_eye(game_state.board, candidate, game_state.next_player): candidates.append(candidate) if not candidates: return Move.pass_turn() return Move.play(random.choice(candidates)) # end::random_bot[]
def encode(self, game_state): board_tensor = np.zeros( (self.num_planes, self.board_height, self.board_width)) for r in range(self.board_height): for c in range(self.board_width): point = Point(row=r + 1, col=c + 1) go_string = game_state.board.get_go_string(point) if go_string and go_string.color == game_state.next_player: board_tensor[offset("stone_color")][r][c] = 1 elif go_string and go_string.color == game_state.next_player.other: board_tensor[offset("stone_color") + 1][r][c] = 1 else: board_tensor[offset("stone_color") + 2][r][c] = 1 board_tensor[offset("ones")] = self.ones() board_tensor[offset("zeros")] = self.zeros() if not is_point_an_eye(game_state.board, point, game_state.next_player): board_tensor[offset("sensibleness")][r][c] = 1 ##ages = min(game_state.board.move_ages.get(r, c, step?), 8) ages = int(min(game_state.board.move_ages.get(r, c), 8)) # Nail insert int(...) if ages > 0: #print(ages) board_tensor[offset("turns_since") + ages][r][c] = 1 if game_state.board.get_go_string(point): liberties = min( game_state.board.get_go_string(point).num_liberties, 8) board_tensor[offset("liberties") + liberties][r][c] = 1 move = Move(point) if game_state.is_valid_move(move): new_state = game_state.apply_move(move) liberties = min( new_state.board.get_go_string(point).num_liberties, 8) board_tensor[offset("liberties_after") + liberties][r][c] = 1 adjacent_strings = [ game_state.board.get_go_string(nb) for nb in point.neighbors() ] capture_count = 0 for go_string in adjacent_strings: other_player = game_state.next_player.other if go_string and go_string.num_liberties == 1 and go_string.color == other_player: capture_count += len(go_string.stones) capture_count = min(capture_count, 8) board_tensor[offset("capture_size") + capture_count][r][c] = 1 if go_string and go_string.num_liberties == 1: go_string = game_state.board.get_go_string(point) if go_string: num_atari_stones = min(len(go_string.stones), 8) board_tensor[offset("self_atari_size") + num_atari_stones][r][c] = 1 if is_ladder_capture(game_state, point): board_tensor[offset("ladder_capture")][r][c] = 1 if is_ladder_escape(game_state, point): board_tensor[offset("ladder_escape")][r][c] = 1 if self.use_player_plane: if game_state.next_player == Player.black: board_tensor[offset("ones")] = self.ones() else: board_tensor[offset("zeros")] = self.zeros() return board_tensor