0

我正在尝试构建一个国际象棋 AI,但遇到了一个奇怪的错误。作为前言,我确实通过了 stackoverflow 并尝试找到类似的问题,但这对我没有帮助,因为我认为我正在正确实现元组解包并且我似乎无法在我的代码中找到错误。

下面是我的 negamax 函数的代码。它包含棋盘、当前玩家和当前深度。
它使用 board.evalFunction() 函数将代表棋盘位置值的数字返回给当前玩家。该功能工作正常。我已经标记了出现错误的行:ValueError: need more than 0 values to unpack
有人可以帮我吗?

    def negamax(board, player, depth):
        if player == 'human':
            opposite = 'computer'
        else:
            opposite = 'human'
        if depth == 0:
            return (board.evalFunction(player), None)
        moveset = board.generateMoves(player)
        maximum = -99999999999
        optMove = ""
        for move in moveset:
            newBoard = copy.deepcopy(board)
            newBoard.makeMove(move)
            newBoard.rotate()
            #The following line throws the error
            score, move = -1 * negamax(board, opposite, depth - 1)
            if score > maximum:
                maximum = score
                optMove = move
            elif score == maximum:
                if(random.choice([True, False])):
                    maximum = score
                    optMove = move
        return (maximum, optMove)
4

3 回答 3

2

更改此声明

score, move = -1 * negamax(board, opposite, depth - 1)

score, move = tuple(-1 * x for x in negamax(board, opposite, depth - 1))

使用带有函数 args 的生成器表达式会好得多。

于 2015-12-13T16:28:04.980 回答
0

你不能只是将一个元组与一个常数相乘。你应该使用列表理解

score, move = tuple([-1*i for i in negamax(board, opposite, depth - 1)])
于 2015-12-13T16:21:12.073 回答
0

如果你将一个元组乘以一个数字,你会得到一个空元组

>>> -1*(1,2)
()

这导致您出现错误。您应该手动否定元组的每个元素。你也应该看看这个问题: Multiplying a tuple by a scalar

于 2015-12-13T16:17:54.243 回答