#python #python-chess
#python #python-шахматы
Вопрос:
Я работаю над рейтинговыми позициями, но я не знаю, находится ли фигура на определенном квадрате. когда я запускаю свой код, я получаю
Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘symbol’
Вот код:
for i in range(0,8):
for j in range(0,8):
if i == 0:
s='A'
if i == 1:
s='B'
if i == 2:
s='C'
if i == 3:
s='D'
if i == 4:
s='E'
if i == 5:
s='F'
if i == 6:
s='G'
if i == 7:
s='H'
if j == 0:
e='1'
if j == 1:
e='2'
if j == 2:
e='3'
if j == 3:
e='4'
if j == 4:
e='5'
if j == 5:
e='6'
if j == 6:
e='7'
if j == 7:
e='8'
piece = board.piece_at(getattr(chess,s e))
print(piece.symbol())
Комментарии:
1. Я бы предположил, что это означает, что там, где вы указали, нет фрагмента.
2. разве вы не можете использовать для этого dict вместо всех этих операторов if?
Ответ №1:
Там, где нет фигуры (например, на e4 на стартовой доске), board.piece_at()
вернется None
. Поэтому вы должны проверить, является ли piece == None
перед запросом его символа.
Обратите внимание, что ваш код может быть более эффективным, например :
import chess
board = chess.Board()
for i in chess.SQUARES :
piece = board.piece_at(i)
if piece != None :
print(piece.symbol())
Ответ №2:
Если вы хотите оценить позицию в шахматах с помощью python, я могу вам немного помочь. Я также работал над.
У вас может быть таблица хороших позиций для каждой фигуры (см. Страницу theis). Вы можете создать список позиций товаров для каждой фигуры, начиная с a1, b1 … и заканчивая h8.
например, для белого короля :
K = [0.269, 0.883, 1.907, 9.062, 3.559, 6.985, 2.233, 0.495,
0.435, 1.236, 3.644, 9.126, 11.745, 8.228, 2.583, 0.0737,
0.553, 1.564, 2.329, 3.557, 3.772, 3.142, 2.056, 0.774,
0.505, 0.877, 1.233, 1.369, 1.456, 1.432, 1.118, 0.592,
0.370, 0.672, 0.712, 0.686, 0.763, 0.748, 0.728, 0.399,
0.246, 0.418, 0.481, 0.440, 0.395, 0.440, 0.398, 0.288,
0.164, 0.263, 0.262, 0.200, 0.190, 0.215, 0.259, 0.167,
0.066, 0.106, 0.080, 0.086, 0.076, 0.082, 0.088, 0.056]
Примечание: Для черных фигур значения должны быть отрицательными для хорошего анализа.
Затем вы можете создать dict для ссылки каждого символа строки piece на соответствующий список позиций товаров :
pieces = {'K': K, 'k': k, 'Q': Q, 'q': q, 'R': R, 'r': r, 'N': N, 'n': n, 'B': B, 'b': b, 'P': P, 'p': p}
И теперь вы можете получить рейтинговую оценку позиции (только для размещения, а не для других параметров, но если вы свяжетесь со мной, я смогу помочь вам с другим рейтингом позиций в шахматах. Я понимаю ваш вопрос как «я хочу оценить размещение каждой фигуры на шахматной доске») :
def placement_eval(pos) :
'''evaluation of piece placement'''
evalu = 0
for case in list(chess.SQUARES) :
piece = pos.piece_at(case)
if piece != None :
evalu = evalu pieces[piece.symbol()][case]
return evalu / 10 # /10 or /100, as you want