from BoardColor import * from BoardMoves import * import random def alphabeta(position, depth, maxPlayer): if depth == 0 or position.WinnerSide() is not None: return position.evaluateScore(), position if maxPlayer: maxVal = float('-inf') allBoards = getAllBoards(position, AI_COLOR_STR) if not allBoards: return float('-inf'), position index = random.randint(0, len(allBoards) - 1) bestMove = allBoards[index] for move in allBoards[1:]: value = alphabeta(position, depth - 1, False)[0] maxVal = max(value, maxVal) position.alpha = max(position.alpha, maxVal) if position.beta <= position.alpha: bestMove = move break return maxVal, bestMove else: # minPlayer minVal = float('inf') allBoards = getAllBoards(position, PLAYER_COLOR_STR) if not allBoards: return float('inf'), position index = random.randint(0, len(allBoards) - 1) bestMove = allBoards[index] for move in allBoards[1:]: value = alphabeta(position, depth - 1, True)[0] minVal = min(value, minVal) position.beta = min(position.beta, minVal) if position.beta <= position.alpha: bestMove = move break return minVal, bestMove