AttributeError:“非类型”对象没有属性“符号”pythonchess

2024-05-19 00:40:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究评级位置,但我不知道某个工件是否在某个正方形上。 当我运行代码时,我得到

AttributeError: 'NoneType' object has no attribute '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())

Tags: no代码inforpieceifobjectrange
2条回答

如果没有工件(如起始板中的e4),则board.piece_at()将返回None。因此,在询问piece == None的符号之前,您应该先检查piece == None

请注意,您的代码可以更高效,如下所示:

import chess
board = chess.Board()
for i in chess.SQUARES :
    piece = board.piece_at(i)
    if piece != None :
        print(piece.symbol())

如果你想用Python来评价国际象棋的位置,我可以帮你一点忙。我也做过。
你可以为每件作品准备一张好的位置表(见theis page)。 您可以为每个工件创建货物位置列表,从a1、b1。。。以h8结尾。
e、 g.对于白人国王:

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

相关问题 更多 >

    热门问题