def test_capture_is_not_suicide(self): board = Board(19, 19) board.place_stone(Player.black, Point(1, 1)) board.place_stone(Player.black, Point(2, 2)) board.place_stone(Player.black, Point(1, 3)) board.place_stone(Player.white, Point(2, 1)) board.place_stone(Player.white, Point(1, 2)) self.assertIsNone(board.get(Point(1, 1))) self.assertEqual(Player.white, board.get(Point(2, 1))) self.assertEqual(Player.white, board.get(Point(1, 2)))
def test_middle(self): board = Board(19, 19) board.place_stone(Player.black, Point(2, 2)) board.place_stone(Player.black, Point(3, 2)) board.place_stone(Player.black, Point(4, 2)) board.place_stone(Player.black, Point(4, 3)) board.place_stone(Player.white, Point(4, 4)) board.place_stone(Player.black, Point(3, 4)) board.place_stone(Player.black, Point(2, 4)) board.place_stone(Player.black, Point(2, 3)) self.assertTrue(is_point_an_eye(board, Point(3, 3), Player.black))
def test_corner(self): board = Board(19, 19) board.place_stone(Player.black, Point(1, 2)) board.place_stone(Player.black, Point(2, 2)) board.place_stone(Player.black, Point(2, 1)) self.assertTrue(is_point_an_eye(board, Point(1, 1), Player.black)) self.assertFalse(is_point_an_eye(board, Point(1, 1), Player.white))
def test_remove_liberties(self): board = Board(5, 5) board.place_stone(Player.black, Point(3, 3)) board.place_stone(Player.white, Point(2, 2)) white_string = board.get_go_string(Point(2, 2)) six.assertCountEqual( self, [Point(2, 3), Point(2, 1), Point(1, 2), Point(3, 2)], white_string.liberties) board.place_stone(Player.black, Point(3, 2)) white_string = board.get_go_string(Point(2, 2)) six.assertCountEqual( self, [Point(2, 3), Point(2, 1), Point(1, 2)], white_string.liberties)
def test_empty_triangle(self): board = Board(5, 5) board.place_stone(Player.black, Point(1, 1)) board.place_stone(Player.black, Point(1, 2)) board.place_stone(Player.black, Point(2, 2)) board.place_stone(Player.white, Point(2, 1)) black_string = board.get_go_string(Point(1, 1)) six.assertCountEqual( self, [Point(3, 2), Point(2, 3), Point(1, 3)], black_string.liberties)
def is_point_an_eye(board :Board, point: Point, color): # 目は空の点 if board.get(point) is not None: return False # 隣接するすべての点には味方の石が含まれている必要がある for neighbor in point.neighbors(): if board.is_on_grid(neighbor): neighbor_color = board.get(neighbor) if neighbor_color != color: return False # 点が盤の中央にある場合、4つの角のうち3つの角を支配する必要がある # 辺ではすべての角を支配する必要がある friendly_corners = 0 off_board_corners = 0 corners = [ Point(point.row - 1, point.col - 1), Point(point.row - 1, point.col + 1), Point(point.row + 1, point.col - 1), Point(point.row + 1, point.col + 1), ] for corner in corners: if board.is_on_grid(corner): corner_color = board.get(corner) if corner_color == color: friendly_corners += 1 else: off_board_corners += 1 if off_board_corners > 0: # 点が角または辺にある return off_board_corners + friendly_corners == 4 # 点は中央にある return friendly_corners >= 3
def test_capture_two_stones(self): board = Board(19, 19) board.place_stone(Player.black, Point(2, 2)) board.place_stone(Player.black, Point(2, 3)) board.place_stone(Player.white, Point(1, 2)) board.place_stone(Player.white, Point(1, 3)) self.assertEqual(Player.black, board.get(Point(2, 2))) self.assertEqual(Player.black, board.get(Point(2, 3))) board.place_stone(Player.white, Point(3, 2)) board.place_stone(Player.white, Point(3, 3)) self.assertEqual(Player.black, board.get(Point(2, 2))) self.assertEqual(Player.black, board.get(Point(2, 3))) board.place_stone(Player.white, Point(2, 1)) board.place_stone(Player.white, Point(2, 4)) self.assertIsNone(board.get(Point(2, 2))) self.assertIsNone(board.get(Point(2, 3)))
def new_game(cls, board_size): assert isinstance(board_size, int) return GameState(Board(board_size, board_size), Player.black, None, None)