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