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


Download 28.29 Kb.
bet2/4
Sana19.06.2023
Hajmi28.29 Kb.
#1602651
1   2   3   4
Bog'liq
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):
direction = 1 if (self.color == WHITE) else -1
return (row + direction == row1
and (col + 1 == col1 or col - 1 == col1))
Ладья:
Эта фигура может двигаться только по вертикали и горизонтали, т.е. должны совпадать координаты до передвижения и после лтбо по вертикали либо по горизонтали. Зная это, реализуем класс:
class Rook(Piece):
ch = 'R'

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):
return False

# Слон двигается по диагонали


# Смещение по строка должно равняться смещению по столбцам
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):
return False

# Ферзь двигается вертикально


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):
return False

# Король двигается в любую клетку с рассотоянием равным 1


if max(abs(row - row1), abs(col - col1)) == 1:
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