Для епископа необходимо учитывать четыре различных направления: вверх-вправо, вниз-вправо, вниз-влево, вверх-влево. Для всех четырех вариантов вы можете найти максимальные прогнозируемые координаты для каждого, а затем выполнить итерацию ко всем. Если во время итерации встречается другая часть, цикл останавливается. Возможная реализация этого алгоритма ниже:
board = [['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', 'b', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', '-', '-']]
options = [lambda x, y:(x+1, y+1), lambda x, y:(x+1, y-1), lambda x, y:(x-1, y-1), lambda x, y:(x-1, y+1)]
projected = [lambda x, y:(x+min([x,y]), y+min([x,y])), lambda x, y:(x+min([x,y]), y-min([x,y])), lambda x, y:(x-min([x,y]), y-min([x,y])), lambda x, y:(x-min([x,y]), y+min([x,y]))]
def iterate_towards(current, to, func):
while current != to:
current = list(func(*current))
if board[current[0]][current[-1]] != '-':
break
yield current
yield to
def get_bishop_moves(current:list):
for a, b in zip(options, projected):
yield list(iterate_towards([3, 4], list(b(*current)), a))
print(list(get_bishop_moves([3, 4])))
Выход:
[[[4, 5], [5, 6], [6, 7]], [[4, 3], [5, 2], [6, 1]], [[2, 3], [1, 2], [0, 1]], [[2, 5], [1, 6], [0, 7]]]