Вопрос задан 05.05.2021 в 08:49. Предмет Информатика. Спрашивает Григорьев Денис.

Задача Python Необходимо добавить в класс Board, который приведён в конце урока, метод

board.is_under_attack(row, col, color). Метод должен возвращать True, если поле с координатами (row, col) находится под боем хотя бы одной фигуры цвета color. Такой метод необходим, чтобы запретить ход королём под шах. Нужно определить классы Knight, Bishop, Queenи класс Board, в который добавлен метод is_under_attack. Остальные методы и имена свойств Board изменять не нужно.
0 0
Перейти к ответам

Ответы на вопрос

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Ильясов Булат.

Ответ:

а вообще, нету смысла искать в инете) Прекол лицея именно в самостоятельном решении и получении навыков

Объяснение:

WHITE = 1

BLACK = 2

def opponent(color):

   if color == WHITE:

       return BLACK

   else:

       return WHITE

def correct_coords(row, col):

   return 0 <= row < 8 and 0 <= col < 8

class Queen:

   def __init__(self, row, col, color):

       self.row = row

       self.col = col

       self.color = color

   def set_position(self, row, col):

       self.row = row

       self.col = col

   def char(self):

       return 'Q'

   def get_color(self):

       return self.color

   def can_move(self, row, col):

       if not (0 <= row < 8 and 0 <= col < 8):

           return False

       if (abs(self.row - row) == abs(self.col - col)) \

               or (abs(self.row - row) * abs(self.col - col) == 0):

           return True

       return False

class Knight:

   def __init__(self, row, col, color):

       self.row = row

       self.col = col

       self.color = color

   def set_position(self, row, col):

       self.row = row

       self.col = col

   def char(self):

       return 'N'

   def get_color(self):

       return self.color

   def can_move(self, row, col):

       if not (0 <= row < 8 and 0 <= col < 8):

           return False

       if abs(self.col - col) * abs(self.row - row) == 2 \

               and self.row != row and self.col != col:

           return True

       return False

class Pawn:

   def __init__(self, row, col, color):

       self.row = row

       self.col = col

       self.color = color

   def set_position(self, row, col):

       self.row = row

       self.col = col

   def char(self):

       return 'P'

   def get_color(self):

       return self.color

   def can_move(self, row, col):

       if not (0 <= row < 8 and 0 <= col < 8):

           return False

       if self.col != col:

           return False

       if self.color == WHITE:

           direction = 1

           start_row = 1

       else:

           direction = -1

           start_row = 6

       if self.row + direction == row:

           return True

       if self.row == start_row and self.row + 2 * direction == row:

           return True

       return False

class Rook:

   def __init__(self, row, col, color):

       self.row = row

       self.col = col

       self.color = color

   def set_position(self, row, col):

       self.row = row

       self.col = col

   def char(self):

       return 'R'

   def get_color(self):

       return self.color

   def can_move(self, row, col):

       if not (0 <= row < 8 and 0 <= col < 8):

           return False

       if self.row != row and self.col != col:

           return False

       return True

class Bishop:

   def __init__(self, row, col, color):

       self.row = row

       self.col = col

       self.color = color

   def set_position(self, row, col):

       self.row = row

       self.col = col

   def char(self):

       return 'B'

   def get_color(self):

       return self.color

   def can_move(self, row, col):

       if not (0 <= row < 8 and 0 <= col < 8):

           return False

       if abs(self.row - row) == abs(self.col - col):

           return True

       return False

class Board:

   def __init__(self):

       self.field = []

       for row in range(8):

           self.field.append([None] * 8)

   def current_player_color(self):

       return self.color

   def cell(self, row, col):

       piece = self.field[row][col]

       if piece is None:

           return '  '

       color = piece.get_color()

       c = 'w' if color == WHITE else 'b'

       return c + piece.char()

   def move_piece(self, row, col, row1, col1):

       if not correct_coords(row, col) or not correct_coords(row1, col1):

           return False

       if row == row1 and col == col1:

           return False

       piece = self.field[row][col]

       if piece is None:

           return False

       if piece.get_color() != self.color:

           return False

       if not piece.can_move(row1, col1):

           return False

       self.field[row][col] = None

       self.field[row1][col1] = piece

       piece.set_position(row1, col1)

       self.color = opponent(self.color)

       return True

   def is_under_attack(self, row, col, color):

       for i in range(8):

           for j in range(8):

               if self.field[i][j] is not None:

                   piece = self.field[i][j]

                   if piece.get_color() == color:

                       if piece.can_move(row, col):

                           return True

       return False

0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

Для решения данной задачи необходимо создать классы для каждой фигуры (Knight, Bishop, Queen) и добавить метод is_under_attack в класс Board.

Вот пример кода:

python
class Board: def __init__(self): self.board = [[None for _ in range(8)] for _ in range(8)] def is_under_attack(self, row, col, color): # Проверяем, находится ли поле под боем коня for i, j in [(2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2), (2, -1)]: if 0 <= row + i <= 7 and 0 <= col + j <= 7 and isinstance(self.board[row + i][col + j], Knight) and self.board[row + i][col + j].color != color: return True # Проверяем, находится ли поле под боем слона или ферзя (диагональ) for i, j in zip(range(row + 1, 8), range(col + 1, 8)): if self.board[i][j]: if isinstance(self.board[i][j], (Bishop, Queen)) and self.board[i][j].color != color: return True break for i, j in zip(range(row + 1, 8), range(col - 1, -1, -1)): if self.board[i][j]: if isinstance(self.board[i][j], (Bishop, Queen)) and self.board[i][j].color != color: return True break for i, j in zip(range(row - 1, -1, -1), range(col + 1, 8)): if self.board[i][j]: if isinstance(self.board[i][j], (Bishop, Queen)) and self.board[i][j].color != color: return True break for i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)): if self.board[i][j]: if isinstance(self.board[i][j], (Bishop, Queen)) and self.board[i][j].color != color: return True break # Проверяем, находится ли поле под боем ладьи или ферзя (горизонталь/вертикаль) for i in range(row + 1, 8): if self.board[i][col]: if isinstance(self.board[i][col], (Rook, Queen)) and self.board[i][col].color != color: return True break for i in range(row - 1, -1, -1): if self.board[i][col]: if isinstance(self.board[i][col], (Rook, Queen)) and self.board[i][col].color != color: return True break for j in range(col + 1, 8): if self.board[row][j]: if isinstance(self.board[row][j], (Rook, Queen)) and self.board[row][j].color != color: return True break for j in range(col - 1, -1, -1): if self.board[row][j]: if isinstance(self.board[row][j], (Rook
0 0

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос