Я беру на себя (несколько амбициозный) проект написания шахматной игры для Mac Terminal, используя входы алгебраических обозначений для выполнения ходов.
Я написал свою доску в виде списка списков.с каждым вложенным списком, служащим рангом (горизонтальная линия) на доске:
board = [['bR', 'bN', 'bB', 'bQ', 'bK', 'bB', 'bN', 'bR'],
['bP', 'bP', 'bP', 'bP', 'bP', 'bP', 'bP', 'bP'],
['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e '],
['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e '],
['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e '],
['e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e ', 'e '],
['wP', 'wP', 'wP', 'wP', 'wP', 'wP', 'wP', 'wP'],
['wR', 'wN', 'wB', 'wQ', 'wK', 'wB', 'wN', 'wR']
]
Затем я написал (довольно длинную) процедуру, чтобы проверить, какие законные ходы доступны для фигуры, основанной исключительно наввод данных желаемого хода, который он / она хотел бы сделать.
Я пытаюсь сделать мой код менее повторяющимся, но у меня возникают проблемы при создании списка возможных ходов для слонов, ладей,и королева.Например, для епископа я сначала использую данные, чтобы найти слона, который мог бы переместиться в этот конкретный квадрат и сохранить его позицию.Затем я генерирую список возможных квадратов, по которым слон может двигаться, используя цикл while для перехода в направлении каждой диагонали.В итоге он выглядит следующим образом:
elif piece == 'B':
s,d = square[0] + square[1], square[0] - square[1]
squares = [(r,f) for r in range(-8,0) for f in range(len(board)) if r-f == d or r+f==s]
pos_bishop=[]
for i in squares:
pos = board[i[0]][i[1]]
if pos == mover:
pos_bishop.append(i[0])
pos_bishop.append(i[1])
break
if len(pos_bishop) == 0:
return False
squares2 = []
j,k = pos_bishop[0], pos_bishop[1]
while j>-8 and k>0 and board[j-1][k-1] == 'e ':
squares2.append((j-1,k-1))
j-=1
k-=1
j,k = pos_bishop[0], pos_bishop[1]
while j>-8 and k<8 and board[j-1][k+1] == 'e ':
squares2.append((j-1,k+1))
j-=1
k+=1
j,k = pos_bishop[0], pos_bishop[1]
while j<-1 and k>0 and board[j+1][k-1] == 'e ':
squares2.append((j+1,k-1))
j+=1
k-=1
j,k = pos_bishop[0], pos_bishop[1]
while j<-1 and k<8 and board[j+1][k+1] == 'e ':
squares2.append((j+1,k+1))
j+=1
k+=1
if square in squares2:
return True
Как видите, есть четыре цикла while, и в начале каждого я должен переопределить переменные позиции.Это кажется громоздким, но мне трудно думать о другом способе генерировать движения более эффективным образом.(Я еще не работаю над тем, является ли этот шаг захватом, кстати, я просто смотрю, пуст ли квадрат.)
Я был бы признателен за толчок в правильном направлении, а не за явное решение;но любой совет будет приветствоваться.Спасибо!