diff --git a/Ikony/bieg.png b/Ikony/bieg.png new file mode 100644 index 0000000..1124496 Binary files /dev/null and b/Ikony/bieg.png differ diff --git a/Ikony/osoba2.png b/Ikony/osoba2.png new file mode 100644 index 0000000..461e5f1 Binary files /dev/null and b/Ikony/osoba2.png differ diff --git a/dataset.csv b/dataset.csv new file mode 100644 index 0000000..6108118 --- /dev/null +++ b/dataset.csv @@ -0,0 +1,39 @@ +plec;wiek;czas_w_pom;temp_w_pom;poziom_kurzu;poziom_oswietlenia;niebezp_towary;decyzja +2;1;3;0;2;1;0;1 +2;1;3;0;1;1;1;1 +2;1;3;0;1;1;0;0 +2;1;3;0;1;2;0;0 +1;1;3;0;1;1;0;1 +2;1;2;0;2;1;1;1 +2;1;2;0;2;2;1;1 +2;1;2;0;1;1;1;0 +2;1;2;0;1;2;1;0 +1;1;2;0;1;1;1;1 +1;1;2;0;2;1;0;0 +2;1;3;1;2;1;1;1 +2;1;3;1;2;2;1;1 +2;1;3;1;1;1;1;0 +1;1;3;1;1;1;1;1 +1;1;3;1;1;2;1;1 +1;1;3;1;2;1;0;0 +2;1;2;1;2;1;1;0 +1;1;2;1;2;1;1;0 +2;2;3;0;2;1;0;1 +2;2;3;0;2;2;1;1 +2;2;3;0;2;2;0;0 +2;2;3;0;1;2;0;0 +1;2;3;0;2;2;0;1 +2;2;2;0;2;1;1;1 +2;2;2;0;1;1;1;1 +2;2;2;0;2;2;1;0 +2;2;2;0;1;2;1;0 +1;2;2;0;2;2;1;1 +1;2;2;0;2;1;0;0 +2;2;3;1;2;1;1;1 +2;2;3;1;1;1;1;1 +2;2;3;1;2;2;1;0 +1;2;3;1;2;2;1;1 +1;2;3;1;1;2;1;1 +1;2;3;1;2;1;0;0 +2;2;2;1;2;1;1;0 +1;2;2;1;2;1;1;0 diff --git a/enumy_i_slowniki.py b/enumy_i_slowniki.py index 2f23977..cf1b5fa 100644 --- a/enumy_i_slowniki.py +++ b/enumy_i_slowniki.py @@ -36,6 +36,8 @@ class ZawartoscPola(Enum): CEL = 2 DYWAN = 3 KALUZA = 4 + SCIANA2=5 + OSOBA=6 ZawartoscPolaNaKolorPola = { @@ -43,7 +45,9 @@ ZawartoscPolaNaKolorPola = { ZawartoscPola.SCIANA: CIEMNY_BRAZOWY1, ZawartoscPola.CEL: ZIELONY1, ZawartoscPola.DYWAN: ZOLTY1, - ZawartoscPola.KALUZA: NIEBIESKI1 + ZawartoscPola.KALUZA: NIEBIESKI1, + ZawartoscPola.SCIANA2: SZARY1, + ZawartoscPola.OSOBA: IKONA } ZawartoscPolaNaKosztObrotu = { @@ -51,7 +55,9 @@ ZawartoscPolaNaKosztObrotu = { ZawartoscPola.SCIANA: None, ZawartoscPola.CEL: 1, ZawartoscPola.DYWAN: 5, - ZawartoscPola.KALUZA: 3 + ZawartoscPola.KALUZA: 3, + ZawartoscPola.SCIANA2: None, + ZawartoscPola.OSOBA: None } ZawartoscPolaNaKosztWjechania = { @@ -59,5 +65,7 @@ ZawartoscPolaNaKosztWjechania = { ZawartoscPola.SCIANA: None, ZawartoscPola.CEL: 2, ZawartoscPola.DYWAN: 5, - ZawartoscPola.KALUZA: 35 + ZawartoscPola.KALUZA: 35, + ZawartoscPola.SCIANA2: None, + ZawartoscPola.OSOBA: None } diff --git a/krata.py b/krata.py index 462e840..0e7fdcb 100644 --- a/krata.py +++ b/krata.py @@ -71,7 +71,12 @@ class Krata(Obserwowany): start = (self.odstepMiedzyPolami + self.bokPola) * kolumna + self.odstepMiedzyPolami gora = (self.odstepMiedzyPolami + self.bokPola) * wiersz + self.odstepMiedzyPolami kolor_pola = ZawartoscPolaNaKolorPola[self.krata[wiersz][kolumna]] - pygame.draw.rect(self.okno, kolor_pola, [start, gora, self.bokPola, self.bokPola]) + if kolor_pola != IKONA: + pygame.draw.rect(self.okno, kolor_pola, [start, gora, self.bokPola, self.bokPola]) + else: + osoba_ikona = pygame.transform.scale(pygame.image.load(os.path.join('Ikony', 'osoba2.png')), + (BOK_AGENTA1, BOK_AGENTA1)) + self.okno.blit(osoba_ikona, [start, gora, self.bokPola, self.bokPola]) def narysujKrateAlternatywnie(self): self.okno.fill(SZARY1) diff --git a/main.py b/main.py index d3df40d..e509a23 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,13 @@ +import ctypes import os +import threading import pygame.transform from agent import * from okno import * from ramy_czyli_wiedza_agenta import * +from rescue import * # aby działalo w oknie + rozdzielczość ekranu # ctypes.windll.shcore.SetProcessDpiAwareness(1) @@ -54,6 +57,16 @@ def nadaj_cel_agentowi(agent: Agent): zaznacz_cel_na_mapie(agent.cel) print("CEL:", agent.cel.poleStartoweGorne.wiersz, agent.cel.poleStartoweGorne.kolumna) +def zdarzenie_osoba(): + global flaga1 + flaga1=1 + +def losowa_osoba(): + wiersz = random.randint(0, krata_magazynu.liczbaPolPionowo - 1) + kolumna = random.randint(0, krata_magazynu.liczbaPolPoziomo - 1) + osoba = PoleKraty(krata_magazynu, wiersz, kolumna) + return osoba + def main(): # dla kraty 30 x 15 @@ -91,17 +104,48 @@ def main(): (5, 9), (7, 9), (7, 10)): krata_magazynu.krata[i[0]][i[1]] = ZawartoscPola.KALUZA - dodaj_agenta() + for i in range(LICZBA_POL_W_PIONIE): + krata_magazynu.krata[i][21] = ZawartoscPola.SCIANA2 + krata_magazynu.krata[0][21]=ZawartoscPola.PUSTE + krata_magazynu.krata[7][21] = ZawartoscPola.PUSTE + krata_magazynu.krata[14][21] = ZawartoscPola.PUSTE + dodaj_agenta() okno1 = Okno(krata_magazynu, krata_magazynu.agent) okno1.wyswietlOkno() + t = threading.Timer(5.0, zdarzenie_osoba).start() + osoba = PoleKraty(krata_magazynu, 0, 0) + clf=drzewo_decyzyjne() + global flaga1 + flaga1 = 0 + while True: # 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_magazynu.agent.cel is None: nadaj_cel_agentowi(krata_magazynu.agent) krata_magazynu.agent.idzDoCelu() + if flaga1 == 1: + osoba.krata.krata[osoba.wiersz][osoba.kolumna] = ZawartoscPola.PUSTE + okno1.wyswietlOkno() + osoba = losowa_osoba() + while osoba.krata.krata[osoba.wiersz][osoba.kolumna] != ZawartoscPola.PUSTE: + osoba = losowa_osoba() + osoba.krata.krata[osoba.wiersz][osoba.kolumna] = ZawartoscPola.OSOBA + okno1.wyswietlOkno() + pygame.time.wait(1000) + answer = decyzja_osoba(osoba, clf) + if answer == 1: + osoba.krata.krata[osoba.wiersz][osoba.kolumna] = ZawartoscPola.PUSTE + okno1.wyswietlOkno() + bieg = pygame.transform.scale(pygame.image.load(os.path.join('Ikony', 'bieg.png')), + (BOK_AGENTA1, BOK_AGENTA1)) + okno_pygame.blit(bieg, (osoba.kolumna * (BOK_POLA + 1) + 1, osoba.wiersz * (BOK_POLA + 1) + 1)) + pygame.display.flip() + pygame.time.wait(1500) + flaga1 = 0 + t = threading.Timer(5.0, zdarzenie_osoba).start() try: main() diff --git a/rescue.py b/rescue.py new file mode 100644 index 0000000..69fab77 --- /dev/null +++ b/rescue.py @@ -0,0 +1,41 @@ +import random +import pandas as pd +from sklearn.tree import DecisionTreeClassifier +from sklearn.model_selection import train_test_split +from sklearn import metrics + +from krata import * + +def drzewo_decyzyjne(): + columns = ['plec', 'wiek', 'czas_w_pom', 'temp_w_pom', 'poziom_kurzu', 'poziom_oswietlenia', 'niebezp_towary', 'decyzja'] + df = pd.read_csv("dataset.csv", header=0, sep=";", names=columns) + x = df[['plec', 'wiek', 'czas_w_pom', 'temp_w_pom', 'poziom_kurzu', 'poziom_oswietlenia', 'niebezp_towary']] + y = df.decyzja + #df.info() + #X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) + clf = DecisionTreeClassifier() + clf = clf.fit(x, y) + # print("Dokładność: ", metrics.accuracy_score(y_test, y_pred)) + return clf + +def decyzja_osoba(osoba: PoleKraty, clf: DecisionTreeClassifier): + z=[] + z.extend(random.choices([1,2], weights=[1,2], k=1)) #1 kobieta, 2 mężczyzna + z.extend(random.choices([1, 2], weights=[4,1], k=1)) # 1 dorosły, 2 osoba starsza + z.extend(random.choices([1, 2, 3], weights=[2, 5, 3], k=1)) # jak długo przebywa w pomieszczeniu, 3 to nadłużej + if osoba.kolumna > 21: + z.append(0) # zimne pomieszczenie + else: + z.append(1) # normalne pomieszczenie + z.extend(random.choices([1, 2], weights=[7, 3], k=1)) # poziom kurzu, 2 to największy/najbardziej niebezpieczny + z.extend(random.choices([1, 2], weights=[4, 6], k=1)) # poziom oświetlenia, 2 to najlepsze oświetlenie + if (0<=osoba.wiersz or osoba.wiersz<=13) and (17<=osoba.kolumna or osoba.kolumna<=19): #obok szafki z niebezpiecznymi towarami + z.append(1) + else: + z.append(0) + columns = ['plec', 'wiek', 'czas_w_pom', 'temp_w_pom', 'poziom_kurzu', 'poziom_oswietlenia', 'niebezp_towary'] + z1 = pd.DataFrame([z],columns=columns) + z_pred = clf.predict(z1) + #print(z) + #print(z_pred) + return (z_pred) \ No newline at end of file diff --git a/stale.py b/stale.py index 845f87d..95c578e 100644 --- a/stale.py +++ b/stale.py @@ -1,3 +1,6 @@ +import os +import pygame + FPS = 20 # # SZEROKOSC_OKNA = 1500 @@ -23,6 +26,8 @@ CZARNY = (0, 0, 0) CIEMNY_BRAZOWY1 = (60, 19, 33) ZOLTY1 = (231, 213, 69) NIEBIESKI1 = (65, 125, 225) +IKONA=pygame.transform.scale(pygame.image.load(os.path.join('Ikony', 'osoba2.png')), + (BOK_AGENTA1, BOK_AGENTA1)) ### ### diff --git a/stan_nastepnik.py b/stan_nastepnik.py index 24e9616..8ab3308 100644 --- a/stan_nastepnik.py +++ b/stan_nastepnik.py @@ -70,7 +70,7 @@ def pole_w_granicach_kraty(pole: PoleKraty): def mozna_wjechac_na_pole(pole: PoleKraty): - if pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.SCIANA: + if pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.SCIANA and pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.SCIANA2 and pole.krata.krata[pole.wiersz][pole.kolumna] != ZawartoscPola.OSOBA: return True else: return False