def test_move_is_hashable(self): moves = { Move.play(Point(1, 1)): 1, Move.resign(): 2, } self.assertEqual(1, moves[Move.play(Point(1, 1))]) self.assertEqual(2, moves[Move.resign()])
def test_create_game_from_board(self): board = Board(5, 5) board.place_stone(Player.black, Point(2, 2)) board.place_stone(Player.black, Point(4, 4)) game = GameState.from_board(board, Player.white) self.assertEqual(Player.white, game.next_player) self.assertFalse(game.is_valid_move(Move.play(Point(2, 2)))) self.assertTrue(game.is_valid_move(Move.play(Point(3, 3))))
def test_new_game(self): start = GameState.new_game(19) next_state = start.apply_move(Move.play(Point(16, 16))) self.assertEqual(start, next_state.previous_state) self.assertEqual(Player.white, next_state.next_player) self.assertEqual(Player.black, next_state.board.get(Point(16, 16)))
def decode_move_index(self, index): """Turn an integer index into a board point.""" if index == self._pass_idx: return Move.pass_turn() row = index // self._board_size col = index % self._board_size return Move.play(Point(row=row + 1, col=col + 1))
def decode_sgf_move(sgf_move, num_rows): if sgf_move == '': return Move.pass_turn() assert len(sgf_move) == 2 col = ALPHABET.index(sgf_move[0]) + 1 row = num_rows - ALPHABET.index(sgf_move[1]) return Move.play(Point(row, col))
def read_move(self): is_play = self.read_bool() is_pass = self.read_bool() is_resign = self.read_bool() if is_play: row = self.read_int() col = self.read_int() return Move.play(Point(row=row, col=col)) if is_pass: return Move.pass_turn() assert is_resign return Move.resign()
def test_ko_as_array(self): start = GameState.new_game(19) # .wb. # wb.b # .wb. # .... game = start.apply_move(Move.play(Point(1, 3))) game = game.apply_move(Move.play(Point(1, 2))) game = game.apply_move(Move.play(Point(2, 2))) game = game.apply_move(Move.play(Point(2, 1))) game = game.apply_move(Move.play(Point(3, 3))) game = game.apply_move(Move.play(Point(3, 2))) game = game.apply_move(Move.play(Point(2, 4))) # W takes the ko game = game.apply_move(Move.play(Point(2, 3))) ko_array = game.ko_points_as_array() self.assertEqual((19, 19), ko_array.shape) self.assertEqual(1, ko_array[1, 1]) self.assertEqual(0, ko_array[2, 1]) self.assertEqual(0, ko_array[5, 5])
def test_legal_move_mask(self): start = GameState.new_game(19) # .wb. # wb.b # .wb. # .... game = start.apply_move(Move.play(Point(1, 3))) game = game.apply_move(Move.play(Point(1, 2))) game = game.apply_move(Move.play(Point(2, 2))) game = game.apply_move(Move.play(Point(2, 1))) game = game.apply_move(Move.play(Point(3, 3))) game = game.apply_move(Move.play(Point(3, 2))) game = game.apply_move(Move.play(Point(2, 4))) # W takes the ko game = game.apply_move(Move.play(Point(2, 3))) legal_moves = game.legal_moves_as_array() self.assertEqual((19 * 19 + 1, ), legal_moves.shape) illegal_indices = [ # Suicide 19 * 0 + 0, # Stones here 19 * 0 + 2, 19 * 0 + 1, 19 * 1 + 0, 19 * 2 + 2, 19 * 2 + 1, 19 * 1 + 3, 19 * 1 + 2, # ko 19 * 1 + 1, ] for i, val in enumerate(legal_moves): if i in illegal_indices: self.assertEqual(0, val, "{} should be illegal".format(i)) else: self.assertEqual(1, val, "{} should be legal".format(i))
def encode(self, game_state): board_tensor = np.zeros(self.shape()) if game_state.next_player == Player.black: board_tensor[8] = 1 else: board_tensor[9] = 1 for r in range(self._board_size): for c in range(self._board_size): p = Point(row=r + 1, col=c + 1) go_string = game_state.board.get_string(p) if go_string is None: if game_state.does_move_violate_ko(Move.play(p)): board_tensor[10][r][c] = 1 else: liberty_plane = min(4, go_string.num_liberties) - 1 if go_string.color == Player.white: liberty_plane += 4 board_tensor[liberty_plane][r][c] = 1 return board_tensor
def test_komi(self): start = GameState.new_game(19, 0.5) next_state = start.apply_move(Move.play(Point(16, 16))) self.assertAlmostEqual(0.5, next_state.komi())
def test_ko(self): start = GameState.new_game(19) # .wb. # wb.b # .wb. # .... game = start.apply_move(Move.play(Point(1, 3))) game = game.apply_move(Move.play(Point(1, 2))) game = game.apply_move(Move.play(Point(2, 2))) game = game.apply_move(Move.play(Point(2, 1))) game = game.apply_move(Move.play(Point(3, 3))) game = game.apply_move(Move.play(Point(3, 2))) game = game.apply_move(Move.play(Point(2, 4))) # W takes the ko game = game.apply_move(Move.play(Point(2, 3))) # B can't take back self.assertTrue(game.does_move_violate_ko(Move.play(Point(2, 2)))) self.assertFalse(game.is_valid_move(Move.play(Point(2, 2)))) # "ko threat" game = game.apply_move(Move.play(Point(19, 19))) game = game.apply_move(Move.play(Point(18, 18))) # B can take now self.assertFalse(game.does_move_violate_ko(Move.play(Point(2, 2)))) self.assertTrue(game.is_valid_move(Move.play(Point(2, 2))))
def test_last_move(self): start = GameState.new_game(19) next_move = Move.play(Point(16, 16)) state = start.apply_move(next_move) self.assertEqual(Move.play(Point(16, 16)), state.last_move)
def test_move_number(self): start = GameState.new_game(19) self.assertEqual(0, start.num_moves) game = start.apply_move(Move.play(Point(1, 3))) game = game.apply_move(Move.play(Point(1, 2))) self.assertEqual(2, game.num_moves)
def test_is_valid_move(self): start = GameState.new_game(19) state = start.apply_move(Move.play(Point(16, 16))) self.assertTrue(state.is_valid_move(Move.play(Point(16, 17)))) self.assertFalse(state.is_valid_move(Move.play(Point(16, 16))))