0

我正在对位置进行评级,但我不知道一块是否在某个方格上。当我运行我的代码时,我得到

AttributeError:“NoneType”对象没有属性“符号”

这是代码:

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())
4

2 回答 2

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())
于 2021-06-29T08:55:28.567 回答
0

如果你想用 python 评价国际象棋中的位置,我可以帮你一点。我也做过。
您可以为每件作品提供一张好位置表(参见第页)。您可以为每件商品创建货物仓位清单,从 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 以将每个片段字符串符号引用到其相应的货物位置列表:

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
于 2021-06-30T06:59:35.983 回答