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?