Рокировка в шахматах
Как составить рокировку в шахматах, добавив в класс 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