コード例 #1
0
ファイル: ai.py プロジェクト: samedb/Santorini
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
コード例 #2
0
ファイル: ai.py プロジェクト: samedb/Santorini
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
コード例 #3
0
ファイル: ai.py プロジェクト: samedb/Santorini
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