diff --git a/.idea/Sztuczna_Inteligencja_Gr16.iml b/.idea/Sztuczna_Inteligencja_Gr16.iml index 2f5c6a2..f754d4e 100644 --- a/.idea/Sztuczna_Inteligencja_Gr16.iml +++ b/.idea/Sztuczna_Inteligencja_Gr16.iml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index f65f09f..89fb180 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/agent.py b/agent.py index df6ce6b..db4b854 100644 --- a/agent.py +++ b/agent.py @@ -1,24 +1,28 @@ import random +from collections import deque +from bfs import Stan, Akcja, graphsearch from krata import * class Agent: + cel: Stan bok = BOK_AGENTA1 bokWPolach = BOK_AGENTA1_W_POLACH - def __init__(self, Krata, poleStartoweGorne, tekstura): + def __init__(self, Krata, poleStartoweGorne: PoleKraty, tekstura): self.krata = Krata self.poleStartoweGorne = poleStartoweGorne self.tekstura = tekstura self.okreslPolozenie() - self.obierzNowyKierunek() + self.obierzLosowyKierunek() self.okreslDlugoscDrogi() Krata.agent = self + self.cel = None def ruszSie(self): if self.droga <= 0: - self.obierzNowyKierunek() + self.obierzLosowyKierunek() self.okreslDlugoscDrogi() self.zrobKrokWMoimKierunku() self.droga -= 1 @@ -28,10 +32,10 @@ class Agent: self.zawroc() self.okreslDlugoscDrogi() - def obierzNowyKierunek(self): + def obierzLosowyKierunek(self): self.kierunek = Kierunek(random.randint(0, 3)) if self.maxDlugoscDrogiWMoimKierunku() < 1: - self.obierzNowyKierunek() + self.obierzLosowyKierunek() def okreslDlugoscDrogi(self): self.droga = random.randint(1, self.maxDlugoscDrogiWMoimKierunku()) @@ -66,75 +70,115 @@ class Agent: # ZROBIC sciany def wszedlemWSciane(self): - for wiersz in range (self.poleStartoweGorne.wiersz,self.poleKoncoweDolne.wiersz+1): - for kolumna in range(self.poleStartoweGorne.kolumna,self.poleKoncoweDolne.kolumna+1): - if self.krata.krata[wiersz][kolumna]==ZawartoscPola.SCIANA: - return True + for wiersz in range(self.poleStartoweGorne.wiersz, self.poleKoncoweDolne.wiersz + 1): + for kolumna in range(self.poleStartoweGorne.kolumna, self.poleKoncoweDolne.kolumna + 1): + if self.krata.krata[wiersz][kolumna] == ZawartoscPola.SCIANA: + return True return False def zawroc(self): - if self.kierunek == Kierunek.GORA: - self.kierunek = Kierunek.DOL - elif self.kierunek == Kierunek.DOL: - self.kierunek = Kierunek.GORA - elif self.kierunek == Kierunek.LEWO: - self.kierunek = Kierunek.PRAWO - elif self.kierunek == Kierunek.PRAWO: - self.kierunek = Kierunek.LEWO + if self.kierunek == Kierunek.POLNOC: + self.kierunek = Kierunek.POLUDNIE + elif self.kierunek == Kierunek.POLUDNIE: + self.kierunek = Kierunek.POLNOC + elif self.kierunek == Kierunek.ZACHOD: + self.kierunek = Kierunek.WSCHOD + elif self.kierunek == Kierunek.WSCHOD: + self.kierunek = Kierunek.ZACHOD def maxDlugoscDrogiWMoimKierunku(self): - if self.kierunek == Kierunek.GORA: + if self.kierunek == Kierunek.POLNOC: return self.poleStartoweGorne.wiersz - elif self.kierunek == Kierunek.DOL: + elif self.kierunek == Kierunek.POLUDNIE: return self.krata.liczbaPolPionowo - self.poleKoncoweDolne.wiersz - 1 - elif self.kierunek == Kierunek.LEWO: + elif self.kierunek == Kierunek.ZACHOD: return self.poleStartoweGorne.kolumna - elif self.kierunek == Kierunek.PRAWO: + elif self.kierunek == Kierunek.WSCHOD: return self.krata.liczbaPolPoziomo - self.poleKoncoweDolne.kolumna - 1 def zrobKrokWMoimKierunku(self): - if self.kierunek == Kierunek.GORA: - self.idzWGore() - elif self.kierunek == Kierunek.DOL: - self.idzWDol() - elif self.kierunek == Kierunek.LEWO: - self.idzWLewo() - elif self.kierunek == Kierunek.PRAWO: - self.idzWPrawo() + if self.kierunek == Kierunek.POLNOC: + self.idzNaPolnoc() + elif self.kierunek == Kierunek.POLUDNIE: + self.idzNaPoludnie() + elif self.kierunek == Kierunek.ZACHOD: + self.idzNaZachod() + elif self.kierunek == Kierunek.WSCHOD: + self.idzNaWschod() def zrobKrokWOdwrotnymKierunku(self): - if self.kierunek == Kierunek.GORA: - self.idzWDol() - elif self.kierunek == Kierunek.DOL: - self.idzWGore() - elif self.kierunek == Kierunek.LEWO: - self.idzWPrawo() - elif self.kierunek == Kierunek.PRAWO: - self.idzWLewo() + if self.kierunek == Kierunek.POLNOC: + self.idzNaPoludnie() + elif self.kierunek == Kierunek.POLUDNIE: + self.idzNaPolnoc() + elif self.kierunek == Kierunek.ZACHOD: + self.idzNaWschod() + elif self.kierunek == Kierunek.WSCHOD: + self.idzNaZachod() - def idzWGore(self): + def idzNaPolnoc(self): self.poleStartoweGorne.wiersz -= 1 - def idzWDol(self): + def idzNaPoludnie(self): self.poleStartoweGorne.wiersz += 1 - def idzWLewo(self): + def idzNaZachod(self): self.poleStartoweGorne.kolumna -= 1 - def idzWPrawo(self): + def idzNaWschod(self): self.poleStartoweGorne.kolumna += 1 - def bfs(graph, start, cel): - sciezka = [start] - wierzcholek_sciezka = [start, sciezka] - bfs_kolejka = [wierzcholek_sciezka] - odwiedzone = set() - while bfs_kolejka: - aktualne, sciezka = bfs_kolejka.pop(0) - odwiedzone.add(aktualne) - for neighbor in graph[aktualne]: - if neighbor not in odwiedzone: - if neighbor is cel: - return sciezka + [neighbor] - else: - bfs_kolejka.append([neighbor, sciezka + [neighbor]]) + # def bfs(self,graph, start, cel): + # sciezka = [start] + # wierzcholek_sciezka = [start, sciezka] + # bfs_kolejka = [wierzcholek_sciezka] + # odwiedzone = set() + # while bfs_kolejka: + # aktualne, sciezka = bfs_kolejka.pop(0) + # odwiedzone.add(aktualne) + # for neighbor in graph[aktualne]: + # if neighbor not in odwiedzone: + # if neighbor is cel: + # return sciezka + [neighbor] + # else: + # bfs_kolejka.append([neighbor, sciezka + [neighbor]]) + + def idzDoCelu(self, klatkaz): + stan_poczatkowy = Stan(self.kierunek, self.poleStartoweGorne) + stos_akcji = graphsearch(stan_poczatkowy, self.cel) + if stos_akcji == False: + print("Nie można dotrzeć.") + else: + self.wykonaj_stos_akcji(stos_akcji, klatkaz) + print("Dotarłem.") + + self.krata.krata[self.cel.poleStartoweGorne.wiersz][ + self.cel.poleStartoweGorne.kolumna] = ZawartoscPola.PUSTE ##chwilowo-przeniesc pozniej + + self.cel = None + + def wykonaj_stos_akcji(self, stos_akcji: deque, klatkaz): + while stos_akcji: + klatkaz.tick(FPS) + self.narysujAgenta() + akcja = stos_akcji.pop() + print(akcja.name, end=" ") + if akcja == Akcja.KROK_W_PRZOD: + self.zrobKrokWMoimKierunku() + self.okreslPolozenie() + elif akcja == Akcja.OBROT_W_LEWO: + self.obrocSieWLewo() + elif akcja == Akcja.OBROT_W_PRAWO: + self.obrocSieWPrawo() + print() + + def obrocSieWLewo(self): + self.kierunek = self.kierunek.kierunekNaLewo() + + def obrocSieWPrawo(self): + self.kierunek = self.kierunek.kierunekNaPrawo() + + def narysujAgenta(self): + self.krata.narysujKrate() + self.krata.okno.blit(self.tekstura, (self.hitbox.x, self.hitbox.y)) + pygame.display.update() diff --git a/bfs.py b/bfs.py index ff1a16f..40129b5 100644 --- a/bfs.py +++ b/bfs.py @@ -1,45 +1,148 @@ +from collections import deque + from krata import * -def bfs(Krata: Krata, start: PoleKraty, cel: PoleKraty): - wierzcholek_sciezka = [["start", start], [["start", start]]] - bfs_kolejka = [wierzcholek_sciezka] - odwiedzone = set() - while bfs_kolejka: - elem = bfs_kolejka.pop(0) - odwNowe = str(elem[0][1].wiersz) + "/" + str(elem[0][1].kolumna) - odwiedzone.add(odwNowe) - polaObok = succ(Krata,elem[0][1]) - for neighbor in polaObok: - sciezka = elem[1].copy() - sprOdw = str(neighbor[1].wiersz) + "/" + str(neighbor[1].kolumna) - if sprOdw not in odwiedzone: - if neighbor[1].wiersz == cel.wiersz and neighbor[1].kolumna == cel.kolumna: - sciezka.append(neighbor) - return sciezka - else: - sciezka.append([neighbor]) - bfs_kolejka.append([neighbor, sciezka]) -def succ(Krata: Krata, poleKraty: PoleKraty): - polaDostepneObok = list() - if poleKraty.kolumna - 1 >= 0: # nie poza kratę - if Krata.krata[poleKraty.wiersz][poleKraty.kolumna - 1] != ZawartoscPola.SCIANA: # nie szafka (szafka to ściana) - poleLewe = PoleKraty(Krata, poleKraty.wiersz, poleKraty.kolumna - 1) - naLewo = ["Kierunek.LEWO", poleLewe] - polaDostepneObok.append(naLewo) - if poleKraty.wiersz - 1 >= 0: # nie poza kratę - if Krata.krata[poleKraty.wiersz - 1][poleKraty.kolumna] != ZawartoscPola.SCIANA: - poleGorne = PoleKraty(Krata, poleKraty.wiersz - 1, poleKraty.kolumna) - naGore = ["Kierunek.GORA", poleGorne] - polaDostepneObok.append(naGore) - if poleKraty.kolumna + 1 < LICZBA_POL_W_POZIOMIE: # nie poza kratę - if Krata.krata[poleKraty.wiersz][poleKraty.kolumna + 1] != ZawartoscPola.SCIANA: - polePrawe = PoleKraty(Krata, poleKraty.wiersz, poleKraty.kolumna + 1) - naPrawo = ["Kierunek.PRAWO", polePrawe] - polaDostepneObok.append(naPrawo) - if poleKraty.wiersz + 1 < LICZBA_POL_W_PIONIE: # nie poza kratę - if Krata.krata[poleKraty.wiersz + 1][poleKraty.kolumna] != ZawartoscPola.SCIANA: - poleDolne = PoleKraty(Krata, poleKraty.wiersz + 1, poleKraty.kolumna) - naDol = ["Kierunek.DOL", poleDolne] - polaDostepneObok.append(naDol) - return polaDostepneObok \ No newline at end of file +class Akcja(Enum): + OBROT_W_LEWO = 0 + OBROT_W_PRAWO = 1 + KROK_W_PRZOD = 2 + + +class Stan: + def __init__(self, kierunek: Kierunek, poleStartoweGorne: PoleKraty): + self.kierunek = kierunek + self.poleStartoweGorne = poleStartoweGorne + + def skopiuj(self): + return Stan(self.kierunek, self.poleStartoweGorne.skopiuj()) + + +class Nastepnik: + def __init__(self, akcja: Akcja, stan: Stan, poprzednik): + self.akcja = akcja + self.stan = stan + self._poprzednik = poprzednik + + def getPoprzednik(self): + return self._poprzednik + + def setPoprzednik(self, x): + raise Exception + + poprzednik = property(getPoprzednik, setPoprzednik) + + def skopiuj(self): + return Nastepnik(self.akcja, self.stan.skopiuj(), self.poprzednik) + + +def nastepnik_obrotu_w_lewo(nastepnik: Nastepnik): + akcja = Akcja.OBROT_W_LEWO + stan = Stan(nastepnik.stan.kierunek.kierunekNaLewo(), nastepnik.stan.poleStartoweGorne) + return Nastepnik(akcja, stan, nastepnik) + + +def nastepnik_obrotu_w_prawo(nastepnik: Nastepnik): + akcja = Akcja.OBROT_W_PRAWO + stan = Stan(nastepnik.stan.kierunek.kierunekNaPrawo(), nastepnik.stan.poleStartoweGorne) + return Nastepnik(akcja, stan, nastepnik) + + +def nastepnik_kroku_w_przod(nastepnik: Nastepnik): + akcja = Akcja.KROK_W_PRZOD + stan = Stan(nastepnik.stan.kierunek, nastepnik.stan.poleStartoweGorne) + if stan.kierunek == Kierunek.POLNOC: + stan.poleStartoweGorne.wiersz -= 1 + elif stan.kierunek == Kierunek.POLUDNIE: + stan.poleStartoweGorne.wiersz += 1 + elif stan.kierunek == Kierunek.ZACHOD: + stan.poleStartoweGorne.kolumna -= 1 + elif stan.kierunek == Kierunek.WSCHOD: + stan.poleStartoweGorne.kolumna += 1 + return Nastepnik(akcja, stan, nastepnik) + + +def pole_w_granicach_kraty(pole: PoleKraty): + if pole.wiersz not in range(0, pole.krata.liczbaPolPionowo): + return False + elif pole.kolumna not in range(0, pole.krata.liczbaPolPoziomo): + return False + else: + return True + + +def pole_puste(pole: PoleKraty): + if pole.krata.krata[pole.wiersz][pole.kolumna] in (ZawartoscPola.PUSTE, ZawartoscPola.CEL): + return True + else: + return False + + +def mozna_zrobic_krok_w_przod(nastepnik: Nastepnik): + nastepnik = nastepnik_kroku_w_przod(nastepnik) + if pole_w_granicach_kraty(nastepnik.stan.poleStartoweGorne) and pole_puste(nastepnik.stan.poleStartoweGorne): + return True + else: + return False + + +def succ(nastepnik: Nastepnik): + wynik = [] + pom = nastepnik.skopiuj() + wynik.append(nastepnik_obrotu_w_lewo(pom)) + pom = nastepnik.skopiuj() + wynik.append(nastepnik_obrotu_w_prawo(pom)) + pom = nastepnik.skopiuj() + if mozna_zrobic_krok_w_przod(pom): + pom = nastepnik.skopiuj() + wynik.append(nastepnik_kroku_w_przod(pom)) + return wynik + + +def goaltest(stan: Stan, cel: Stan): + if stan.poleStartoweGorne.wiersz != cel.poleStartoweGorne.wiersz: + return False + elif stan.poleStartoweGorne.kolumna != cel.poleStartoweGorne.kolumna: + return False + else: + return True + + +def stan_w_liscie_nastepnikow(stan: Stan, lista_nastepnikow): + for i in lista_nastepnikow: + if i.stan.kierunek != stan.kierunek: + continue + elif i.stan.poleStartoweGorne.wiersz != stan.poleStartoweGorne.wiersz: + continue + elif i.stan.poleStartoweGorne.kolumna != stan.poleStartoweGorne.kolumna: + continue + else: + return True + return False + + +def stos_akcji(stan_koncowy: Nastepnik): + stos = deque() + while stan_koncowy.poprzednik is not None: + stos.append(stan_koncowy.akcja) + stan_koncowy = stan_koncowy.poprzednik + return stos + + +def graphsearch(istate: Stan, cel: Stan): + fringe = deque() + explored = [] + fringe.append(Nastepnik(None, istate, None)) + while fringe: + # for i in fringe: + # print("F",i.stan.kierunek,i.stan.poleStartoweGorne.wiersz,i.stan.poleStartoweGorne.kolumna,end=" ") + # print() + element: Nastepnik = fringe.popleft() + if goaltest(element.stan, cel): + return stos_akcji(element) + explored.append(element) + for nastepnik in succ(element): + if not stan_w_liscie_nastepnikow(nastepnik.stan, fringe) and not stan_w_liscie_nastepnikow(nastepnik.stan, + explored): + fringe.append(nastepnik) + return False diff --git a/enumy_i_slowniki.py b/enumy_i_slowniki.py index 6a95e28..2c6ca4c 100644 --- a/enumy_i_slowniki.py +++ b/enumy_i_slowniki.py @@ -4,18 +4,40 @@ from stale import * class Kierunek(Enum): - GORA = 0 - DOL = 1 - LEWO = 2 - PRAWO = 3 + POLNOC = 0 + POLUDNIE = 1 + ZACHOD = 2 + WSCHOD = 3 + + def kierunekNaLewo(self): + if self == Kierunek.POLNOC: + return Kierunek.ZACHOD + elif self == Kierunek.POLUDNIE: + return Kierunek.WSCHOD + elif self == Kierunek.ZACHOD: + return Kierunek.POLUDNIE + elif self == Kierunek.WSCHOD: + return Kierunek.POLNOC + + def kierunekNaPrawo(self): + if self == Kierunek.POLNOC: + return Kierunek.WSCHOD + elif self == Kierunek.POLUDNIE: + return Kierunek.ZACHOD + elif self == Kierunek.ZACHOD: + return Kierunek.POLNOC + elif self == Kierunek.WSCHOD: + return Kierunek.POLUDNIE class ZawartoscPola(Enum): PUSTE = 0 SCIANA = 1 + CEL = 2 ZawartoscPolaNaKolorPola = { ZawartoscPola.PUSTE: BIALY, - ZawartoscPola.SCIANA: CIEMNY_BRAZOWY1 + ZawartoscPola.SCIANA: CIEMNY_BRAZOWY1, + ZawartoscPola.CEL: ZIELONY1 } diff --git a/etykieta.py b/etykieta.py index f787d26..26a9ebb 100644 --- a/etykieta.py +++ b/etykieta.py @@ -1,7 +1,7 @@ class Etykieta: - def __init__(self,nazwa_paczki,producent,numer_paczki,cecha_paczki,data_wysylki): + def __init__(self, nazwa_paczki, producent, numer_paczki, cecha_paczki, data_wysylki): self.nazwa_paczki = nazwa_paczki - self.producent=producent + self.producent = producent self.numer_paczki = numer_paczki self.cecha_paczki = cecha_paczki self.data_wysylki = data_wysylki diff --git a/krata.py b/krata.py index 3c343d7..b856fa9 100644 --- a/krata.py +++ b/krata.py @@ -36,6 +36,9 @@ class PoleKraty: wiersz = property(getWiersz, setWiersz) kolumna = property(getKolumna, setKolumna) + def skopiuj(self): + return PoleKraty(self.krata, self.wiersz, self.kolumna) + class Krata: def __init__(self, okno): @@ -65,7 +68,7 @@ class Krata: def wyswietlKrate(self): self.narysujKrate() # self.narysujKrateAlternatywnie() - self.narysujAgenta() + # self.narysujAgenta() pygame.display.update() def narysujKrate(self): @@ -90,7 +93,7 @@ class Krata: pygame.draw.line(self.okno, CZARNY, (0, new_height), (SZEROKOSC_OKNA, new_height), ODSTEP_MIEDZY_POLAMI) pygame.draw.line(self.okno, CZARNY, (new_width, 0), (new_width, WYSOKOSC_OKNA), ODSTEP_MIEDZY_POLAMI) - def narysujAgenta(self): - if self.agent is not None: - self.okno.blit(self.agent.tekstura, (self.agent.hitbox.x, self.agent.hitbox.y)) - self.agent.ruszSie() + # def narysujAgenta(self): + # if self.agent is not None: + # self.okno.blit(self.agent.tekstura, (self.agent.hitbox.x, self.agent.hitbox.y)) + # self.agent.ruszSie() diff --git a/main.py b/main.py index 536a880..8218583 100644 --- a/main.py +++ b/main.py @@ -1,49 +1,62 @@ import os -import ctypes from agent import * from ramy_czyli_wiedza_agenta import * -from bfs import * -#aby działalo w oknie + rozdzielczość ekranu -#ctypes.windll.shcore.SetProcessDpiAwareness(1) +# aby działalo w oknie + rozdzielczość ekranu +# ctypes.windll.shcore.SetProcessDpiAwareness(1) Okno = pygame.display.set_mode((SZEROKOSC_OKNA, WYSOKOSC_OKNA)) pygame.display.set_caption("Okno1") Krata = Krata(Okno) -Pomieszczenie=Pomieszczenie(0,0) +Pomieszczenie = Pomieszczenie(WarunkiPowietrza(0, 0), 0) + def dodaj_agenta(): # pole_lewe_gorne = PoleKraty(Krata, random.randint(0, LICZBA_POL_W_PIONIE - BOK_AGENTA1_W_POLACH), # random.randint(0, LICZBA_POL_W_POZIOMIE - BOK_AGENTA1_W_POLACH)) - pole_lewe_gorne = PoleKraty(Krata, LICZBA_POL_W_PIONIE-BOK_AGENTA1_W_POLACH, int(LICZBA_POL_W_POZIOMIE/2)) + # pole_lewe_gorne = PoleKraty(Krata, LICZBA_POL_W_PIONIE - BOK_AGENTA1_W_POLACH, int(LICZBA_POL_W_POZIOMIE / 2)) + pole_lewe_gorne = PoleKraty(Krata, 0, 0) pom = 'traktor_ikona.png' ikona = pygame.transform.scale(pygame.image.load(os.path.join('Ikony', pom)), (BOK_AGENTA1, BOK_AGENTA1)) Agent(Krata, pole_lewe_gorne, ikona) + # zawsze na poczatku polnoc + Krata.agent.kierunek = Kierunek.POLNOC -def dodaj_szafke(numerSzafki, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_kolumna, poczatek_wiersz1): + +def dodaj_szafke(numerSzafki, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_wiersz, poczatek_kolumna): wymiary_szafki = Wymiary(0, 0, 0) - szafka = Szafka(numerSzafki,wymiary_szafki, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_kolumna, poczatek_wiersz1, Krata) + szafka = Szafka(numerSzafki, wymiary_szafki, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_wiersz, + poczatek_kolumna, Krata) Pomieszczenie.dodajSzafke(szafka) + +def losowy_cel(): + kierunek = Kierunek(random.randint(0, 3)) + wiersz = random.randint(-1, Krata.liczbaPolPionowo - 1) + kolumna = random.randint(-1, Krata.liczbaPolPoziomo - 1) + Krata.krata[wiersz][kolumna] = ZawartoscPola.CEL + return Stan(kierunek, PoleKraty(Krata, wiersz, kolumna)) + + def main(): - dodaj_szafke("A", 2, 7, "P", 0, 0) - dodaj_szafke("B", 2, 7, "L", 0, 3) - dodaj_szafke("C", 2, 7, "P", 0, 4) - dodaj_szafke("D", 2, 7, "L", 0, 7) - dodaj_szafke("E", 2, 7, "P", 0, 8) - dodaj_szafke("F", 2, 7, "L", 0, 11) - dodaj_szafke("G", 2, 7, "P", 0, 12) - dodaj_szafke("H", 2, 7, "L", 0, 15) - dodaj_szafke("I", 2, 7, "P", 0, 16) - dodaj_szafke("J", 2, 7, "L", 0, 19) + dodaj_szafke("A", 2, 12, "P", 2, 2) + dodaj_szafke("B", 2, 12, "L", 2, 3) + dodaj_szafke("C", 2, 5, "P", 1, 6) + dodaj_szafke("D", 2, 6, "L", 1, 7) + dodaj_szafke("C", 2, 4, "P", 9, 6) + dodaj_szafke("D", 2, 3, "L", 10, 7) + dodaj_szafke("E", 2, 8, "P", 3, 11) + dodaj_szafke("F", 2, 10, "L", 2, 13) + dodaj_szafke("H", 2, 12, "L", 1, 18) + dodaj_szafke("I", 2, 7, "P", 5, 23) + dodaj_szafke("J", 2, 12, "L", 1, 25) + dodaj_szafke("G", 2, 10, "P", 5, 29) + dodaj_agenta() - # cel to pole kraty gdzie ma stać agent, aby położyć paczkę na półkę, w obiekcie klasy Miejsce jest to artybut dostęp - cel = PoleKraty(Krata, 1, 14) - # start to pole startowe agenta, == pole_lewe_gorne - start = PoleKraty(Krata, LICZBA_POL_W_PIONIE-BOK_AGENTA1_W_POLACH, int(LICZBA_POL_W_POZIOMIE/2)) - bfsList = bfs(Krata, start, cel) + + # Krata.wyswietlKrate() klatkaz = pygame.time.Clock() warunek_dzialania = True @@ -53,7 +66,15 @@ def main(): if event.type == pygame.QUIT: warunek_dzialania = False break - Krata.wyswietlKrate() + + # cel to Stan (pole kraty gdzie ma stać agent, aby położyć paczkę na półkę, w obiekcie klasy Miejsce jest to artybut dostęp + kierunek <-na razie niepotrzebny) + if Krata.agent.cel is None: + Krata.agent.cel = losowy_cel() + Krata.krata[Krata.agent.cel.poleStartoweGorne.wiersz][ + Krata.agent.cel.poleStartoweGorne.kolumna] = ZawartoscPola.CEL + print("CEL:", Krata.agent.cel.poleStartoweGorne.wiersz, Krata.agent.cel.poleStartoweGorne.kolumna) + Krata.agent.idzDoCelu(klatkaz) + pygame.quit() diff --git a/miejsce.py b/miejsce.py index 33ff9da..85c714c 100644 --- a/miejsce.py +++ b/miejsce.py @@ -1,10 +1,8 @@ class Miejsce: def __init__(self, name, polka, miejsceNaPolce): self.numer = name - #self.rozmiar = rozmiar - self.polka=polka - self.miejsceNaPolce=miejsceNaPolce + # self.rozmiar = rozmiar + self.polka = polka + self.miejsceNaPolce = miejsceNaPolce self.status = 'wolne' - self.numerUmieszczonejPaczki='' - - + self.numerUmieszczonejPaczki = '' diff --git a/ramy_czyli_wiedza_agenta.py b/ramy_czyli_wiedza_agenta.py index 337c1ae..b1cba67 100644 --- a/ramy_czyli_wiedza_agenta.py +++ b/ramy_czyli_wiedza_agenta.py @@ -1,5 +1,3 @@ -from enumy_i_slowniki import * -from stale import * from krata import * @@ -44,14 +42,14 @@ class WarunkiPowietrza: self.wilgotnosc = wilgotnosc -class Miejsce: #wcześniej półka +class Miejsce: # wcześniej półka def __init__(self, numer, wymiary: Wymiary, udzwig, wysokoscOdPodlogi): - self.numer=numer + self.numer = numer self.wymiary = wymiary self.udzwig = udzwig self.wysokoscOdPodlogi = wysokoscOdPodlogi - #self.status = 'wolne' - self.dostep=[] + # self.status = 'wolne' + self.dostep = [] self.zajmowanePola = [] def dodajPole(self, pole: PoleKraty): @@ -62,15 +60,17 @@ class Miejsce: #wcześniej półka class Szafka: - def __init__(self, numerSzafki, wymiary: Wymiary, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_kolumna, poczatek_wiersz1, Krata: Krata): - self.numerSzafki=numerSzafki + def __init__(self, numerSzafki, wymiary: Wymiary, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_kolumna, + poczatek_wiersz1, Krata: Krata): + self.numerSzafki = numerSzafki self.wymiary = wymiary self.iloscPolek = iloscPolek self.iloscMiejscNaPolce = iloscMiejscNaPolce - self.dostepZeStrony=dostepZeStrony + self.dostepZeStrony = dostepZeStrony self.Miejsca = [] self.zajmowanePola = [] - self.utworzPustaSzafke(numerSzafki,iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_kolumna, poczatek_wiersz1,Krata) + self.utworzPustaSzafke(numerSzafki, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_kolumna, + poczatek_wiersz1, Krata) def dodajMiejsce(self, miejsce: Miejsce): self.Miejsca.append(miejsce) @@ -78,28 +78,32 @@ class Szafka: def dodajPole(self, pole: PoleKraty): self.zajmowanePola.append(pole) - def utworzPustaSzafke(self, numerSzafki, iloscPolek, iloscMiejscNaPolce, dostępZeStrony, poczatek_wiersz1, poczatek_kolumna, Krata: Krata): + def utworzPustaSzafke(self, numerSzafki, iloscPolek, iloscMiejscNaPolce, dostepZeStrony, poczatek_wiersz1, + poczatek_kolumna, Krata: Krata): for i in range(iloscPolek): for j in range(iloscMiejscNaPolce): wymiar_miejsca = Wymiary(0, 0, 0) numerMiejsca = self.numerSzafki + "/" + str(i) + "/" + str(j) - miejsce = Miejsce(numerMiejsca,wymiar_miejsca, 0, 0) - #wypełnianie pól "zajmowane miejsca" i "dostęp" + miejsce = Miejsce(numerMiejsca, wymiar_miejsca, 0, 0) + # wypełnianie pól "zajmowane miejsca" i "dostęp" for m in range(DUZA_SZAFA): # wiersz poczatek_wiersz = poczatek_wiersz1 + j * DUZA_SZAFA + m for n in range(DUZA_SZAFA): # kolumna Krata.krata[poczatek_wiersz][poczatek_kolumna + n] = ZawartoscPola.SCIANA - pole = PoleKraty(Krata, poczatek_wiersz, poczatek_kolumna+n) + pole = PoleKraty(Krata, poczatek_wiersz, poczatek_kolumna + n) miejsce.dodajPole(pole) self.dodajPole(pole) - if dostępZeStrony=="L": - pole_dostepu = PoleKraty(Krata, poczatek_wiersz, poczatek_kolumna + n - BOK_AGENTA1_W_POLACH) #dostęp z lewej strony + if dostepZeStrony == "L": + pole_dostepu = PoleKraty(Krata, poczatek_wiersz, + poczatek_kolumna + n - BOK_AGENTA1_W_POLACH) # dostęp z lewej strony miejsce.dodajDostep(pole_dostepu) - elif dostępZeStrony == "P": - pole_dostepu = PoleKraty(Krata, poczatek_wiersz, poczatek_kolumna + n + BOK_AGENTA1_W_POLACH) # dostęp z prawej strony strony + elif dostepZeStrony == "P": + pole_dostepu = PoleKraty(Krata, poczatek_wiersz, + poczatek_kolumna + n + BOK_AGENTA1_W_POLACH) # dostęp z prawej strony strony miejsce.dodajDostep(pole_dostepu) self.dodajMiejsce(miejsce) + class Pomieszczenie: def __init__(self, warunkiPowietrza: WarunkiPowietrza, wysokoscSufitu): self.warunkiPowietrza = warunkiPowietrza @@ -113,26 +117,30 @@ class Pomieszczenie: def dodajPole(self, pole: PoleMapy): self.zajmowanePola.append(pole) + class Etykieta: - def __init__(self, nazwaTowaru, nazwaNadawcy, dataZapakowania, id, niePietrowac, zachowacSuchosc, ostroznie, uwagaSzklo): + def __init__(self, nazwaTowaru, nazwaNadawcy, dataZapakowania, iD, niePietrowac, zachowacSuchosc, ostroznie, + uwagaSzklo): # realistyczne? informacje na paczce # kategoryzowanie towaru może odbywać się na podstawie jego nazwy self.nazwaTowaru = nazwaTowaru self.nazwaNadawcy = nazwaNadawcy self.dataZapakowania = dataZapakowania - self.id = id + self.id = iD # nalepki na paczce - być może nie będą na etykiecie, a trzeba je będzie rozpoznać na obrazie self.niePietrowac = niePietrowac self.zachowacSuchosc = zachowacSuchosc self.ostroznie = ostroznie self.uwagaSzklo = uwagaSzklo + class Paczka: - def __init__(self,wymiary: Wymiary, waga, etykieta: Etykieta): + def __init__(self, wymiary: Wymiary, waga, etykieta: Etykieta): self.wymiary = wymiary self.waga = waga self.etykieta = etykieta + class Paleta: def __init__(self): self.Paczki = [] @@ -140,19 +148,21 @@ class Paleta: def dodajPaczke(self, paczka: Paczka): self.Paczki.append(paczka) + class Nadawca: - def __init__(self,nazwa, id): + def __init__(self, nazwa, iD): self.nazwa = nazwa - self.id = id + self.id = iD # plus dodatkowe informacje mogące wpływać na priorytet rozpakowania transportu / miejsce składowania paczek? + class Transport: - def __init__(self, dataPrzyjecia, nadawca: Nadawca, id): + def __init__(self, dataPrzyjecia, nadawca: Nadawca, iD): Palety = [] self.dataPrzyjecia = dataPrzyjecia self.nadawca = nadawca - self.id = id + self.id = iD # wyliczanie priorytetu rozpakowania transportu ? # def okrescPriorytet(self): - # self.priorytet = \ No newline at end of file + # self.priorytet = diff --git a/stale.py b/stale.py index 1a1b041..a498563 100644 --- a/stale.py +++ b/stale.py @@ -3,8 +3,8 @@ FPS = 5 # SZEROKOSC_OKNA = 1500 # WYSOKOSC_OKNA = 750 # -LICZBA_POL_W_POZIOMIE = 20 -LICZBA_POL_W_PIONIE = 12 +LICZBA_POL_W_POZIOMIE = 30 +LICZBA_POL_W_PIONIE = 15 BOK_POLA = 45 ODSTEP_MIEDZY_POLAMI = 1 SZEROKOSC_OKNA = LICZBA_POL_W_POZIOMIE * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) + ODSTEP_MIEDZY_POLAMI @@ -13,7 +13,7 @@ WYSOKOSC_OKNA = LICZBA_POL_W_PIONIE * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) + ODSTEP BOK_AGENTA1_W_POLACH = 1 BOK_AGENTA1 = BOK_AGENTA1_W_POLACH * (BOK_POLA + ODSTEP_MIEDZY_POLAMI) - ODSTEP_MIEDZY_POLAMI # -DUZA_SZAFA=1 +DUZA_SZAFA = 1 # BIALY = (255, 255, 255) JASNOSZARY1 = (200, 200, 200) diff --git a/szafka2.py b/szafka2.py index 7a2fe81..a3950fc 100644 --- a/szafka2.py +++ b/szafka2.py @@ -1,37 +1,35 @@ import miejsce + class Szafka: def __init__(self, numerSzafki, rozmiar, iloscPolek, iloscMiejscNaPolce): self.numer = numerSzafki # np. A - self.rozmiarMiejsc=rozmiar - #średni, duży, mały - #self.iloscWolnychMiejsc = iloscPolek*iloscMiejscNaPolce - self.iloscPolek=iloscPolek - self.iloscMiejscNaPolce=iloscMiejscNaPolce - self.listaMiejsc=[] - self.listaWolnychMiejsc=[] + self.rozmiarMiejsc = rozmiar + # średni, duży, mały + # self.iloscWolnychMiejsc = iloscPolek*iloscMiejscNaPolce + self.iloscPolek = iloscPolek + self.iloscMiejscNaPolce = iloscMiejscNaPolce + self.listaMiejsc = [] + self.listaWolnychMiejsc = [] self.stworzMiejsca() def stworzMiejsca(self): - j=0 #półka - k=0 - while jself.iloscMiejscNaPolce-1: - j=j+1 - k=0 - - self.listaWolnychMiejsc = self.listaMiejsc.copy() + k = k + 1 + if k > self.iloscMiejscNaPolce - 1: + j = j + 1 + k = 0 + self.listaWolnychMiejsc = self.listaMiejsc.copy() def polozPaczke(self, numerPaczki): - if len(self.listaWolnychMiejsc)!=0: - self.listaWolnychMiejsc[0].numerUmieszczonejPaczki=numerPaczki - self.listaWolnychMiejsc[0].status="zajęte" + if len(self.listaWolnychMiejsc) != 0: + self.listaWolnychMiejsc[0].numerUmieszczonejPaczki = numerPaczki + self.listaWolnychMiejsc[0].status = "zajęte" self.listaWolnychMiejsc.pop(0) - -