Some logical error in alpha beta pruning function

63 views Asked by At

I am building a chess game in Python, and I was trying to add AI in it. I have successfully implemented the min max algorithm and it is working just fine, but when I am trying the alpha beta pruning, the moves generated by both of them differ.

def alphabeta(self, color, alpha, beta, depth):
        if (depth == 0):
            return self.evaluator.evaluateBoard(), []
        # self.posEval += 1
        allMoves = self.getAllMoves(color)
        bestMove = []
        toBreak = False
        if (self.isMaximize(color)):
            maxEval = -9999
            for src in allMoves:
                for dest in allMoves[src]:
                    self.board.movePiece(src, dest)
                    if (self.movements.isMate(self.getOppositeColor(color))):
                        maxEval = CHECKMATE
                        bestMove = [[src.createNewCopy(), dest.createNewCopy(), copy.deepcopy(maxEval)]]
                        toBreak = True
                        self.board.revertMove(src, dest)
                        print("Checkmate was found!!!")
                        break
                    eval, temp = self.alphabeta(self.getOppositeColor(color), alpha, beta, depth - 1)
                    self.posEval += 1
                    self.board.revertMove(src, dest)
                    if (eval > maxEval):
                        maxEval = eval
                        bestMove = [[src.createNewCopy(), dest.createNewCopy(), copy.deepcopy(maxEval)]]
                    elif (eval == maxEval):
                        bestMove.append([src.createNewCopy(), dest.createNewCopy(), copy.deepcopy(maxEval)])
                    alpha = max(alpha, eval)
                    if (beta <= alpha):
                        toBreak = True
                        break
                if (toBreak):
                    break
            return maxEval, bestMove
        
        else:

            minEval = 9999
            for src in allMoves:
                for dest in allMoves[src]:
                    self.board.movePiece(src, dest)
                    if (self.movements.isMate(self.getOppositeColor(color))):
                        minEval = -CHECKMATE
                        bestMove = [[src.createNewCopy(), dest.createNewCopy(), copy.deepcopy(minEval)]]
                        toBreak = True
                        self.board.revertMove(src, dest)
                        print("Checkmate was found!!!")
                        break
                    eval, temp = self.alphabeta(self.getOppositeColor(color), alpha, beta, depth - 1)
                    self.posEval += 1
                    self.board.revertMove(src, dest)
                    if (eval < minEval):
                        minEval = eval
                        bestMove = [[src.createNewCopy(), dest.createNewCopy(), copy.deepcopy(minEval)]]
                    elif (eval == minEval):
                        bestMove.append([src.createNewCopy(), dest.createNewCopy(), copy.deepcopy(minEval)])
                    beta = min(eval, beta)
                    if (beta <= alpha):
                        toBreak = True
                        break
                if (toBreak):
                    break
            return minEval, bestMove

I think that the error is in the line eval == maxEval and eval == minEval, as this function is generating some extra moves. Can someone please help me with this?

0

There are 0 answers