Муниципальная конференция «Шаг в профессию инженер» Номинация: «Программирование»


Download 28.29 Kb.
bet3/4
Sana19.06.2023
Hajmi28.29 Kb.
#1602651
1   2   3   4
Bog'liq
proekt shahmat

Реализация доски
Представим доску в виде матрицы на координатной оси. Тогда расположение фигур на доске будет записано в двухмерном списке. Записыаем стартовые значения матрицы:
self.field = [[None] * 8 for _ in range(8)]
self.field[0] = [
Rook(WHITE), Knight(WHITE), Bishop(WHITE), Queen(WHITE),
King(WHITE), Bishop(WHITE), Knight(WHITE), Rook(WHITE)
]
self.field[1] = [
Pawn(WHITE), Pawn(WHITE), Pawn(WHITE), Pawn(WHITE),
Pawn(WHITE), Pawn(WHITE), Pawn(WHITE), Pawn(WHITE)
]
self.field[6] = [
Pawn(BLACK), Pawn(BLACK), Pawn(BLACK), Pawn(BLACK),
Pawn(BLACK), Pawn(BLACK), Pawn(BLACK), Pawn(BLACK)
]
self.field[7] = [
Rook(BLACK), Knight(BLACK), Bishop(BLACK), Queen(BLACK),
King(BLACK), Bishop(BLACK), Knight(BLACK), Rook(BLACK)
]

Цвет фигуры определяют константы WHITE и BLACK.

Каждая клетка имеет свое значение, так белая пешка обозначена как «wP». В дальнейшем это обозначение определит графическую модель фигурки на доске.
В этом классе создаем ф-цию проверки возможности движения:
def check_move(self, row: int, col: int, row1: int, col1: int):
"""Проверка перемещения фигуру из точки (row, col) в точку (row1, col1).
Если перемещение возможно, метод выполнит его и вернет True.
Если нет --- вернет False"""
check = self.check() # Есть ли шах к перед ходом
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]
target = self.field[row1][col1]
if piece is None:
return False
if piece.get_color() != self.color:
return False

if isinstance(piece, King) and self.is_under_attack(row1, col1, opponent(self.current_player_color())):


return False

if not (piece.can_move(self.field, row, col, row1, col1) and target is None) and \


not (piece.can_attack(self.field, row, col, row1, col1) and
(target is not None and not isinstance(target, King)
and target.get_color() == opponent(self.current_player_color()))):
return False

old_field = [x.copy() for x in self.field] # Сохранить поле


self.field[row][col] = None # Снять фигуру.
self.field[row1][col1] = piece # Поставить на новое место.
if check and self.check(): # В результате хода избежать шаха не удалось
# Возвращаемся в исходное состояние
self.field = old_field
return False
# Возвращаемся в исходное состояние
self.field = old_field
return True

Ф-ция проверяет сразу все факторы: выход за пределы доски, походила ли фигурка на свое же место, приведет ли ход короля к его шаху или мату и т.д.


Реализуем ф-цию движения в которой используется ф-ция проверки:
def move_piece(self, row, col, row1, col1):
"""Переместить фигуру из точки (row, col) в точку (row1, col1).
Если перемещение возможно, метод выполнит его и вернет True.
Если нет --- вернет False"""
if self.check_move(row, col, row1, col1):
piece = self.field[row][col]
self.field[row][col] = None # Снять фигуру.
piece.moved()
self.field[row1][col1] = piece # Поставить на новое место.
if self.check_promotion(piece, row1):
self.promotion = True
self.color = opponent(self.color)
self.change = True
return True
return False

Также здесь реализуем механику атаки:


def is_under_attack(self, row, col, color):
for row1 in range(8):
for col1 in range(8):
if self.field[row1][col1] is not None:
if self.field[row1][col1].get_color() == color and \
self.field[row1][col1].can_attack(self.field, row1, col1, row, col):
return True
return False

Для короля мы должны реализовать «Шах» и «Мат». Это довольно таки сложно из-за того, что у короля пропадает много возможностей, например «Рокировка». Поэтому я все ещё не полностью смог воссоздать эту механику из шахмат. Но все же в случае шаха игроку будут недоступны ходы, которые приведут к мату.




Download 28.29 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling