Пример #1
0
    def move(self, toctm: Tile, tile_to_move: Tile) -> bool:
        '''
        Виконує хід (не бій) шашкою, що знаходиться на toctm (Tile Of Checker To Move) і поміщає її на tile_to_move.

        Параметри:
        toctm: клітинка, на якій знаходиться шашка, яка повинна виконувати хід
        tile_to_move: клітинка, на яку ця шашка має стати

        Повертає:
        True: хід виконано
        None: хід не виконано (нелегітимний)
        '''
        checker_to_move = self.checker_on_tile(toctm)[1]
        if isinstance(checker_to_move, Queen):
            if toctm.on_same_diagonal(tile_to_move):
                diag = tile_to_move.diagonal_unit(toctm)
                tile_to_check = toctm + diag
                while (not tile_to_check.equals(tile_to_move)
                       ) and self.checker_on_tile(tile_to_check) == [0]:
                    tile_to_check += diag
                if tile_to_check.equals(tile_to_move):
                    checker_to_move.tile = tile_to_move
                    self.premove()
                    return True
        else:
            pos = False
            for tile_ in toctm.all_adjacent(self.player_to_move):
                if tile_.equals(tile_to_move):
                    pos = True
                    break
            if not pos:
                return None
            if self.checker_on_tile(tile_to_move) == [0]:
                checker_to_move.tile = tile_to_move
                if checker_to_move.tile.y == PROMOTIONS[self.player_to_move]:
                    checker_to_move = self.promote(checker_to_move)
                self.premove()
                return True
Пример #2
0
    def take(self, toctm: Tile, tile_to_move: Tile) -> bool:
        '''
        Виконує бій шашкою, що знаходиться на toctm (Tile Of Checker To Move) і поміщає її на tile_to_move.

        Параметри:
        toctm: клітинка, на якій знаходиться шашка, яка повинна виконувати бій
        tile_to_move: клітинка, на яку ця шашка має стати

        Повертає:
        True:  бій виконано успішно і можливий ще один бій
        False: бій виконано успішно і ще один бій неможливий
        None:  бій не виконано (неправильно обрана клітинка, нема кого бити і т.п.)
        '''
        if self.take_possible():
            if self.checker_on_tile(tile_to_move) != [0]:
                return None
            checker_to_move = self.checker_on_tile(toctm)[1]
            if isinstance(checker_to_move, Queen):
                if toctm.on_same_diagonal(tile_to_move):
                    diag = tile_to_move.diagonal_unit(toctm)
                    victim_tile = None
                    test_tile = toctm + diag
                    while not test_tile.equals(tile_to_move):
                        if self.checker_on_tile(
                                test_tile)[0] == self.player_to_move:
                            return None
                        if self.checker_on_tile(
                                test_tile)[0] == -self.player_to_move:
                            if victim_tile != None:
                                return None
                            else:
                                victim_tile = test_tile
                        test_tile += diag
                    if victim_tile == None:
                        return None
                    if not self.queens_take_possible(tile_to_move,
                                                     victim_tile):
                        tile_to_test = victim_tile + diag
                        while self.checker_on_tile(tile_to_test) == [
                                0
                        ] and tile_to_test.is_valid():
                            if self.queens_take_possible(
                                    tile_to_test, victim_tile):
                                return None
                            tile_to_test += diag
                    checker_to_move.tile = tile_to_move
                    self.board[-self.player_to_move].remove(
                        self.checker_on_tile(victim_tile)[1])
                    self.possible_attacker = checker_to_move
                    if not self.take_possible():
                        self.premove()
                        return False
                    return True
            else:
                if not self.possible_attacker == None:
                    if not checker_to_move.tile.equals(
                            self.possible_attacker.tile):
                        return None
                if not toctm.on_same_diagonal(tile_to_move):
                    return None
                diag = tile_to_move.diagonal_unit(toctm)
                if not (toctm + diag * 2).equals(tile_to_move):
                    return None
                if self.checker_on_tile(toctm +
                                        diag)[0] == -self.player_to_move:
                    checker_to_move.tile = tile_to_move
                    if checker_to_move.tile.y == PROMOTIONS[
                            self.player_to_move]:
                        checker_to_move = self.promote(checker_to_move)
                    self.board[-self.player_to_move].remove(
                        self.checker_on_tile(toctm + diag)[1])
                    self.possible_attacker = checker_to_move
                    if not self.take_possible():
                        self.premove()
                        return False
                    return True