Característiques:
Minimitzant el guany de
def cerca_minimax(joc, estat):
jugador = estat.a_moure
return valor_maxim(joc, jugador, estat)
def valor_maxim(joc, jugador, estat):
if joc.es_terminal(estat):
return joc.utilitat(estat, jugador), None
v, moviment = float('-inf'), None
for a in joc.accions(estat):
v2, _ = valor_minim(joc, jugador, joc.resultat(estat, a))
if v2 > v:
v, moviment = v2, a
return v, moviment
def valor_minim(joc, jugador, estat):
if joc.es_terminal(estat):
return joc.utilitat(estat, jugador), None
v, moviment = float('inf'), None
for a in joc.accions(estat):
v2, _ = valor_maxim(joc, jugador, joc.resultat(estat, a))
if v2 < v:
v, moviment = v2, a
return v, moviment
def busqueda_alfa_beta(joc, estat):
jugador = estat.a_moure
return valor_maxim_ab(joc, jugador, estat, float('-inf'), float('inf'))
def valor_maxim_ab(joc, jugador, estat, alfa, beta):
if joc.es_terminal(estat):
return joc.utilitat(estat, jugador), None
v, moviment = float('-inf'), None
for a in joc.accions(estat):
v2, _ = valor_minim_ab(joc, jugador, joc.resultat(estat, a), alfa, beta)
if v2 > v:
v, moviment = v2, a
if v >= beta:
return v, moviment
alfa = max(alfa, v)
return v, moviment
def valor_minim_ab(joc, jugador, estat, alfa, beta):
if joc.es_terminal(estat):
return joc.utilitat(estat, jugador), None
v, moviment = float('inf'), None
for a in joc.accions(estat):
v2, _ = valor_maxim_ab(
joc, jugador, joc.resultat(estat, a), alfa, beta
)
if v2 < v:
v, moviment = v2, a
if v <= alfa:
return v, moviment
beta = min(beta, v)
return v, moviment
def avalua_tres_en_ratlla(joc, estat):
jugador = estat.a_moure
utilitat = 0
for i in range(3):
for j in range(3):
if estat.tauler[i][j] == jugador:
utilitat += 1
elif estat.tauler[i][j] == joc.jugador_contrari(jugador):
utilitat -= 1
return utilitat