Муниципальная конференция «Шаг в профессию инженер» Номинация: «Программирование»
Download 28.29 Kb.
|
proekt shahmat
Основная часть
Классы фигур Все фигуры имеют некоторые одинаковые механики, поэтому для начала создадим базовый класс, от которого будем наследовать другие. Если представить доску в виде матрицы, то можно определять местоположение фигур с помощью координат х и у. Пешка: Пешка может двигаться на 1 клетку по вертикали (вверх если белая и вниз если черная), а также на 2 клетки, если её ещё ни разу не двигали. Исходя из этих данных создаем класс: class Pawn(Piece): ch = 'P' def can_move(self, board, row, col, row1, col1): # Пешка может ходить только по вертикали # "взятие на проходе" не реализовано if col != col1: return False if not self.is_path_clear(board, row, col, row1, col1): return False # Пешка может сделать из начального положения ход на 2 клетки # вперёд, поэтому поместим индекс начального ряда в start_row. if self.color == WHITE: direction = 1 start_row = 1 else: direction = -1 start_row = 6 # ход на 1 клетку if row + direction == row1: return True # ход на 2 клетки из начального положения if row == start_row and row + 2 * direction == row1: return True return False def can_attack(self, board, row, col, row1, col1):
def can_move(self, board, row, col, row1, col1): # Невозможно сделать ход в клетку, которая не лежит в том же ряду # или столбце клеток. if row != row1 and col != col1: return False if not self.is_path_clear(board, row, col, row1, col1): return False return True Конь: Конь двигается буквой «Г», т.е. на 2 по вертикали и 1 по горизонтали и наоборот. При этом направление не важно, значит нужно использовать ф-цию abs(), т.е. модуль. class Knight(Piece): ch = 'N' def can_move(self, board, row, col, row1, col1): # Конь двигается буквой Г (2 вертикально, 1 горизонтально) if abs(row - row1) == 2 and abs(col - col1) == 1: return True # Конь двигается буквой Г (1 вертикально, 2 горизонтально) if abs(row - row1) == 1 and abs(col - col1) == 2: return True return False Слон: Слон двигается по диагонали т.е. его смещение по вертикали должно быть равно смещению по горизонтали: class Bishop(Piece): ch = 'B' def can_move(self, board, row, col, row1, col1): if not self.is_path_clear(board, row, col, row1, col1):
# Слон двигается по диагонали # Смещение по строка должно равняться смещению по столбцам if abs(row - row1) == abs(col - col1): return True return False Королева(Ферзь): Королева двигается по всем сторонам (по горизонтали, вертикали, диагонали). Копируем эти механики из слона и ладьи и получаем: class Queen(Piece): ch = 'Q' def can_move(self, board, row, col, row1, col1): if not self.is_path_clear(board, row, col, row1, col1):
# Ферзь двигается вертикально if col == col1: return True # Ферзь двигается горизонтально if row == row1: return True # Ферзь двигается по диагонали # Смещение по строка должно равняться смещению по столбцам if abs(row - row1) == abs(col - col1): return True return False Король: Король двигается в любую сторону на расстояние 1: class King(Piece): ch = 'K' def can_move(self, board, row, col, row1, col1): if not self.is_path_clear(board, row, col, row1, col1):
# Король двигается в любую клетку с рассотоянием равным 1 if max(abs(row - row1), abs(col - col1)) == 1: return True return False А теперь необходимо реализовать некоторые особые механики игры, например «Превращение пешки» и «Рокировка».
Download 28.29 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling