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))
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
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
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