diff --git a/astar.py b/astar.py index 2ccdb47..bf11fb3 100644 --- a/astar.py +++ b/astar.py @@ -5,8 +5,6 @@ def heurystyka(obiekty, a, b): heur = abs((b[0] - a[0])) + abs((b[1] - a[1])) if obiekty["plansza"][b[0], b[1]].jestDomem is True: heur += 2 - if obiekty["plansza"][b[0], b[1]].jestPrzeszkoda is True: - heur += 100 return heur diff --git a/game.py b/game.py index a71cee7..e610daf 100644 --- a/game.py +++ b/game.py @@ -15,8 +15,6 @@ GREEN = (0, 255, 0) RED = (255, 0, 0) BLUE = (40, 50, 200) GREY = (128, 128, 128) -MAGENTA = (255, 0, 144) -YELLOW = (255, 255, 0) # wysokosc i szerokosc kazdej kratki WIDTH = 60 @@ -30,9 +28,14 @@ ILOSC_WIERSZY = 15 ILOSC_KOLUMN = 15 # rozmiar okna -WINDOW_SIZE = [980, 980] +WINDOW_SIZE = [1300, 980] +# TEST DODAWANIA SMIECI Z POJEDYNCZEGO DOMU DO FOLDERU KONTENERA ZE SZKLEM +# for d in lista_domow: +# for s in d.smieci: +# kontener_szklo.dodajSmiec(s) + def game(): obiekty = utworzObiekty() # Petla az uzytkownik zamknie program @@ -40,8 +43,6 @@ def game(): clock = pygame.time.Clock() temp = True - start = False - # -------- Glowna petla programu ----------- while not done: @@ -67,7 +68,8 @@ def game(): obiekty["smieciarka"].w_gore() if event.key == pygame.K_DOWN: obiekty["smieciarka"].w_dol() - # obiekty["smieciarka"].rand_move() + + rysowaniePlanszy(obiekty) while(temp): obiekty["smieciarka"].astar_move(obiekty) temp = False @@ -93,7 +95,26 @@ def rysowaniePlanszy(obiekty): WIDTH, HEIGHT]) + obiekty["obraz"].blit(pygame.image.load( + "resources/plansza/wysypisko.jpg"), (5, 5)) + obiekty["obraz"].blit(pygame.image.load( + "resources/plansza/jezioro.png"), (395, 655)) + obiekty["plansza"][6, 10].setJestPrzeszkoda(True) + obiekty["plansza"][6, 11].setJestPrzeszkoda(True) + obiekty["plansza"][7, 10].setJestPrzeszkoda(True) + obiekty["plansza"][7, 11].setJestPrzeszkoda(True) obiekty["sprajty"].draw(obiekty["obraz"]) + text_metal, text_papier, text_plastik, text_szklo, text_pozostale, text_odwiedzone_domy = liczSmieci( + obiekty["domy"], obiekty) + obiekty["obraz"].blit(obiekty["text_pozostalo"], + (1020, 240)) + obiekty["obraz"].blit(text_metal, (1020, 280)) + obiekty["obraz"].blit(text_plastik, (1020, 320)) + obiekty["obraz"].blit(text_szklo, (1020, 360)) + obiekty["obraz"].blit(text_papier, (1020, 400)) + obiekty["obraz"].blit(text_pozostale, (1020, 440)) + obiekty["obraz"].blit(text_odwiedzone_domy, (1020, 480)) + pygame.display.update() @@ -103,12 +124,9 @@ def utworzObiekty(): for j in range(ILOSC_WIERSZY)]) all_sprites_list = pygame.sprite.Group() # smieciarka - smieciarka = modele.Smieciarka(14, 14) - plansza[14, 14].setKolor(BLUE) - plansza[14, 14].setObiekt(smieciarka) - - # punkt docelowy - plansza[0, 0].setKolor(MAGENTA) + smieciarka = modele.Smieciarka(10, 10) + plansza[10, 10].setKolor(BLUE) + plansza[10, 10].setObiekt(smieciarka) # tworzenie wyswietlanego okna os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (0, 30) @@ -116,14 +134,133 @@ def utworzObiekty(): smieciarka.setObraz(obraz) pygame.display.set_caption("Inteligentna śmieciarka") - all_sprites_list.add(smieciarka) + # kontenery + if os.path.exists('resources/smieci w kontenerach'): + shutil.rmtree("resources/smieci w kontenerach") + os.makedirs('resources/smieci w kontenerach') + + kontener_plastik = modele.Kontener(0, 0, "plastik") + kontener_plastik.setImage(pygame.image.load( + "resources/plansza/pojemnik_plastik.png")) + plansza[0, 0].setJestKontenerem(True) + plansza[0, 0].setObiekt(kontener_plastik) + + kontener_metal = modele.Kontener(0, 4, "metal") + kontener_metal.setImage(pygame.image.load( + "resources/plansza/pojemnik_metal.png")) + plansza[0, 4].setJestKontenerem(True) + plansza[0, 4].setObiekt(kontener_metal) + + kontener_organiczne = modele.Kontener(2, 2, "pozostale") + kontener_organiczne.setImage(pygame.image.load( + "resources/plansza/pojemnik_organiczne.png")) + plansza[2, 2].setJestKontenerem(True) + plansza[2, 2].setObiekt(kontener_organiczne) + + kontener_papier = modele.Kontener(4, 0, "papier") + kontener_papier.setImage(pygame.image.load( + "resources/plansza/pojemnik_papier.png")) + plansza[4, 0].setJestKontenerem(True) + plansza[4, 0].setObiekt(kontener_papier) + + kontener_szklo = modele.Kontener(4, 4, "szklo") + kontener_szklo.setImage(pygame.image.load( + "resources/plansza/pojemnik_szklo.png")) + plansza[4, 4].setJestKontenerem(True) + plansza[4, 4].setObiekt(kontener_szklo) + + # domy + doms_array = ['resources/plansza/domy/dom1.png', 'resources/plansza/domy/dom2.png', + 'resources/plansza/domy/dom3.png', 'resources/plansza/domy/dom4.png', + 'resources/plansza/domy/dom5.png'] + + domy_lista = pygame.sprite.Group() + + smieci_lista = [os.path.join(path, filename) + for path, dirs, files in os.walk("resources/smieci") + for filename in files] + + # informacje o ilosci smieci w domach + font = pygame.font.SysFont("arial", 20, bold=True) + text_pozostalo = font.render("Pozostało śmieci w domach:", True, WHITE) + + wspolrzedne_domow = modele.generujWspolrzedneDomow(10) + for i in range(len(wspolrzedne_domow)): + dom = modele.Dom(wspolrzedne_domow[i][0], wspolrzedne_domow[i][1]) + dom.setImage(pygame.image.load(random.choice(doms_array))) + plansza[wspolrzedne_domow[i][0], + wspolrzedne_domow[i][1]].setJestDomem(True) + plansza[wspolrzedne_domow[i][0], + wspolrzedne_domow[i][1]].setObiekt(dom) + domy_lista.add(dom) + all_sprites_list.add(dom) + + lista_domow = domy_lista.sprites() + for d in lista_domow: + for j in range(5): + smiec = random.choice(smieci_lista) + d.dodajSmiec(smiec) + smieci_lista.remove(smiec) + + # ustawienie wysypiska, rozmiar wysypiska 5x5 + for i in range(5): + for j in range(5): + plansza[i, j].setJestWysypiskiem(True) + + all_sprites_list.add(kontener_plastik, kontener_metal, kontener_organiczne, kontener_papier, kontener_szklo, + smieciarka) obiekty = { "plansza": plansza, "smieciarka": smieciarka, "obraz": obraz, - "sprajty": all_sprites_list + "kontener_plastik": kontener_plastik, + "kontener_szklo": kontener_szklo, + "kontener_metal": kontener_metal, + "kontener_organiczne": kontener_organiczne, + "kontener_papier": kontener_papier, + "sprajty": all_sprites_list, + "domy": lista_domow, + "smieci": smieci_lista, + "font": font, + "text_pozostalo": text_pozostalo, + "wspolrzedne_domow": wspolrzedne_domow } smieciarka.setObiekty(obiekty) smieciarka.setPlansza(plansza) return obiekty + + +def liczSmieci(domy, obiekty): + ile_metalu = 0 + ile_szkla = 0 + ile_papieru = 0 + ile_plastiku = 0 + ile_pozostalych = 0 + for d in domy: + for s in d.smieci: + if "metal" in s: + ile_metalu += 1 + elif "paper" in s: + ile_papieru += 1 + elif "plastic" in s: + ile_plastiku += 1 + elif "glass" in s: + ile_szkla += 1 + elif "trash" in s: + ile_pozostalych += 1 + + text_metal = obiekty["font"].render( + "Metal: " + str(ile_metalu), True, WHITE) + text_papier = obiekty["font"].render( + "Papier: " + str(ile_papieru), True, WHITE) + text_plastik = obiekty["font"].render( + "Plastik: " + str(ile_plastiku), True, WHITE) + text_szklo = obiekty["font"].render( + "Szkło: " + str(ile_szkla), True, WHITE) + text_pozostale = obiekty["font"].render( + "Pozostałe: " + str(ile_pozostalych), True, WHITE) + text_odwiedzone_domy = obiekty["font"].render( + "Odwiedzone domy: " + str(obiekty["smieciarka"].getOdwiedzoneDomy()), True, WHITE) + + return text_metal, text_papier, text_plastik, text_szklo, text_pozostale, text_odwiedzone_domy diff --git a/modele.py b/modele.py index 4f6ab88..d5f1f59 100644 --- a/modele.py +++ b/modele.py @@ -1,10 +1,9 @@ -import astar -import shutil -import os import pygame import game import random - +import os +import shutil +import astar # wysokosc i szerokosc kazdej kratki WIDTH = 60 @@ -30,6 +29,13 @@ class Smieciarka(pygame.sprite.Sprite): self.image = pygame.image.load('resources/plansza/smieciarka.png') self.obraz = None self.ruch = 1 + self.plastik = [] + self.szklo = [] + self.papier = [] + self.metal = [] + self.pozostale = [] + self.odwiedzone_domy = 0 + self.wspolrzedne_odwiedzonych_domow = [] self.plansza = None self.obiekty = None pygame.sprite.Sprite.__init__(self) @@ -67,39 +73,58 @@ class Smieciarka(pygame.sprite.Sprite): def w_lewo(self): if self.x > 0: - if self.ruch == 2: - self.image = pygame.image.load( - 'resources/plansza/smieciarka.png') - self.ruch = 1 + if self.plansza[self.x - 1, self.y].jestPrzeszkoda is not True: + if self.plansza[self.x - 1, self.y].jestDomem is True: + if [self.x - 1, self.y] not in self.wspolrzedne_odwiedzonych_domow: + self.wspolrzedne_odwiedzonych_domow.append( + [self.x - 1, self.y]) + self.zwiekszIloscOdwiedzonychDomow() + if self.ruch == 2: + self.image = pygame.image.load( + 'resources/plansza/smieciarka.png') + self.ruch = 1 - self.plansza[self.x - 1, self.y].setKolor(BLUE) - for i in range((WIDTH + MARGIN) // 5): - self.rect.x -= 5 - self.obraz.blit(self.image, (self.rect.x, self.rect.y)) - game.rysowaniePlanszy(self.obiekty) - self.x -= 1 + self.plansza[self.x - 1, self.y].setKolor(BLUE) + for i in range((WIDTH + MARGIN) // 5): + self.rect.x -= 5 + self.obraz.blit(self.image, (self.rect.x, self.rect.y)) + game.rysowaniePlanszy(self.obiekty) + self.x -= 1 def w_prawo(self): if self.x < 14: - if self.ruch == 1: - self.image = pygame.transform.flip(self.image, True, False) - self.ruch = 2 + if self.plansza[self.x + 1, self.y].jestPrzeszkoda is not True: + if self.plansza[self.x + 1, self.y].jestDomem is True: + if [self.x + 1, self.y] not in self.wspolrzedne_odwiedzonych_domow: + self.wspolrzedne_odwiedzonych_domow.append( + [self.x + 1, self.y]) + self.zwiekszIloscOdwiedzonychDomow() + if self.ruch == 1: + self.image = pygame.transform.flip(self.image, True, False) + self.ruch = 2 - self.plansza[self.x + 1, self.y].setKolor(BLUE) - for i in range((WIDTH + MARGIN) // 5): - self.rect.x += 5 - self.obraz.blit(self.image, (self.rect.x, self.rect.y)) - game.rysowaniePlanszy(self.obiekty) - self.x += 1 + self.plansza[self.x + 1, self.y].setKolor(BLUE) + for i in range((WIDTH + MARGIN) // 5): + self.rect.x += 5 + self.obraz.blit(self.image, (self.rect.x, self.rect.y)) + game.rysowaniePlanszy(self.obiekty) + self.x += 1 def w_gore(self): if self.y > 0: - self.plansza[self.x, self.y - 1].setKolor(BLUE) - for i in range((WIDTH + MARGIN) // 5): - self.rect.y -= 5 - self.obraz.blit(self.image, (self.rect.x, self.rect.y)) - game.rysowaniePlanszy(self.obiekty) - self.y -= 1 + if self.plansza[self.x, self.y - 1].jestPrzeszkoda is not True: + if self.plansza[self.x, self.y - 1].jestDomem is True: + if [self.x, self.y - 1] not in self.wspolrzedne_odwiedzonych_domow: + self.wspolrzedne_odwiedzonych_domow.append( + [self.x, self.y - 1]) + self.zwiekszIloscOdwiedzonychDomow() + + self.plansza[self.x, self.y - 1].setKolor(BLUE) + for i in range((WIDTH + MARGIN) // 5): + self.rect.y -= 5 + self.obraz.blit(self.image, (self.rect.x, self.rect.y)) + game.rysowaniePlanszy(self.obiekty) + self.y -= 1 def w_dol(self): if self.y < 14: @@ -142,6 +167,46 @@ class Smieciarka(pygame.sprite.Sprite): self.obiekty = obiekty +class Dom(pygame.sprite.Sprite): + def __init__(self, x, y): + self.x = x + self.y = y + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.__class__ + self.rect = pygame.Rect(self.x * WIDTH + MARGIN * self.x + MARGIN, self.y * HEIGHT + MARGIN * self.y + MARGIN, + WIDTH, HEIGHT) + self.smieci = [] + + def setImage(self, image): + self.image = image + + def dodajSmiec(self, smiec): + self.smieci.append(smiec) + + def usunSmiec(self, smiec): + self.smieci.remove(smiec) + + +class Kontener(pygame.sprite.Sprite): + def __init__(self, x, y, typ): + self.x = x + self.y = y + pygame.sprite.Sprite.__init__(self) + self.image = pygame.image.__class__ + self.rect = pygame.Rect(self.x * WIDTH + MARGIN * self.x + MARGIN, self.y * HEIGHT + MARGIN * self.y + MARGIN, + WIDTH, HEIGHT) + self.smieci = [] + self.typ = typ + os.makedirs("resources/smieci w kontenerach/" + self.typ) + + def dodajSmiec(self, smiec): + self.smieci.append(smiec) + shutil.copy(smiec, "resources/smieci w kontenerach/" + self.typ) + + def setImage(self, image): + self.image = image + + class Kratka(pygame.sprite.Sprite): def __init__(self, poz_x, poz_y): self.pozX = poz_x @@ -183,5 +248,47 @@ class Kratka(pygame.sprite.Sprite): def setObiekt(self, obiekt): self.obiekt = obiekt + def setJestDomem(self, bool): + self.jestDomem = bool + + def setJestSmieciarka(self, bool): + self.jestSmieciarka = bool + + def setJestPrzeszkoda(self, bool): + self.jestPrzeszkoda = bool + + def setJestKontenerem(self, bool): + self.jestKontenerem = bool + + def setJestWysypiskiem(self, bool): + self.jestWysypiskiem = bool + def setKolor(self, kolor): self.kolor = kolor + + +def generujWspolrzedneDomow(ilosc_domow): + wspolrzedne_domow = [] + + r = len(wspolrzedne_domow) + + while r < ilosc_domow: + wspolrzedne_domu = [] + x = random.randrange(15) + if x < 5: + y = random.randrange(5, 15) + else: + y = random.randrange(15) + wspolrzedne_domu.append(x) + wspolrzedne_domu.append(y) + + if 6 <= wspolrzedne_domu[0] <= 7 and 10 <= wspolrzedne_domu[1] <= 11: + continue + + if wspolrzedne_domu[0] == 10 and wspolrzedne_domu[1] == 10: + continue + + if wspolrzedne_domu not in wspolrzedne_domow: + wspolrzedne_domow.append(wspolrzedne_domu) + r += 1 + return wspolrzedne_domow