Exemplo n.º 1
0
    def test_defender(self):
        """Тест защиты бота.
        Окружаем белую фишку тремя черными.
        Бот должен увеличить дыхания для данной фишки"""

        game = Game()
        self.move((380, 450), (4, 4), game, self.color_bot)

        self.move((345, 450), (3, 4), game, self.color)
        self.move((415, 450), (5, 4), game, self.color)
        self.move((380, 485), (4, 3), game, self.color)

        bot = SmartBot(game)
        response = bot.action()
        game.set_new_move()
        expected_white_groups = [[(4, 4), (4, 5)]]
        actual_white_groups = game.get_white_groups()
        self.assertEqual(actual_white_groups, expected_white_groups)
Exemplo n.º 2
0
    def test_attack(self):
        """Тест атаки бота.
        Заполняем доску четырмя фишками, отдаленных друг от друга.
        Такие фишки легко закрыть с помощью 16 ходов: 4 дыхания на каждую фишку"""

        game = Game()
        self.move((275, 275), (9, 9), game, self.color)
        self.move((555, 555), (9, 1), game, self.color)
        self.move((555, 380), (9, 6), game, self.color)
        self.move((380, 450), (4, 4), game, self.color)

        bot = SmartBot(game)
        for i in range(16):
            response = bot.action()
            game.set_new_move()
        expected_black_groups = []
        actual_black_groups = game.get_black_groups()
        self.assertEqual(actual_black_groups, expected_black_groups)
Exemplo n.º 3
0
    def test_smart_attack(self):
        """Тест умной атаки.
        Белые и Черные фишки имеют достаточно дыханий и стоят рядом (>=3).
        Это самая частая ситуация в ГО. В данной ситуации нужно атаковать-защищать"""

        game = Game()
        self.move((275, 275), (1, 9), game, self.color)
        self.move((275, 310), (1, 8), game, self.color)
        self.move((275, 345), (1, 7), game, self.color)
        self.move((275, 380), (1, 6), game, self.color)

        self.move((310, 310), (2, 8), game, self.color_bot)

        bot = SmartBot(game)
        response = bot.action()
        game.set_new_move()

        expected_white_groups = [[(2, 8), (2, 7)]]
        actual_white_groups = game.get_white_groups()
        self.assertEqual(actual_white_groups, expected_white_groups)
Exemplo n.º 4
0
    def test_cold_war(self):
        """Тест: "не ввязываемся в борьбу".
        Черные фишки имеют много дыханий и стоят монолитно вдалеке от белых.
        Фишки бота (белые) имеют намного меньше дыхания. В данном случае они будут строить оборону
        на расстоянии (2-3клетки) от черных"""

        game = Game()
        self.move((380, 450), (4, 4), game, self.color)
        self.move((345, 450), (3, 4), game, self.color)
        self.move((380, 415), (4, 5), game, self.color)
        self.move((380, 485), (4, 3), game, self.color)
        self.move((380, 380), (4, 6), game, self.color)

        self.move((345, 310), (3, 8), game, self.color_bot)
        self.move((310, 310), (2, 8), game, self.color_bot)

        bot = SmartBot(game)
        for i in range(2):
            response = bot.action()
            game.set_new_move()
        expected_white_groups = [[(3, 8), (2, 8), (4, 8), (3, 9)]]
        actual_white_groups = game.get_white_groups()
        self.assertEqual(actual_white_groups, expected_white_groups)
Exemplo n.º 5
0
class ResponseInterface(BaseGameInterface):
    def __init__(self, is_move_time=False, is_game_time=False, all_time=None, random_bot=False, smart_bot=False):
        super(ResponseInterface, self).__init__()
        self.col_pass_black = False
        self.col_pass_white = False
        self.is_random_bot = random_bot
        self.is_smart_bot = smart_bot
        self.is_move_time = is_move_time
        self.is_game_time = is_game_time
        self.all_time = all_time
        self.copy_time = all_time
        self.black_points = 0
        self.white_points = 0
        self.start_timing()
        self.normalize_coord_stones_dict = {}
        self.game = Game()

        self.signal = Signals()
        self.count_points = CountPoints()

        self.draw_who_run(self.game.get_move_number_engine())

        self.matrix_coordinates = MatrixCoordinates()
        self.set_signals()
        self.check_bot()

    def check_bot(self):
        if self.is_random_bot or self.is_smart_bot:
            self.set_bots()

    def set_bots(self):
        if self.is_random_bot:
            self.bot = RandomBot(self.game)
        elif self.is_smart_bot:
            self.bot = SmartBot(self.game)

        self.timer_bot = QTimer(self)
        self.timer_bot.setInterval(600)
        self.timer_bot.timeout.connect(self.action_bot)
        self.timer_bot.start()

    def action_bot(self):
        if self.game.get_player_color() == PlayerColor.WHITE:
            response = self.bot.action()
            # print(response)
            type_move = response["type"]
            cord_trans = response["trans_cord"]
            cord_norm = response["norm_cord"]
            if type_move == "pass":
                self.get_pass_white()
            elif type_move == "move":
                self.set_new_stone(cord_trans, cord_norm)

    def start_timing(self):
        if self.is_move_time or self.is_game_time:
            self.start_timer()

    def start_timer(self):
        self.all_time = self.copy_time
        self.timer = QTimer(self)
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.update_counter)
        self.timer.start()

    def validate_time(self):
        if self.all_time == -1:
            if self.is_move_time:
                self.time_transition()
            else:
                self.timer.stop()
                self.draw_menu()

    def update_counter(self):
        hours = int(self.all_time / 3600)
        mins = int((self.all_time - hours * 3600) / 60)
        secs = int(self.all_time % 60)
        self.draw_time("%d:%02d:%02d" % (hours, mins, secs))
        self.all_time -= 1
        self.validate_time()

    def set_signals(self):
        self.signal.restart_signal.connect(self.restart_game)
        self.signal.closed_signal.connect(self.close_game)

    def mousePressEvent(self, event):
        if self.game.validate.validate_gamer_zone(event.x(), event.y()):
            x_trans, y_trans = self.matrix_coordinates.transformed_coord_mouse(event.x(), event.y())
            x_norm, y_norm = self.matrix_coordinates.get_normalize_coord((x_trans, y_trans))
            transformed_coord = (x_trans, y_trans)
            normalized_coord = (x_norm, y_norm)
            color = self.game.get_player_color()
            if self.game.move_is_valid(transformed_coord, normalized_coord, color):
                self.set_new_stone(transformed_coord, normalized_coord)

    def set_new_gambit(self):
        self.game.set_new_move()
        hide_point = self.game.get_hide_stones()
        if len(hide_point) != 0:
            self.hide_stones(hide_point)

    def set_new_stone(self, transformed_coord, normalized_coord):
        self.check_timer()

        self.set_new_gambit()
        self.draw_new_stone(transformed_coord, normalized_coord)

        self.game.update_move_number_engine()
        self.draw_who_run(self.game.get_move_number_engine())

        self.set_not_pass_gambit()
        self.draw_points()
        self.game.print_log_game()
        # print("-" * 30)
        # print("ХОД ВАЛИДНЫЙ")

    def set_not_pass_gambit(self):
        if self.game.get_player_color() == PlayerColor.BLACK:
            self.col_pass_black = False
        else:
            self.col_pass_white = False

    def draw_points(self):
        black_groups, white_groups = self.game.get_black_white_groups()
        self.black_points = self.count_points.get_count_points_black(black_groups)
        self.white_points = self.count_points.get_count_points_white(white_groups)
        self.redraw_points_black(self.black_points)
        self.redraw_points_white(self.white_points)

    def draw_new_stone(self, transformed_coord, normalized_coord):
        if self.game.get_player_color() == PlayerColor.BLACK:
            self.draw_stone_b(transformed_coord, normalized_coord)
            self.enabled_buttons(False, True)
        else:
            self.draw_stone_w(transformed_coord, normalized_coord)
            self.enabled_buttons(True, False)

    def hide_stones(self, remove_group):
        for group in remove_group:
            for norm_coord in group:
                self.del_chip(norm_coord)

    def check_timer(self):
        if self.is_move_time:
            self.timer.stop()
            self.start_timer()

    def time_transition(self):
        self.check_timer()
        self.game.update_move_number_engine()

        self.draw_who_run(self.game.get_move_number_engine())

    def get_pass_black(self):
        self.check_timer()
        self.game.update_move_number_engine()
        self.draw_who_run(self.game.get_move_number_engine())

        self.col_pass_black = True
        self.pass_black.setEnabled(False)
        self.pass_white.setEnabled(True)

        if self.col_pass_white:
            # print("конец")
            self.draw_menu()

    def get_pass_white(self):
        self.check_timer()

        self.game.update_move_number_engine()

        self.draw_who_run(self.game.get_move_number_engine())

        self.col_pass_white = True
        self.pass_white.setEnabled(False)
        self.pass_black.setEnabled(True)

        if self.col_pass_black:
            # print("конец")
            self.draw_menu()

    def _close_time(self):
        if self.is_move_time or self.is_game_time:
            if self.timer.isActive():
                self.timer.stop()
        if self.is_smart_bot or self.is_random_bot:
            if self.timer_bot.isActive():
                self.timer_bot.stop()

    def draw_menu(self):
        self._close_time()
        self.close()
        new_win = EndGameInterFace(self, self.signal, self.black_points, self.white_points)
        new_win.show()

    def close_game(self):
        self._close_time()
        self.close()

    def closeEvent(self, event):
        self.close_game()

    def restart_game(self):
        self.close_game()
        from platform import system
        import os
        system = system()
        if system == "Windows":
            start = "python {}".format(ConstantsName.point_program)
        else:
            start = "python3 {}".format(ConstantsName.point_program)
        os.system(start)