Exemple #1
0
    def __set_attacking_states(self, piece: Piece):
        possible_positions = self.possible_moves(
            self.__reverse_convert_coordinates(piece.position)).values()

        if piece.__class__.__name__ == 'Pown':
            coordinates = piece.position

            if piece.side == 'Black':
                possible_positions = [[coordinates[0] + 1, coordinates[1] - 1],
                                      [coordinates[0] + 1, coordinates[1] + 1]]
            elif piece.side == 'White':
                possible_positions = [[coordinates[0] - 1, coordinates[1] - 1],
                                      [coordinates[0] - 1, coordinates[1] + 1]]
            possible_positions = [
                [self.__reverse_convert_coordinates(position)]
                for position in possible_positions
                if valid_index(position[0]) and valid_index(position[1])
            ]

        piece.attacked_pieces = []
        for positions in possible_positions:
            for pos in positions:
                if pos == 'N':
                    break
                pos = self.__convert_coordinates(pos)
                piece.attacked_pieces.append(self.__find_piece_in_field(pos))
Exemple #2
0
    def legal_moves(self):
        moves = {'Down': [], 'Up': [], 'Right': [], 'Left': []}

        # going down
        for i in range(1, FIELD_SIZE + 1):
            new_row, new_column = self.position[0] + i, self.position[1]
            if valid_index(new_row):
                moves['Down'].append((new_row, new_column))

        # going up
        for i in range(1, FIELD_SIZE + 1):
            new_row, new_column = self.position[0] - i, self.position[1]
            if valid_index(new_row):
                moves['Up'].append((new_row, new_column))

        # going right
        for i in range(1, FIELD_SIZE + 1):
            new_row, new_column = self.position[0], self.position[1] + i
            if valid_index(new_column):
                moves['Right'].append((new_row, new_column))

        # going left
        for i in range(1, FIELD_SIZE + 1):
            new_row, new_column = self.position[0], self.position[1] - i
            if valid_index(new_column):
                moves['Left'].append((new_row, new_column))

        return moves
Exemple #3
0
    def legal_moves(self):
        moves = {'Down': [], 'Up': [], 'Right': [], 'Left': []}
        allowed_moves = {
            'down': [(-2, -1), (-2, 1)],  # going down
            'up': [(2, -1), (2, 1)],  # going up
            'right': [(-1, 2), (1, 2)],  # going right
            'left': [(-1, -2), (1, -2)]  # going left
        }
        # going down
        for delta in allowed_moves['down']:
            new_row, new_column = self.position[0] + delta[0], self.position[
                1] + delta[1]
            if valid_index(new_row) and valid_index(new_column):
                moves['Down'].append((new_row, new_column))

        # going up
        for delta in allowed_moves['up']:
            new_row, new_column = self.position[0] + delta[0], self.position[
                1] + delta[1]
            if valid_index(new_row) and valid_index(new_column):
                moves['Up'].append((new_row, new_column))

        # going right
        for delta in allowed_moves['right']:
            new_row, new_column = self.position[0] + delta[0], self.position[
                1] + delta[1]
            if valid_index(new_row) and valid_index(new_column):
                moves['Right'].append((new_row, new_column))

        # going left
        for delta in allowed_moves['left']:
            new_row, new_column = self.position[0] + delta[0], self.position[
                1] + delta[1]
            if valid_index(new_row) and valid_index(new_column):
                moves['Left'].append((new_row, new_column))

        return moves
Exemple #4
0
    def possible_moves(
        self, coordinates: str
    ) -> dict:  # getting information as coordinates (1, 0 -> A2)
        coordinates = self.__convert_coordinates(
            coordinates)  # converting from coordinates (A2 -> 0, 1)

        piece = self.__find_piece_in_field(coordinates)

        try:
            all_moves = piece.legal_moves
        except AttributeError:
            raise ValueError("No piece at the given position.")

        pieces_attacked = []
        for direction in all_moves:
            available_positions = []
            for position in all_moves[direction]:
                cur_row, cur_column = position
                if not valid_index(cur_row) or not valid_index(cur_column):
                    break
                if self.__field[position[0]][position[1]] != FREE_SPACE_SYMBOL:
                    pieces_attacked.append(position)
                    break
                available_positions.append(position)

            all_moves[
                direction] = available_positions if available_positions else 'No spots available.'

        if piece.__class__.__name__ == 'Pown':
            if piece.side == 'Black':
                pieces_attacked = [(coordinates[0] + 1, coordinates[1] - 1),
                                   (coordinates[0] + 1, coordinates[1] + 1)]
                pieces_attacked = [
                    position for position in pieces_attacked
                    if valid_index(position[0]) and valid_index(position[1])
                    and str(self.field[position[0]][
                        position[1]]) != FREE_SPACE_SYMBOL
                ]

            elif piece.side == 'White':
                pieces_attacked = [(coordinates[0] - 1, coordinates[1] - 1),
                                   (coordinates[0] - 1, coordinates[1] + 1)]
                pieces_attacked = [
                    position for position in pieces_attacked
                    if valid_index(position[0]) and valid_index(position[1])
                    and str(self.field[position[0]][
                        position[1]]) != FREE_SPACE_SYMBOL
                ]

        pieces_attacked = [
            position for position in pieces_attacked
            if self.__field[position[0]][position[1]].side != self.__field[
                coordinates[0]][coordinates[1]].side
        ]
        all_moves[
            'Attacking Pieces'] = pieces_attacked if pieces_attacked else 'Not attacking any piece.'

        # converting to coordinates (0, 1 -> A2)
        for name, moves in all_moves.items():
            if not isinstance(moves, str):
                all_moves[name] = [
                    self.__reverse_convert_coordinates(move) for move in moves
                ]
        return all_moves