Chess Engine TypeError: unhashable type: 'list'

board = [["bRook", "bKnight", "bBishop", "bQueen", "bKing", "bBishop", "bKnight", "bRook"],
         ["bPawn", "bPawn",   "bPawn",   "bPawn",  "bPawn", "bPawn",   "bPawn",   "bPawn"],
         ["",      "",        "",        "",       "",      "",        "",        ""],
         ["",      "",        "",        "",       "",      "",        "",        ""],
         ["",      "",        "",        "",       "",      "",        "",        ""],
         ["",      "",        "",        "",       "",      "",        "",        ""],
         ["wPawn", "wPawn",   "wPawn",   "wPawn",  "wPawn", "wPawn",   "wPawn",   "wPawn"],
         ["wRook", "wKnight", "wBishop", "wQueen", "wKing", "wBishop", "wKnight", "wRook"]]


def evaluation():
#Material Score
materialScoreWhite = 0
materialScoreBlack = 0
#Main Material
pieceScores = {"Pawn": 100,
               "Knight": 320,
               "Bishop": 330,
               "Rook": 500,
               "Queen": 900,
               "King": 20000}

    for each in board:
        for f in each:
            if f[0] == "w":
                materialScoreWhite += "w" + pieceScores[each[0:]]
            elif f[0] == "b":
                materialScoreBlack += "b" + pieceScores[each[0:]]

Я пытаюсь сделать простой шахматный движок на Python. Список board показывает, как доска находится в положении, которое пытается оценить программа. Часть моей оценки включает в себя прохождение каждой фигуры на доске и добавление определенного значения к баллу, который имеет цвет.

Например, первая фигура в списке на данный момент (начальная позиция) - черная ладья, поэтому я хочу, чтобы программа добавила 500 в materialScoreBlack, Тем не менее, я продолжаю получать эту ошибку:

    materialScoreBlack += "b" + pieceScores[each[0:]]
TypeError: unhashable type: 'list'

Как я могу это исправить?

2 ответа

Вы пытаетесь получить доступ к pieceScores с помощью each[0:], который является "фрагментом" каждого массива, который является просто более коротким списком. Вы не можете получить доступ к словарю в списке! Я думаю, что ты хотел сделать что-то вроде

materialScoreBlack += pieceScores[f[1:]]

Который правильно обращается к словарю. Также обратите внимание, что я изменил ваш срез, начинающийся с 0, на срез, начинающийся с 1. Это сделано для удаления w/b в начале записей на вашей доске, чтобы был доступен словарь. Я не сделал это

materialScoreBlack += "b" + pieceScores[f[1:]]

потому что я не был уверен, что вы пытаетесь сделать с "b" - materialScoreBlack выглядит и звучит так, как будто это число, поэтому не пытайтесь добавлять к нему строки, даже если Python позволяет вам это делать.

Не уверен, что вы пытаетесь сделать с линией

materialScoreWhite += "w" + pieceScores[each[0:]]

добавление "w" или "b" не имеет смысла для меня, и вы не можете получить доступ к своему словарю, как это. Только что попробовал код, начиная со второго элемента в F, и он отлично работает

def evaluation():

materialScoreWhite = 0
materialScoreBlack = 0
#Main Material
pieceScores = {"Pawn": 100,
               "Knight": 320,
               "Bishop": 330,
               "Rook": 500,
               "Queen": 900,
               "King": 20000}

for each in board:
    for f in each:
        if len(f) > 0:
            if f[0] == "w":
                materialScoreWhite += pieceScores[f[1:]]
            elif f[0] == "b":
                materialScoreBlack += pieceScores[f[1:]]

print materialScoreBlack
print materialScoreWhite
Другие вопросы по тегам