import pygame import game import random import os import shutil import astar # wysokosc i szerokosc kazdej kratki WIDTH = 60 HEIGHT = 60 # margines pomiedzy kratkami MARGIN = 5 # kolory BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) BLUE = (40, 50, 200) GREY = (128, 128, 128) class Smieciarka(pygame.sprite.Sprite): def __init__(self, x, y): self.x = x self.y = y 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) self.rect = pygame.Rect(self.x * WIDTH + MARGIN * self.x + MARGIN, self.y * HEIGHT + MARGIN * self.y, WIDTH, HEIGHT) def setObraz(self, obraz): self.obraz = obraz def rand_move(self): rand_int = random.randint(0, 3) if rand_int == 0: self.w_lewo() elif rand_int == 1: self.w_prawo() elif rand_int == 2: self.w_gore() elif rand_int == 3: self.w_dol() def astar_move(self, obiekty, start, cel): sciezka = astar.astar(obiekty, start, (cel[0], cel[1])) print(sciezka) if sciezka: for koord in sciezka: if koord[0] == self.x - 1 and koord[1] == self.y: self.w_lewo() elif koord[0] == self.x + 1 and koord[1] == self.y: self.w_prawo() elif koord[0] == self.x and koord[1] + 1 == self.y: self.w_gore() elif koord[0] == self.x and koord[1] - 1 == self.y: self.w_dol() def w_lewo(self): if self.x > 0: 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 def w_prawo(self): if self.x < 14: 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 def w_gore(self): if self.y > 0: 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: 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 dodajPlastik(self, smiec): self.plastik.append(smiec) def dodajSzklo(self, smiec): self.szklo.append(smiec) def dodajPapier(self, smiec): self.papier.append(smiec) def dodajMetal(self, smiec): self.metal.append(smiec) def zwiekszIloscOdwiedzonychDomow(self): self.odwiedzone_domy += 1 def getOdwiedzoneDomy(self): return self.odwiedzone_domy def setPlansza(self, plansza): self.plansza = plansza def setObiekty(self, obiekty): self.obiekty = obiekty class Dom(pygame.sprite.Sprite): def __init__(self, x, y): self.x = x self.y = y self.pozycja = (self.x, self.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 self.pozY = poz_y self.pozycja = (self.pozX, self.pozY) self.rodzic = None self.jestDomem = False self.jestKontenerem = False self.jestWysypiskiem = False self.jestPrzeszkoda = False self.kolor = GREY self.obiekt = None pygame.sprite.Sprite.__init__(self) self.image = pygame.image.__class__ self.rect = pygame.Rect(self.pozX * WIDTH + MARGIN * self.pozX + MARGIN, self.pozY * HEIGHT + MARGIN * self.pozY + MARGIN, WIDTH, HEIGHT) # Sort nodes def __lt__(self, other): return self.f < other.f def __repr__(self): return ('{0}'.format(self.pozycja)) # Compare nodes def __eq__(self, other): return True if self.pozycja == other.pozycja else False def setImage(self, image): self.image = image def setRodzic(self, rodzic): self.rodzic = rodzic 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