Search code examples
pythonpython-3.xtic-tac-toealpha-beta-pruning

find best move using alphabeta TicTacToe


Trying to find the best move as well as the score. I have gotten my program to correctly return the score of the game, but I want it to return the move as well. How can I change my code so that it does this? Similar to this and this. See my failed code here, the None returned if the game is over should be the move instead.

def alphabeta(game_state, alpha, beta, our_turn=True):
    if game_state.is_gameover():
         return game_state.score()
    if our_turn:
        score = -9999
        for move in game_state.get_possible_moves():
            child = game_state.get_next_state(move, True)
            temp_max = alphabeta(child, alpha, beta, False) 
            if temp_max > score:
                score = temp_max
            alpha = max(alpha, score)
            if beta <= alpha:
                break
        return score
    else:
        score = 9999
        for move in game_state.get_possible_moves():
            child = game_state.get_next_state(move, False)
            temp_min = alphabeta(child, alpha, beta, True)
            if temp_min < score:
                score = temp_min
            beta = min(beta, score)
            if beta <= alpha:
                break
        return score

Solution

  • You could keep track of best move so far, something like:

        if game_state.is_gameover():
             return game_state.score(), None
        if our_turn:
            score = -9999
            for move in game_state.get_possible_moves():
                child = game_state.get_next_state(move, True)
                temp_max, _ = alphabeta(child, alpha, beta, False) # _ to disregard the returned move
                if temp_max > score:
                    score = temp_max
                    best_move = move
                alpha = max(alpha, score)
                if beta <= alpha:
                    break
            return score, best_move
    

    and similar for other case