def nova_staticka_funkcija_procene(tabla: Tabla, potez: Potez, na_potezu): """Staticka funkcija procene stanja igre koja se racuna kao algebarski zbir visina figura na kvadrat. f = moja_figura1.broj_spratova^2 + moja_figura2.broj_spratova^2 - protivnikova_figura1.broj_spratova^2 - protivnikova_figura2.broj_spratova^2 :param tabla: Tabla/stanje za koju treba izracunati staticku funkciju procene :type tabla: Tabla :param potez: Potez koji je doveo to tog stanja :type potez: Potez :param na_potezu: Igrac za kojeg se racuna staticka funkcija procene :type na_potezu: int :return: Vrednost staticke funkcije procene :rtype: int """ if tabla.pobeda(na_potezu): return 100 if tabla.poraz(na_potezu): return -100 suma_visina = 0 for i in range(5): for j in range(5): if tabla.matrica[i][j].igrac == na_potezu: suma_visina += tabla.matrica[i][j].broj_spratova**2 elif tabla.matrica[i][j].igrac != na_potezu and tabla.matrica[i][j].igrac != Igrac.NIJEDAN: # ako je protivnik suma_visina -= tabla.matrica[i][j].broj_spratova**2 return suma_visina
def staticka_funkcija_procene(tabla: Tabla, potez: Potez, na_potezu): """Ovo je jednostavna staticka funkcija procene f,koja se računa kao 𝑓 = 𝑛 + 𝑚, gde je 𝑛 broj pločica odredišnog polja, a 𝑚 broj nivoa na koje se dodaje plocica poomnozen razlikom rastojanja sopstvenih i protivnickih igraca od tog polja. Da bi se ova funkcija izracunala pored stanja/table potreban mi je i potez koji dovodi to tog novog stanja kao i igrac koji je trenutno na potezu. :param tabla: Tabla/stanje za koju treba izracunati staticku funkciju procene :type tabla: Tabla :param potez: Potez koji je doveo to tog stanja :type potez: Potez :param na_potezu: Igrac za kojeg se racuna staticka funkcija procene :type na_potezu: int :return: Vrednost staticke funkcije procene :rtype: int """ if tabla.pobeda(na_potezu): return 100 if tabla.poraz(na_potezu): return -100 # kupolu postavlja samo kada bas mora, postavljanje kupole se racuna kao -50 if tabla.matrica[potez.xg][potez.yg].broj_spratova == 4: return -50 n = tabla.matrica[potez.x2][potez.y2].broj_spratova rastojanja = 0 for i in range(5): for j in range(5): if tabla.matrica[i][j].igrac == na_potezu: rastojanja += tabla.rastojanje(i, j, potez.xg, potez.yg) elif tabla.matrica[i][j].igrac != na_potezu and tabla.matrica[i][j].igrac != Igrac.NIJEDAN: # ako je protivnik rastojanja -= tabla.rastojanje(i, j, potez.xg, potez.yg) m = tabla.matrica[potez.xg][potez.yg].broj_spratova * rastojanja return n + m
def unapredjena_staticka_funkcija_procene(tabla: Tabla, potez: Potez, na_potezu): """Ovo je unapredjena staticka funkcija procene f,koja se računa kao 𝑓 = 3 * 𝑛 + 𝑚 + suma_visina + 5 * razlika_u_visini, gde je 𝑛 broj pločica odredišnog polja, a 𝑚 broj nivoa na koje se dodaje plocica poomnozen razlikom rastojanja sopstvenih i protivnickih igraca od tog polja, suma_visina je zbir visina spostvenih figura umanjen za zbir visina protivnickih figura,razlika_u_visini je razlika u visini izmedju prethodne i sadasnje pozicije figure koja se krece. Da bi se ova funkcija izracunala pored stanja/table potreban mi je i potez koji dovodi to tog novog stanja kao i igrac koji je trenutno na potezu. :param tabla: Tabla/stanje za koju treba izracunati staticku funkciju procene :type tabla: Tabla :param potez: Potez koji je doveo to tog stanja :type potez: Potez :param na_potezu: Igrac za kojeg se racuna staticka funkcija procene :type na_potezu: int :return: Vrednost staticke funkcije procene :rtype: int """ if tabla.pobeda(na_potezu): return 100 if tabla.poraz(na_potezu): return -100 # kupolu postavlja samo kada bas mora if tabla.matrica[potez.xg][potez.yg].broj_spratova == 4: return -50 n = tabla.matrica[potez.x2][potez.y2].broj_spratova rastojanja = 0 suma_visina = 0 for i in range(5): for j in range(5): if tabla.matrica[i][j].igrac == na_potezu: rastojanja += tabla.rastojanje(i, j, potez.xg, potez.yg)**2 suma_visina += tabla.matrica[i][j].broj_spratova**2 elif tabla.matrica[i][j].igrac != na_potezu and tabla.matrica[i][j].igrac != Igrac.NIJEDAN: # ako je protivnik rastojanja -= tabla.rastojanje(i, j, potez.xg, potez.yg)**2 suma_visina -= tabla.matrica[i][j].broj_spratova**2 m = tabla.matrica[potez.xg][potez.yg].broj_spratova * rastojanja razlika_u_visini = tabla.matrica[potez.x2][potez.y2].broj_spratova - tabla.matrica[potez.x1][potez.y1].broj_spratova return 3 * n + m + suma_visina + 5 * razlika_u_visini