代码之家  ›  专栏  ›  技术社区  ›  user3725021

python中象棋引擎的Minimax函数无法解包不可iterable的非类型对象

  •  0
  • user3725021  · 技术社区  · 5 年前

    我正在尝试使用chess包用python构建一个简单的国际象棋引擎。我的minimax函数有问题,会破坏atm。下面是我的代码。。。

    # import package
    import chess
    
    # define starting params
    board = chess.Board()
    depth = 3
    alpha = -1000000
    beta = 1000000
    player = True
    
    # board evaluation
    def boardEval(board):
        wp = len(board.pieces(chess.PAWN, chess.WHITE))
        bp = len(board.pieces(chess.PAWN, chess.BLACK))
        wn = len(board.pieces(chess.KNIGHT, chess.WHITE))
        bn = len(board.pieces(chess.KNIGHT, chess.BLACK))
        wb = len(board.pieces(chess.BISHOP, chess.WHITE))
        bb = len(board.pieces(chess.BISHOP, chess.BLACK))
        wr = len(board.pieces(chess.ROOK, chess.WHITE))
        br = len(board.pieces(chess.ROOK, chess.BLACK))
        wq = len(board.pieces(chess.QUEEN, chess.WHITE))
        bq = len(board.pieces(chess.QUEEN, chess.BLACK))
        return (wp-bp) + 3 * (wn-bn) + 3 * (wb-bb) - 5 * (wr-br) + 10 * (wq-bq)
    
    
    # minimax function
    def minimax(board, depth, alpha, beta, player):
        # check whether game is complete
        gameComplete = board.is_game_over()
        bestMove = None
        moves = [str(l) for l in board.legal_moves]
        tempBoard = board.copy()
        
        if depth == 0:
            return boardEval(tempBoard), bestMove
        if gameComplete:
            print('Game completed')
            return None
    
        for move in  moves:
            m = chess.Move.from_uci(move)
            tempBoard.push(m)
            
            if player:
                maxEval = -1000000
                value, bestMove = minimax(tempBoard, depth - 1, alpha, beta, False)
                if maxEval < value:
                    maxEval = value
                    bestMove = move
                alpha = alpha if alpha > value else value
                if beta <= alpha:
                    break
                return maxEval, bestMove
            else:
                minEval = 1000000
                value, bestMove = minimax(tempBoard, depth - 1, alpha, beta, True)
                if minEval < value:
                    minEval = value
                    bestMove = move
                beta = beta if beta < value else value
                if beta <= alpha:
                    break
                return minEval, bestMove
           
    # find best move
    minimax(board, depth=3, alpha=-100000, beta=100000, player=True)
    

    但是,在运行minimax函数时,我收到以下错误消息:

    Traceback (most recent call last):
      File "<ipython-input-10-9ddb4749c86c>", line 64, in <module>
        minimax(board, depth=3, alpha=-100000, beta=100000, player=True)
      File "<ipython-input-10-9ddb4749c86c>", line 44, in minimax
        value, bestMove = minimax(tempBoard, depth - 1, alpha, beta, False)
    TypeError: cannot unpack non-iterable NoneType object
    

    我不明白为什么会发生这种情况,也不知道如何解决。有什么想法吗?

    0 回复  |  直到 5 年前
    推荐文章