Рокировка в шахматах

Как составить рокировку в шахматах, добавив в класс Board методы board.castling0() и board.castling7()?

Метод castling0 пробует выполнить рокировку для игрока текущего цвета с ладьёй из колонки 0, castling7 — из колонки 7.

Вот мой код, где оформлены классы фигур и самой доски, но без рокировки:

WHITE = 1
BLACK = 2


def opponent(color):
    if color == WHITE:
        return BLACK
    return WHITE


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


def correct_coords(row, col):
    return 0 <= row < 8 and 0 <= col < 8


class Board:
    def __init__(self):
        self.color = WHITE
        self.field = []
        for row in range(8):
            self.field.append([None] * 8)
        # Пешка белого цвета в клетке E2.
        self.field[1][4] = Pawn(1, 4, WHITE)

    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


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(row - self.row) == abs(col - self.col):
            return True

        return False


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(row - self.row) == abs(col - self.col):
            return True

        if self.row != row and self.col != col:
            return False

        return True


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 self.row != row and self.col != col:
            return False

        return True


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 self.col != col:
            return False

        if self.color == WHITE:
            direction = 1
            start_row = 1
        else:
            direction = -1
            start_row = 6

        # ход на 1 клетку
        if self.row + direction == row:
            return True

        # ход на 2 клетки из начального положения
        if self.row == start_row and self.row + 2 * direction == row:
            return True

        return False

Ответы (0 шт):