def capture_board(): gs = GameState(size=7) # another small board, this one with imminent captures # # X # 0 1 2 3 4 5 6 # . . B B . . . 0 # . B W W B . . 1 # . B W . . . . 2 # Y . . B . . . . 3 # . . . . W B . 4 # . . . W . W B 5 # . . . . W B . 6 # # current_player = black black = [(2, 0), (3, 0), (1, 1), (4, 1), (1, 2), (2, 3), (5, 4), (6, 5), (5, 6)] white = [(2, 1), (3, 1), (2, 2), (4, 4), (3, 5), (5, 5), (4, 6)] for B in black: gs.do_move(B, go.BLACK) for W in white: gs.do_move(W, go.WHITE) gs.set_current_player(go.BLACK) return gs
class GTPGameConnector(object): """A class implementing the functions of a 'game' object required by the GTP Engine by wrapping a GameState and Player instance """ def __init__(self, player): self._state = GameState(enforce_superko=True) self._player = player self._komi = 0 def clear(self): self._state = GameState() def make_move(self, color, vertex): # vertex in GTP language is 1-indexed, whereas GameState's are zero-indexed if color == gtp.BLACK: color = go.BLACK else: color = go.WHITE try: if vertex == gtp.PASS: self._state.do_move(go.PASS) else: (x, y) = vertex self._state.do_move((x - 1, y - 1), color) return True except go.IllegalMove: return False def set_size(self, n): self._state = GameState(size=n, enforce_superko=True) def set_komi(self, k): self._komi = k def get_move(self, color): if color == gtp.BLACK: color = go.BLACK else: color = go.WHITE self._state.set_current_player(color) move = self._player.get_move(self._state) if move == go.PASS: return gtp.PASS else: (x, y) = move return (x + 1, y + 1) def get_current_state_as_sgf(self): from tempfile import NamedTemporaryFile temp_file = NamedTemporaryFile(delete=False) save_gamestate_to_sgf(self._state, '', temp_file.name) return temp_file.name def place_handicaps(self, vertices): actions = [] for vertex in vertices: (x, y) = vertex actions.append((x - 1, y - 1)) self._state.place_handicaps(actions)
def test_sensible_probabilistic(self): gs = GameState() policy = CNNPolicy(["board", "ones", "turns_since"]) player = ProbabilisticPolicyPlayer(policy) empty = (10, 10) for x in range(19): for y in range(19): if (x, y) != empty: gs.do_move((x, y), go.BLACK) gs.set_current_player(go.BLACK) self.assertEqual(player.get_move(gs), go.PASS)
def test_sensible_greedy(self): gs = GameState() value = CNNValue(["board", "ones", "turns_since"]) player = ValuePlayer(value, greedy_start=0) empty = (10, 10) for x in range(19): for y in range(19): if (x, y) != empty: gs.do_move((x, y), go.BLACK) gs.set_current_player(go.BLACK) self.assertEqual(player.get_move(gs), go.PASS)
def _sgf_init_gamestate(sgf_root): """ Helper function to set up a GameState object from the root node of an SGF file """ props = sgf_root.properties s_size = int(props.get('SZ', ['19'])[0]) s_player = props.get('PL', ['B'])[0] # init board with specified size gs = GameState(size=s_size) # handle 'add black' property if 'AB' in props: for stone in props['AB']: gs.place_handicap_stone(_parse_sgf_move(stone), go.BLACK) # handle 'add white' property if 'AW' in props: for stone in props['AW']: gs.place_handicap_stone(_parse_sgf_move(stone), go.WHITE) # setup done; set player according to 'PL' property gs.set_current_player(go.BLACK if s_player == 'B' else go.WHITE) return gs