Муниципальная конференция «Шаг в профессию инженер» Номинация: «Программирование»
Download 28.29 Kb.
|
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». В дальнейшем это обозначение определит графическую модель фигурки на доске.
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: |
ma'muriyatiga murojaat qiling