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

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

Ответ:
а вообще, нету смысла искать в инете) Прекол лицея именно в самостоятельном решении и получении навыков
Объяснение:
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



Для решения данной задачи необходимо создать классы для каждой фигуры (Knight, Bishop, Queen) и добавить метод is_under_attack в класс Board.
Вот пример кода:
pythonclass 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


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







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili