Проверка ходов несколько сложна, однако ниже приведена возможность проверки ходов королевы. Во-первых, вы можете захотеть переместить игровой макет в класс для более простого доступа к доске и фигурам. Затем создайте метод для перемещения фигуры. Метод может быть упакован декоратором, который будет проверять координаты, переданные методу:
def validate_move(f):
def wrapper(cls, name, x, y):
methods = {'q':cls.__class__.queen_moves} #build dictionary of move accumulators
full_moves = list(methods[name[:-1]](getattr(cls, 'board'), color = name[-1]))
if [x, y] not in full_moves:
print("invalid move")
else:
f(cls, x, y)
return wrapper
class Chess:
pieces = [['r', 'kn', 'b', 'k', 'q', 'b', 'kn', 'r'], ['p']*8]
def __init__(self):
self.board = [[i+'b' for i in b] for b in Chess.pieces]+([['-']*8]*8)+[[i+'w' for i in b] for b in Chess.pieces]
@validate_move
def move_piece(_name, x, y):
a1, b1 = [(i, b) for i in range(8) for b in range(8) if self.board[i][b] == _name]
self.board[x][y] = _name
self.board[a1][b1] = '-'
@staticmethod
def queen_moves(board, color = 'w'):
c1, c2 = [(i, b) for i in range(8) for b in range(8) if board[i][b] == 'q'+color]
_c2, _c1 = c2, c1
while c2 < 8: #check vertically
c2 += 1
if board[c1][c2] != '-':
c2 = _c2
break
yield [c1, c2]
while c2 >= 0: #check vertically
c2 -= 1
if board[c1][c2] != '-':
c2 = _c2
break
yield [c1, c2]
while c1 < 8: #check horizontally
c1 += 1
if board[c1][c2] != '-':
c1 = _c1
break
yield [c1, c2]
while c1 >= 0: #check horizontally
c1 -= 1
if board[c1][c2] != '-':
c1 = _c1
break
yield [c1, c2]
Таким образом, вам осталось сделать две вещи:
Создайте полный список staticmethod
с, чтобы получить полные ходы всех фигур на доске.
создание methods
словаря в wrapper
для хранения объектов функции поиска движения.