def sledeci_potez(self, tabla, igrac, dubina): """Igra poziva ovu funkcija, prosledjuje joj stanje i igraca a ova funkija vraca sledeci potez. Ovde se koriti obicni minimax algoritam za nalazenje najboljeg poteza. Ovo je abstraktna funkcija tako da je moraju implementirati sve klase koje nasledjuju AI. :param tabla: Tabla za koju treba naci sledeci potez :type tabla: Tabla :param na_potezu: Igrac koji je na potezu i za kojeg treba naci sledeci potez :type na_potezu: int :param dubina: Dubina za koju treba izvrsiti pretrazivanje stabla :type dubina: int """ self.dubina = dubina svi_potezi = svi_moguci_potezi(tabla, igrac) vrednosti = [] # nadji vrednosti svih mogucih poteza for p in svi_potezi: nova_tabla = Tabla(tabla) nova_tabla.izvrsi_potez(p) vrednosti.append(self.minimax(nova_tabla, self.dubina - 1, igrac, False, p)) # stampaj vrednosti svih poteza ako treba if self.stampaj_vrednosti_svih_poteza: print(f"\n\n\nNa potezu je {igrac}, koristi se algoritam MiniMax NOVI NOVI i vrednsti svih mogucih poteza su:") for i in range(len(svi_potezi)): print(svi_potezi[i], vrednosti[i]) # nadji najbolji potez i vrati ga index_maximuma = vrednosti.index(max(vrednosti)) return svi_potezi[index_maximuma]
def analizarDatos(anterior, actual): datos = Tabla(anterior, actual) tablaTranspuesta = datos.unirTablasXmes() nombre = 'MonthlyReport' reporte = Reporte(tablaTranspuesta, nombre) reporte.analizeReport() print('Reporte OK!')
def __init__(self, parent, igrac1, igrac2, naziv_fajla, stampaj_vrednosti_svih_poteza, crtaj_svaki_korak=True): """Konstruktor klase IgraCanvas, inicijalizuje potrebne atribute. :param parent: Roditeljski widget u kojem se crta IgraCanvas :type parent: Widget :param igrac1: Tip prvog igraca :type igrac1: str :param igrac2: Tip drugog igraca :type igrac2: str :param naziv_fajla: Putanja do falja iz kojeg se citaju potezi ili u kojem se upisuju potezi :type naziv_fajla: str :param stampaj_vrednosti_svih_poteza: Da li treba stampati vrednosti svih mogucih poteza za AI :type stampaj_vrednosti_svih_poteza: bool :param crtaj_svaki_korak: Kad igraju AI vs AI da li treba prikazivati svaki potez ili samo rezultat njihovog meca, defaults to True :type crtaj_svaki_korak: bool, optional """ Canvas.__init__(self, parent) self.config(width=500, height=550) self.bind("<Button-1>", self.mouse_click) self.crtaj_svaki_korak = crtaj_svaki_korak # postavljanje tip igraca koji su prosledjeni kao parametri self.plavi_AI = self.odaberi_AI(igrac1, stampaj_vrednosti_svih_poteza) self.crveni_AI = self.odaberi_AI(igrac2, stampaj_vrednosti_svih_poteza) # inicijalizacije matrice self.tabla = Tabla() self.na_potezu = None # da napisem dobar komentar za ovo self.game_state = GameState.POSTAVLJANJE_FIGURA # u pocetku svi igraci postavljaju svoje figure na tablu self.broj_figura = 0 # treba mi za prvu fazu gde se postavljaju figure self.selektovana_figura = (-2, -2) # otvaranje fajla, citanje i izvrsavanje poteza ako ih ima u njemu self.procitaj_fajl_i_popuni_tabelu(naziv_fajla) # otvaranje fajla za pisanje sad, svaki put kad se izvrsi neki potez on se upisuje u fajl self.f = open(naziv_fajla, "a") self.crtaj() self.zameni_igraca()
def minimax(self, tabla, dubina, igrac, maximizing_player, potez): """Rekurzivna funkcija koja racuna (samo) vrednost koju ce minimax algoritam vratiti za prosledjenu tabelu/stanje. Ovaj algoritam je uradjen po ugledu na psudo kod minimax algoritma sa moodle-a. :param tabla: Tabla nad kojom treba izvrsavati poteze ili za koju treba racunati staticku funkciju procene :type tabla: Tabla :param dubina: Dubina razvijanja stabla :type dubina: int :param igrac: Igrac za kojeg se racuna staticka funkcija procene :type igrac: int :param maximizing_player: Da li treba uzimati max ili min vrednost od potomaka :type maximizing_player: bool :param potez: Potez koji je doveo do ovog stanja :type potez: Potez :return: Vrednost koji ce minimimax algoritam nadji za stablo koje nastaje iz prosledjene table :rtype: int """ # ako ne treba dalje razvijati stablo vracamo staticku funkciju procene if dubina == 0: return self.funkcija_procene(tabla, potez, igrac) # pronalazimo sve moguce poteze iz ovog stanja u zavisnosti od toga koji igrac je sada na potezu if maximizing_player: svi_potezi = svi_moguci_potezi(tabla, igrac) else: svi_potezi = svi_moguci_potezi(tabla, protivnik(igrac)) # ako nema mogucih poteza vrati vrednost tog cvora vracamo staticku funkciju procene if len(svi_potezi) == 0: return self.funkcija_procene(tabla, potez, igrac) else: # inace nadji vrednosti svih mogucih poteza iz ovog stanja vrednosti = [] for p in svi_potezi: nova_tabla = Tabla(tabla) nova_tabla.izvrsi_potez(p) vrednosti.append(self.minimax(nova_tabla, dubina - 1, igrac, not maximizing_player, p)) # nalazimo minimalnu ili maksimalu vrednost medju potomcima cvora i postavljamo je za vrednost tog cvora if maximizing_player: return max(vrednosti) else: return min(vrednosti)
def max_value(self, tabla, dubina, potez, alfa, beta): """Vraca maksimalnu vrednost podstabla uz upotrebu minimax algoritma sa alfa beta odsecanjem. :param tabla: Trenutna tabla/stanje igre, raspored figura i spratova :type tabla: Tabla :param dubina: Dubina do koje treba pretraziti stablo :type dubina: int :param potez: Potez koji je doveo do ove table/stanja :type potez: Potez :param alfa: Vrednost najboljeg izbora koji smo pronasli do sada tokom putanje za MAX :type alfa: int :param beta: Vrednost najboljeg izbofa (ovde je to najmanja vrednost) koju smo pronali do sada tokom putanja za MIN :type beta: int :return: Vraca maksimalu vrednost podstabla uz uptrebu minimax algoritma sa alfa beta odsecanjem :rtype: int """ if dubina == 0: return self.funkcija_procene(tabla, potez, self.na_potezu) v = -1000 svi_potezi = svi_moguci_potezi(tabla, self.na_potezu) # ako nema mogucih poteza vrati vrednost tog cvora if len(svi_potezi) == 0: return self.funkcija_procene(tabla, potez, self.na_potezu) else: for p in svi_potezi: nova_tabla = Tabla(tabla) nova_tabla.izvrsi_potez(p) nova_vrednost = self.min_value(nova_tabla, dubina - 1, p, alfa, beta) # sad upisujem sve poteze u self.lista_poteza da bih na kraju znao koji da uzmem if dubina == self.dubina: self.lista_poteza_i_njihovih_vrednosti.append((nova_vrednost, p)) v = max(v, nova_vrednost) if v >= beta: return v alfa = max(alfa, v) return v
def min_value(self, tabla, dubina, potez, alfa, beta): """Vraca minimalnu vrednost podstabla uz upotrebu minimax algoritma sa alfa beta odsecanjem. :param tabla: Trenutna tabla/stanje igre, raspored figura i spratova :type tabla: Tabla :param dubina: Dubina do koje treba pretraziti stablo :type dubina: int :param potez: Potez koji je doveo do ove table/stanja :type potez: Potez :param alfa: Vrednost najboljeg izbora koji smo pronasli do sada tokom putanje za MAX :type alfa: int :param beta: Vrednost najboljeg izbofa (ovde je to najmanja vrednost) koju smo pronali do sada tokom putanja za MIN :type beta: int :return: Vraca minimalnu vrednost podstabla uz uptrebu minimax algoritma sa alfa beta odsecanjem :rtype: int """ if dubina == 0: return self.funkcija_procene(tabla, potez, self.na_potezu) v = 1000 svi_potezi = svi_moguci_potezi(tabla, protivnik(self.na_potezu)) # ako nema mogucih poteza vrati vrednost tog cvora if len(svi_potezi) == 0: return self.funkcija_procene(tabla, potez, self.na_potezu) else: for p in svi_potezi: nova_tabla = Tabla(tabla) nova_tabla.izvrsi_potez(p) nova_vrednost = self.max_value(nova_tabla, dubina - 1, p, alfa, beta) v = min(v, nova_vrednost) if v <= alfa: return v beta = min(beta, v) return v
from analex import AnalizadorLexico # Código de usuario # # Módulos: # import generador import REParser import code from gramatica import * from tabla import Tabla from errores import errores, avisos # # Variables globales: # T = Tabla() # Tabla de símbolos directos = set() # Terminales directos encontrados enparentesis = False # Cierto si estamos dentro de paréntesis _nombre = { "abre": u"un paréntesis abierto", "accion": u"una acción semántica", "asterisco": "un asterisco", "barra": "una barra", "cierra": u"un paréntesis cerrado", "codigo": u"un segmento de código", "cruz": "una cruz", "errordos": "un tratamiento de error", "especificacion_lexica": u"una especificación léxica", "flecha": "una flecha", "interrogante": "un interrogante", "mc_EOF": "el fin de fichero",
RED = (255, 0, 0) BLACK = (0, 0, 0) light = (170, 170, 170) dark = (100, 100, 100) yellow = (252, 247, 135) size = (800, 800) screen_width = 800 screen_height = 800 screen = pygame.display.set_mode(size) clock = pygame.time.Clock() pygame.display.set_caption("Checkers") done = False QED = False GUI = True komp = False tabla = Tabla() font1 = pygame.font.SysFont('Corbel', 70) tabla.drawBoard(screen) font2 = None text3 = None DEPTH = 4 def btton(screen, x, y, text, color): pygame.draw.rect(screen, color, [x, y, 400, 100]) text_rect = text.get_rect(center=(screen_width // 2, y + 50)) screen.blit(text, text_rect) class main: while not done: