项目作者: DimaOanaTeodora

项目描述 :
Homework-2-KR-AI
高级语言: Python
项目地址: git://github.com/DimaOanaTeodora/Fox-and-Geese-AI-Game.git
创建时间: 2021-06-01T21:14:19Z
项目社区:https://github.com/DimaOanaTeodora/Fox-and-Geese-AI-Game

开源协议:MIT License

下载


Vulpi si Gaste ( :fox_face: vs :duck: )

Link cerinta joc

Link joc online

Meniu cu mai multe butoane



:chart: Posibilitate de selectare a celor 3 optiuni: Jucator vs Jucator, Jucator vs Calculator, Calculator(estimare gaste) vs Calculator(estimare vulpe)

:chart: Selectare default Jucator vs Calculator : Gaste vs Calculator Min-Max

:chart: Utilizatorul poate alege ce algoritm doreste sa foloseasca (Min-Max sau Alpha-Beta)

:chart: Utilizatorul poate sa aleaga daca joaca de partea vulpii sau a gastelor

:chart: Prin utilizarea meniului utilizatorul nu poate raspunde gresit

:chart: Utilizatorul poate alege din 3 nivele de dificultate

:chart: Fiecare nivel corespunde unei adancimi a arborelui calculata prin formula 1 + 2 * dificultate ( pt niv Usor => adancime = 1, pt niv Mediu => adancime=3, pt niv Greu => adancime =5 )

Tabla de joc



:chart: Interfata grafica PyGame

  1. def desenare_tabla_joc(self, ecran):
  2. for i in range(len(self.noduri)):
  3. for muchie in self.muchii[i]:
  4. pozitia1 = self.noduri[i].punct_desenat
  5. pozitia2 = self.noduri[muchie].punct_desenat
  6. # desenare linie dintre doua puncte
  7. pygame.draw.line(ecran, (0, 0, 0), pozitia1, pozitia2, 2)

:chart: Afisarea a cui este rândul să mute.

:chart: Indicarea, la finalul jocului, a câstigatorului

:chart: Generarea si afisarea starii initiale de joc: 13 gaste si o vulpe

:chart: Generarea si afisarea starilor intermediare de joc

:chart: Mutare utilizator prin eveniment in interfata grafica (click mouse)

:chart: clasa utilitara pentru controlul inputului de mouse: MouseInput ( constructor + metoda update(self))

:chart: Verificata si corectitudinea mutarilor utilizatorului prin apelul functiei:

  1. returneaza_nod_apasat(tabla_de_joc, pygame.mouse.get_pos())
  2. # daca nodul nu exista returneaza -1

Afisare + debugging in consola



:chart: Afisare in consola tabela de joc

  1. def afisare_consola(self, tabla_de_joc):
  2. for x in range(8):
  3. for y in range(8):
  4. if tabla_de_joc.numar_nod_in_grafic.get((x, y)) != None:
  5. # accesez valoarea din dictionarul numar_nod_in_grafic
  6. numar_nod = tabla_de_joc.numar_nod_in_grafic[(x, y)]
  7. if numar_nod in self.gaste:
  8. print("G ", end="")
  9. elif numar_nod == self.vulpe:
  10. print("V ", end="")
  11. else:
  12. print("# ", end="")
  13. else:
  14. print(" ", end="")
  15. print("\n", end="")

:chart: Afisarea timpului de gandire, dupa fiecare mutare

:chart: Pentru timpul de găndire al calculatorului: afișarea la final a timpului minim, maxim, mediu și a medianei.

  1. def update(self): # din clas Joc

:chart: Afișarea estimărilor date si numărului de noduri generate de minimax și alpha-beta ( functiile muta din clase)

:chart: La final se va afișa numărul minim, maxim, mediu și mediana pentru numarul de noduri generat pentru fiecare mutare

:chart: Afisarea timpului final de joc (cat a rulat programul) si a numarului total de mutari

:chart: Utilizatorul poate sa opreasca jocul cand vrea si sa afiseze analiza timpilor si a mutarilor in consola folosind tasta ESCAPE care il va intoarce in meniul principal

Cerinte suplimentare

:chart: Titlul ferestrei de joc

  1. pygame.display.set_caption('Dima Oana-Teodora Vulpi si Gaste')

:chart: Functia de generare succesorilor

  1. def genereaza_posibile_capturi(solutii, tabla_de_joc, configuratie_curenta, solutie_actuala):
  2. """
  3. Recrusivitate
  4. """
  5. if solutie_actuala != []: # adauga la lista noile noduri
  6. solutii.append(solutie_actuala)
  7. for alt_nod in range(len(tabla_de_joc.noduri)):
  8. if verificare_adaugare(solutie_actuala, tabla_de_joc, configuratie_curenta, alt_nod):
  9. solutie_noua = solutie_actuala.copy()
  10. solutie_noua.append(alt_nod)
  11. # apel recrusiv
  12. Vulpe.genereaza_posibile_capturi(solutii, tabla_de_joc, configuratie_curenta, solutie_noua)

:chart: Functie de testare a validitatii unei mutari (folosita si pentru a verifica mutarea utilizatorului)

  1. def mutare_valida(tabla_de_joc, configuratie_curenta, nr_nod_curent, nr_alt_nod):
  2. lista_muchii = tabla_de_joc.muchii[nr_nod_curent]
  3. if nr_alt_nod in lista_muchii:
  4. if (nr_alt_nod not in configuratie_curenta.gaste) and (nr_alt_nod != configuratie_curenta.vulpe):
  5. return True
  6. return False

:chart: Functia de stabilire a castigatorului

  1. def gaseste_castigator(self, tabla_de_joc):
  2. # calculez miscarile posibile ale vulpii
  3. configurari_vulpe = Vulpe.configurari_posibile(tabla_de_joc, self)
  4. if len(configurari_vulpe) == 0: # daca vulpea nu mai are miscari, gastele castiga
  5. return "castiga gastele"
  6. if len(self.gaste) <= 4: # daca gastele raman mai putine de 4 atunci vulpea castiga
  7. return "castiga vulpea"
  8. return "configuratie nefinala" # nu am configuratie finala

:chart: Doua moduri diferite de estimare a scorului (pentru stari care nu sunt inca finale)

  1. def estimare_gaste(tabla_de_joc, configuratie_curenta, dummy): # in favoarea gastelor
  2. def estimare_vulpe(tabla_de_joc, configuratie_anterioara, configuratie_curenta): # in favoarea vulpii

:chart: Comentarii

:chart: Explicarea pe scurt a fiecarei functii si a parametrilor: Python DocStrings

:chart: Ordonarea succesorilor înainte de expandare (bazat pe estimare) astfel încât alpha-beta să taie cât mai mult din arbore.

  1. configuratii_posibile = sorted(configuratii_posibile, key=lambda t: functie_estimare(tabla_de_joc, t, t))

:chart: Algoritmului de generare a mutarilor

Fiecare din cele 4 clase care apeleaza algoritmii de Min-Max sau Alpha-Beta, au o metoda prin care returneaza configuratiile urmatoare posibile generate in urma aplicarii unuia din cei 2 algoritmi.

  1. def muta(self, tabla_de_joc, configuratie_curenta)

:chart: Estimarea scorului

Se face prin 2 metode.

:fox_face: Clasa Vulpe

  1. def estimare_vulpe(tabla_de_joc, configuratie_anterioara, configuratie_curenta):
  2. return len(configuratie_anterioara.gaste) - len(configuratie_curenta.gaste)

Returneaza diferenta care reprezinta cate gaste a mancat vulpea de la ultima mutare in joc.

:duck: Clasa Gaste

  1. def estimare_gaste(tabla_de_joc, configuratie_curenta, dummy):
  2. nr_gaste = 0
  3. for nr_alt_nod in tabla_de_joc.muchii[configuratie_curenta.vulpe]:
  4. if nr_alt_nod in configuratie_curenta.gaste:
  5. nr_gaste += 1
  6. return nr_gaste

Returneaza nr de gaste care inconjoara vulpea in configuratia curenta.