import pygame import modele import numpy as np import random import os import shutil import astar import uczenie_kacper as kacper import uczenie_adamO as adamO import uczenie_adamB as adamB smieci_path = '' smieci_w_kontenerach = "resources/smieci w kontenerach" # PODAJ OSOBE PRZED URUCHOMIENIEM (kacper/adamB/adamO) osoba = 'adamB' rfc = None if osoba == 'kacper': smieci_path = 'resources/smieci' elif osoba == 'adamB': smieci_path = 'resources/smieci' else: smieci_path = 'resources/smieci_stare' rfc = adamO.rozpocznijUczenie() pygame.init() # 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) # wysokosc i szerokosc kazdej kratki WIDTH = 60 HEIGHT = 60 # margines pomiedzy kratkami MARGIN = 5 # rozmiar kratki ILOSC_WIERSZY = 15 ILOSC_KOLUMN = 15 # rozmiar okna WINDOW_SIZE = [1300, 980] def game(): obiekty = utworzObiekty() nieodwiedzone_domy = obiekty["wspolrzedne_domow"] nieodwiedzone_kontenery = [(obiekty["kontener_szklo"].x, obiekty["kontener_szklo"].y), (obiekty["kontener_papier"].x, obiekty["kontener_papier"].y), (obiekty["kontener_metal"].x, obiekty["kontener_metal"].y), (obiekty["kontener_plastik"].x, obiekty["kontener_plastik"].y), ] # Petla az uzytkownik zamknie program done = False clock = pygame.time.Clock() # -------- Glowna petla programu ----------- while not done: # obsluga zdarzen typu nacisniecie klawisza lub przycisku myszy for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.MOUSEBUTTONDOWN: # Zapisywanie pozycji myszki po kliknieciu pozycja_myszki = pygame.mouse.get_pos() # Zamiana pozycji na konkretne koordy kolumna = pozycja_myszki[0] // (WIDTH + MARGIN) wiersz = pozycja_myszki[1] // (HEIGHT + MARGIN) print("Click ", pozycja_myszki, "Grid coordinates: ", wiersz, kolumna) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: obiekty["smieciarka"].w_lewo() if event.key == pygame.K_RIGHT: # kacper.trainModel() obiekty["smieciarka"].w_prawo() if event.key == pygame.K_UP: obiekty["smieciarka"].w_gore() if event.key == pygame.K_DOWN: obiekty["smieciarka"].w_dol() rysowaniePlanszy(obiekty) while nieodwiedzone_domy: nieodwiedzone_domy.sort( key=lambda x: astar.heurystyka((obiekty["smieciarka"].x, obiekty["smieciarka"].y), x)) cel = nieodwiedzone_domy.pop(0) obiekty["smieciarka"].astar_move( obiekty, (obiekty["smieciarka"].x, obiekty["smieciarka"].y), cel) pozX = cel[0] pozY = cel[1] for dom in obiekty["domy"]: if dom.x == pozX and dom.y == pozY: while dom.smieci: smiec = dom.smieci.pop(0) rodzaj = "" if osoba == 'kacper': rodzaj = kacper.przewidz(smiec) elif osoba == 'adamB': rodzaj = adamB.predict(smiec) else: rodzaj = adamO.przewidz(smiec, rfc) if rodzaj == "paper": obiekty["smieciarka"].dodajPapier(smiec) elif rodzaj == "glass": obiekty["smieciarka"].dodajSzklo(smiec) elif rodzaj == "metal": obiekty["smieciarka"].dodajMetal(smiec) elif rodzaj == "plastic": obiekty["smieciarka"].dodajPlastik(smiec) while nieodwiedzone_kontenery: nieodwiedzone_kontenery.sort( key=lambda x: astar.heurystyka((obiekty["smieciarka"].x, obiekty["smieciarka"].y), x)) cel = nieodwiedzone_kontenery.pop(0) obiekty["smieciarka"].astar_move( obiekty, (obiekty["smieciarka"].x, obiekty["smieciarka"].y), cel) pozX = cel[0] pozY = cel[1] if obiekty["plansza"][pozX, pozY].obiekt == obiekty["kontener_papier"]: while obiekty["smieciarka"].papier: smiec = obiekty["smieciarka"].papier.pop(0) obiekty["kontener_papier"].dodajSmiec(smiec) elif obiekty["plansza"][pozX, pozY].obiekt == obiekty["kontener_szklo"]: while obiekty["smieciarka"].szklo: smiec = obiekty["smieciarka"].szklo.pop(0) obiekty["kontener_szklo"].dodajSmiec(smiec) elif obiekty["plansza"][pozX, pozY].obiekt == obiekty["kontener_metal"]: while obiekty["smieciarka"].metal: smiec = obiekty["smieciarka"].metal.pop(0) obiekty["kontener_metal"].dodajSmiec(smiec) elif obiekty["plansza"][pozX, pozY].obiekt == obiekty["kontener_plastik"]: while obiekty["smieciarka"].plastik: smiec = obiekty["smieciarka"].plastik.pop(0) obiekty["kontener_plastik"].dodajSmiec(smiec) clock.tick(7) pygame.quit() return rfc def rysowaniePlanszy(obiekty): obiekty["obraz"].fill(BLACK) # rysowanie planszy for i in range(ILOSC_WIERSZY): for j in range(ILOSC_KOLUMN): pygame.draw.rect(obiekty["obraz"], obiekty["plansza"][i, j].kolor, [(MARGIN + WIDTH) * obiekty["plansza"][i, j].pozY + MARGIN, (MARGIN + HEIGHT) * obiekty["plansza"][i, j].pozX + MARGIN, 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() def utworzObiekty(): # Tworzenie planszy i kratek plansza = np.array([[modele.Kratka(i, j) for i in range(ILOSC_KOLUMN)] for j in range(ILOSC_WIERSZY)]) all_sprites_list = pygame.sprite.Group() # smieciarka 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) obraz = pygame.display.set_mode(WINDOW_SIZE) smieciarka.setObraz(obraz) pygame.display.set_caption("Inteligentna śmieciarka") # kontenery if not os.path.exists(smieci_w_kontenerach): os.makedirs(smieci_w_kontenerach) else: for dir in os.listdir(os.getcwd() + "/" + smieci_w_kontenerach): files = os.listdir(os.getcwd() + "/" + smieci_w_kontenerach + "/" + dir) for file in files: os.remove(os.getcwd() + "/" + smieci_w_kontenerach + "/" + dir + "/" + file) kontener_szklo = modele.Kontener(4, 4, "glass") kontener_szklo.setImage(pygame.image.load( "resources/plansza/pojemnik_szklo.png")) plansza[4, 4].setJestKontenerem(True) plansza[4, 4].setObiekt(kontener_szklo) 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_papier = modele.Kontener(4, 0, "paper") kontener_papier.setImage(pygame.image.load( "resources/plansza/pojemnik_papier.png")) plansza[4, 0].setJestKontenerem(True) plansza[4, 0].setObiekt(kontener_papier) kontener_plastik = modele.Kontener(0, 0, "plastic") kontener_plastik.setImage(pygame.image.load( "resources/plansza/pojemnik_plastik.png")) plansza[0, 0].setJestKontenerem(True) plansza[0, 0].setObiekt(kontener_plastik) # 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(smieci_path) 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) # 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_papier, kontener_szklo, smieciarka) obiekty = { "plansza": plansza, "smieciarka": smieciarka, "obraz": obraz, "kontener_plastik": kontener_plastik, "kontener_szklo": kontener_szklo, "kontener_metal": kontener_metal, "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 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