lunes, 27 de junio de 2016

Implementación Del Podado Alfa-Beta Al Algoritmo Minimax (Tres En Raya Con Algoritmo Minimax)


La unica función que habremos de modificar es la siguiente:

def minimax(tablero, turno_player, alfa = (-31, None), beta = (31, None), profundidad = 5):
    """Implementacion del algoritmo minimax con podado alfa-beta a nuestro tres en raya.
    ARGUMENTOS:
        -tablero. String de longitud 9 que contiene los valores del tablero.
        -turno_player. Booleano que indica el turno, si es positivo significa que le toca al jugador humano.
        -profundidad. Valor numerico que limita el numero de veces que la funcion se llama a si misma (dificultad) y que incita a la maquina
                      a realizar los movimientos que impliquen alargar la partida lo maximo posible (intentando ganar siempre)."""
    if ganador(tablero) == MAQUINA: return (+30 - profundidad, None) #gana pc
    elif ganador(tablero) == JUGADOR: return (-30 - profundidad, None) #pierde pc
    elif VACIO not in tablero or profundidad < 1: return (0, None) #empatan
    elif turno_player: #turno de jugador
        for a in range(9):
            if tablero[a] == " ":
                valor = minimax(tablero[:a] + JUGADOR + tablero[a + 1:], not turno_player, alfa, beta, profundidad - 1)[0]
                if valor < beta[0]: beta = (valor, a) #jugador intenta causar el MENOR beneficio a pc
                if beta[0] <= alfa[0]: break
        return beta

    else: #turno de pc
        for a in range(9):
            if tablero[a] == " ":
                valor = minimax(tablero[:a] + MAQUINA + tablero[a + 1:], not turno_player, alfa, beta, profundidad - 1)[0]
                if valor > alfa[0]: alfa = (valor, a) #pc intenta causar el MAYOR beneficio a si mismo
                if beta[0] <= alfa[0]: break
        return alfa



Si bien hay que tener en cuenta que ahora al llamar a la función, se ha de especificar el argumento profundidad.
ANTES
a = minimax(tablero, False, dificultad)[1] #algoritmo minimax limitado segun la dificultad
AHORA
a = minimax(tablero, False, profundidad = dificultad)[1] #algoritmo minimax limitado segun la dificultad  

No hay comentarios:

Publicar un comentario