diff --git a/__pycache__/etykieta.cpython-311.pyc b/__pycache__/etykieta.cpython-311.pyc new file mode 100644 index 0000000..ddad889 Binary files /dev/null and b/__pycache__/etykieta.cpython-311.pyc differ diff --git a/__pycache__/main.cpython-311.pyc b/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000..fc5784c Binary files /dev/null and b/__pycache__/main.cpython-311.pyc differ diff --git a/__pycache__/paczka.cpython-311.pyc b/__pycache__/paczka.cpython-311.pyc new file mode 100644 index 0000000..43bec40 Binary files /dev/null and b/__pycache__/paczka.cpython-311.pyc differ diff --git a/__pycache__/regal.cpython-311.pyc b/__pycache__/regal.cpython-311.pyc new file mode 100644 index 0000000..a1c7371 Binary files /dev/null and b/__pycache__/regal.cpython-311.pyc differ diff --git a/__pycache__/wozek.cpython-311.pyc b/__pycache__/wozek.cpython-311.pyc new file mode 100644 index 0000000..0edd47b Binary files /dev/null and b/__pycache__/wozek.cpython-311.pyc differ diff --git a/__pycache__/wyszukiwanie.cpython-311.pyc b/__pycache__/wyszukiwanie.cpython-311.pyc new file mode 100644 index 0000000..76a28e6 Binary files /dev/null and b/__pycache__/wyszukiwanie.cpython-311.pyc differ diff --git a/__pycache__/wyszukiwanie1.cpython-311.pyc b/__pycache__/wyszukiwanie1.cpython-311.pyc new file mode 100644 index 0000000..91d2d4b Binary files /dev/null and b/__pycache__/wyszukiwanie1.cpython-311.pyc differ diff --git a/ekran.py b/ekran.py new file mode 100644 index 0000000..074951f --- /dev/null +++ b/ekran.py @@ -0,0 +1,79 @@ +import pygame + +import packageList +import regal +import wozek +from packageList import * +from paczka import Paczka + +EKRAN_SZEROKOSC = 980 +EKRAN_WYSOKOSC = 980 +screen = pygame.display.set_mode((EKRAN_SZEROKOSC, EKRAN_WYSOKOSC)) +miejsce = pygame.image.load('images/miejsce_paczek.png') +pygame.display.set_caption("Inteligentny wozek") +icon = pygame.image.load('images/icon.png') +pygame.display.set_icon(icon) + +lista_paczek = packageList.zainicjuj_liste_paczek() + +def narysuj_regaly(): + regal.Regal(1, 1, 2, 2) + regal.Regal(2, 1, 2, 3) + regal.Regal(3, 1, 3, 2) + regal.Regal(4, 1, 3, 3) + + regal.Regal(5, 1, 10, 2) + regal.Regal(6, 1, 10, 3) + regal.Regal(7, 1, 11, 2) + regal.Regal(8, 1, 11, 3) + + regal.Regal(9, 1, 2, 8) + regal.Regal(10, 1, 2, 9) + regal.Regal(11, 1, 3, 8) + regal.Regal(12, 1, 3, 9) + + regal.Regal(13, 1, 10, 8) + regal.Regal(14, 1, 10, 9) + regal.Regal(15, 1, 11, 8) + regal.Regal(16, 1, 11, 9) + + +def narysuj_siatke(): + blockSize = 70 # Set the size of the grid block + WHITE = (200, 200, 200) + for x in range(0, EKRAN_SZEROKOSC, blockSize): + for y in range(0, EKRAN_WYSOKOSC, blockSize): + rect = pygame.Rect(x, y, blockSize, blockSize) + pygame.draw.rect(screen, WHITE, rect, 1) + + +def odswiez_ekran(wozek): + screen.fill((51, 51, 51)) # removes object trail + screen.blit(miejsce, (430, 400)) + narysuj_siatke() + narysuj_paczki(wozek) + narysuj_regaly() + wozek.draw() + pygame.display.flip() + + +def sprawdz_ktory_wiersz(x): + nr_wiersza = 0 + for i in range(70, EKRAN_WYSOKOSC + 70, 70): + if x < i: + return nr_wiersza + nr_wiersza = nr_wiersza + 1 + + +def sprawdz_ktora_kolumna(y): + nr_kolumny = 0 + for i in range(70, EKRAN_SZEROKOSC + 70, 70): + if y < i: + return nr_kolumny + nr_kolumny = nr_kolumny + 1 + + +def narysuj_paczki(wozek): + if wozek.ln == 0: + for paczka in lista_paczek.list: + paczka.narysuj(430, 400, screen) diff --git a/main.py b/main.py index eecb1eb..7dd28e5 100644 --- a/main.py +++ b/main.py @@ -1,107 +1,72 @@ -import sys -import pygame -import regal -from paczka import Paczka -from wozek import Wozek -from packageList import listOfPackages - -pygame.init() -screen = pygame.display.set_mode((980, 980)) -miejsce = pygame.image.load('images/miejsce_paczek.png') - -pygame.display.set_caption("Inteligentny wozek") -icon = pygame.image.load('images/icon.png') -pygame.display.set_icon(icon) - -def draw(self): - screen.blit(self.image, (self.x, self.y)) - - - -def main(): - wozek = Wozek() - packageList = listOfPackages() - demo_paczka = Paczka('duzy', 10, any, False, any, any, any, any, any) - packageList.add(demo_paczka) - - while True: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - sys.exit(0) - if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: - sys.exit(0) - - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_DOWN: - wozek.y_change = 1 - if event.key == pygame.K_UP: - wozek.y_change = -1 - if event.key == pygame.K_RIGHT: - wozek.x_change = 1 - if event.key == pygame.K_LEFT: - wozek.x_change = -1 - - if event.type == pygame.KEYUP: - if event.key == pygame.K_DOWN or event.key == pygame.K_UP: - wozek.y_change = 0 - if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT: - wozek.x_change = 0 - - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_SPACE: - if wozek.ln == 0: - wozek.load_package() - wozek.dynamic_wozek_picture() - else: - wozek.drop_package() - wozek.dynamic_wozek_picture() - - wozek.x += wozek.x_change - wozek.y += wozek.y_change - - if wozek.x <= 0: - wozek.x = 0 - elif wozek.x >= 916: - wozek.x = 916 - if wozek.y <= 0: - wozek.y = 0 - elif wozek.x >= 916: - wozek.x = 916 - - # Drawing - screen.fill((51,51,51)) # removes object trail - screen.blit(miejsce, (430, 400)) - - # idRegału, Długość regału podana w kratkach, Współrzędne od których ma być tworzony regał (wiersz,kolumna) - poziomo - # Współrzędne od (1,1) do (10,10) - regal.Regal(1, 1, 2, 2) - regal.Regal(2, 1, 2, 3) - regal.Regal(3, 1, 3, 2) - regal.Regal(4, 1, 3, 3) - - regal.Regal(5, 1, 8, 2) - regal.Regal(6, 1, 8, 3) - regal.Regal(7, 1, 9, 2) - regal.Regal(8, 1, 9, 3) - - regal.Regal(9, 1, 2, 8) - regal.Regal(10, 1, 2, 9) - regal.Regal(11, 1, 3, 8) - regal.Regal(12, 1, 3, 9) - - regal.Regal(13, 1, 8, 8) - regal.Regal(14, 1, 8, 9) - regal.Regal(15, 1, 9, 8) - regal.Regal(16, 1, 9, 9) - - draw(wozek) - if wozek.ln == 0: - for x in packageList.list: - draw(x) - #demo_paczka.narysuj(430,400,screen) - - pygame.display.flip() # updating frames - - -if __name__ == "__main__": - main() +import sys +import pygame +from wozek import Wozek +import wyszukiwanie +import ekran + +pygame.init() + + +def main(): + wozek = Wozek() + + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + sys.exit(0) + if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: + sys.exit(0) + if event.type == pygame.MOUSEBUTTONDOWN: + # lewy przycisk myszy + if event.button == 1: + x = pygame.mouse.get_pos()[0] + y = pygame.mouse.get_pos()[1] + wiersz = ekran.sprawdz_ktory_wiersz(x) + kolumna = ekran.sprawdz_ktora_kolumna(y) + docelowy_stan = wyszukiwanie.Stan(wiersz * 70, kolumna * 70, 0) + wezel = wyszukiwanie.wyszukiwanie_bfs(wozek.obecnyStan, docelowy_stan) + sciezka = wyszukiwanie.znajdz_sciezke(wezel) + wozek.przemiesc_wozek_po_sciezce(sciezka) + + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_DOWN: + wozek.y_change = 1 + if event.key == pygame.K_UP: + wozek.y_change = -1 + if event.key == pygame.K_RIGHT: + wozek.x_change = 1 + if event.key == pygame.K_LEFT: + wozek.x_change = -1 + + if event.type == pygame.KEYUP: + if event.key == pygame.K_DOWN or event.key == pygame.K_UP: + wozek.y_change = 0 + if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT: + wozek.x_change = 0 + + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_SPACE: + if wozek.ln == 0: + wozek.load_package() + wozek.dynamic_wozek_picture() + else: + wozek.drop_package() + wozek.dynamic_wozek_picture() + + wozek.obecnyStan.x += wozek.x_change + wozek.obecnyStan.y += wozek.y_change + + if wozek.obecnyStan.x <= 0: + wozek.obecnyStan.x = 0 + elif wozek.obecnyStan.x >= 916: + wozek.obecnyStan.x = 916 + if wozek.obecnyStan.y <= 0: + wozek.obecnyStan.y = 0 + elif wozek.obecnyStan.x >= 916: + wozek.obecnyStan.x = 916 + + ekran.odswiez_ekran(wozek) + + +if __name__ == "__main__": + main() diff --git a/packageList.py b/packageList.py index f422911..44915fe 100644 --- a/packageList.py +++ b/packageList.py @@ -1,8 +1,16 @@ - class listOfPackages: list = [] def add(self, item): self.list.append(item) + def remove(self): - self.list.pop() \ No newline at end of file + self.list.pop() + + +def zainicjuj_liste_paczek(): + from paczka import Paczka + packageList = listOfPackages() + demo_paczka = Paczka('duzy', 10, any, False, any, any, any, any, any) + packageList.add(demo_paczka) + return packageList diff --git a/paczka.py b/paczka.py index 41b2260..f9d4af1 100644 --- a/paczka.py +++ b/paczka.py @@ -1,5 +1,5 @@ from etykieta import Etykieta -from main import pygame +import pygame class Paczka: diff --git a/regal.py b/regal.py index 6d26ad4..2074c10 100644 --- a/regal.py +++ b/regal.py @@ -1,12 +1,12 @@ import pygame -from main import screen def obliczPixeleNaPodstawieKratek(wymiar): #Przeliczanie współrzędnych podanych w kratkach na pixele i = 1 - pixele = 100 + # pixele = 100 + pixele = 73 while (i < wymiar): - pixele = pixele + 80 + pixele = pixele + 70 i = i + 1 return pixele @@ -20,6 +20,7 @@ def obliczPixeleDlugosciRegalu(self): #Przeliczanie dlugości regału podanego class Regal: def __init__(self, numerRegalu, dlugoscRegaluWKratkach, numerWiersza, numerKolumny): + from ekran import screen self.numerRegalu = numerRegalu self.wysokoscRegalu = 64 self.dlugoscRegaluWKratkach = dlugoscRegaluWKratkach @@ -29,6 +30,9 @@ class Regal: self.kolumna = obliczPixeleNaPodstawieKratek(numerKolumny) self.dlugosc = obliczPixeleDlugosciRegalu(self) + # from main import screen + # from ekran import screen + if(self.numerRegalu >= 0 and self.numerRegalu <= 4): reg = pygame.Surface([self.dlugosc, self.wysokoscRegalu]) reg = pygame.image.load("images/regal.png") diff --git a/wozek.py b/wozek.py index 86415f1..e131ad8 100644 --- a/wozek.py +++ b/wozek.py @@ -1,10 +1,13 @@ -import pygame,math +import ekran +import pygame,math from packageList import listOfPackages + class Wozek(): def __init__(self): - self.x = 55 - self.y = 55 + self.obecnyStan = None + # self.x = 55 + # self.y = 55 self.x_change = 0 self.y_change = 0 self.height = 64 @@ -12,7 +15,10 @@ class Wozek(): self.image = pygame.image.load("images/pusty_wozek.png") # Credit: Forklift icons created by Smashicons - Flaticon # https://www.flaticon.com/free-icons/forklift + self.__zainicjuj_stan_poczatkowy() + def draw(self): + ekran.screen.blit(self.image, (self.obecnyStan.x, self.obecnyStan.y)) #storage = ["none"] * 10 storage = [] @@ -32,7 +38,7 @@ class Wozek(): return element else: print("I'm empty!") - + def dynamic_wozek_picture(self): if self.ln == 0: self.image = pygame.image.load("images/pusty_wozek.png") @@ -42,10 +48,11 @@ class Wozek(): self.image = pygame.image.load("images/pelny_wozek_2_crates.png") elif (self.ln == 10): self.image = pygame.image.load("images/pelny_wozek_full_3_crates.png") - + + def load_package(self): for package in listOfPackages.list: - dist = math.sqrt((self.x - package.x)**2 + (self.y - package.y)**2) + dist = math.sqrt((self.obecnyStan.x - package.x)**2 + (self.obecnyStan.y - package.y)**2) if dist <= 50: self.add_element(package) listOfPackages.list.pop() @@ -53,5 +60,36 @@ class Wozek(): package = self.remove_element() if package is not None: listOfPackages.list.append(package) - package.x = self.x+50 - package.y = self.y \ No newline at end of file + package.x = self.obecnyStan.x+50 + package.y = self.obecnyStan.y + + def __zainicjuj_stan_poczatkowy(self): + from wyszukiwanie import Stan + self.obecnyStan = Stan(70, 70, 1) + + def przemiesc_wozek_po_sciezce(self, sciezka): + kierunek_poprzedni = self.obecnyStan.kierunek + for wezel in sciezka: + self.obecnyStan = wezel.stan + kierunek_obecny = self.obecnyStan.kierunek + self.ustaw_wozek_w_kierunku(kierunek_obecny, kierunek_poprzedni) + kierunek_poprzedni = kierunek_obecny + ekran.odswiez_ekran(self) + pygame.time.wait(500) + + def ustaw_wozek_w_kierunku(self, kierunek_obecny, kierunek_poprzedni): + if kierunek_poprzedni < kierunek_obecny: + # obrot w lewo + if kierunek_poprzedni == 0 and kierunek_obecny == 3: + self.image = pygame.transform.rotate(self.image, 90) + # obrot w prawo + else: + self.image = pygame.transform.rotate(self.image, -90) + elif kierunek_poprzedni > kierunek_obecny: + # obrot w prawo + if kierunek_poprzedni == 3 and kierunek_obecny == 0: + self.image = pygame.transform.rotate(self.image, -90) + # obrot w lewo + else: + self.image = pygame.transform.rotate(self.image, 90) + diff --git a/wyszukiwanie.py b/wyszukiwanie.py new file mode 100644 index 0000000..367adb1 --- /dev/null +++ b/wyszukiwanie.py @@ -0,0 +1,87 @@ +class SearchSpace: + def __init__(self): + self.grid = [['1'] * 10 for _ in range(10)] # create a 10x10 grid of cells + for r, c in [(2, 2), (2, 3), (3, 2), (3, 3), (8, 2), (8, 3), (9, 2), (9, 3), + (2, 8), (2, 9), (3, 8), (3, 9), (8, 8), (8, 9), (9, 8), (9, 9)]: + self.grid[r][c] = 'X' # set the cells with a shelf to not passable + + def is_passable(self, x, y): + return 0 <= x < 10 and 0 <= y < 10 and self.grid[y][x] != 'X' + + +class Stan: + def __init__(self, x, y, kierunek): + self.x = x + self.y = y + self.kierunek = kierunek + + +class Wezel: + def __init__(self, stan, rodzic): + self.stan = stan + self.rodzic = rodzic + +def nastepnik(wezel, licznik): + # gora -> prawo -> dol -> lewo | obrot w prawo + # gora -> lewo -> dol -> prawo | obrot w lewo + # 0 gora 1 prawo 2 dol 3 lewo + x = wezel.stan.x + y = wezel.stan.y + obrot_w_prawo = Wezel(Stan(x, y, (wezel.stan.kierunek + 1) % 4), licznik) + obrot_w_lewo = Wezel(Stan(x, y, 3 if wezel.stan.kierunek == 0 else wezel.stan.kierunek - 1), licznik) + + if wezel.stan.kierunek == 0: + y -= 70 + elif wezel.stan.kierunek == 1: + x += 70 + elif wezel.stan.kierunek == 2: + y += 70 + elif wezel.stan.kierunek == 3: + x -= 70 + + wezly = [obrot_w_prawo, obrot_w_lewo] + ruch_w_przod = Wezel(Stan(x, y, wezel.stan.kierunek), licznik) + + # sprawdzenie czy nie wyjdzie poza plansze + if 0 <= x <= 910 and 0 <= y <= 910: + wezly.append(ruch_w_przod) + + return wezly + +def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy): + pierwszy_wezel = Wezel(stan_poczatkowy, 0) + fringe = [pierwszy_wezel] + odwiedzone = [pierwszy_wezel] + licznik = 0 + global mapa + mapa = dict() + while fringe: + wezel = fringe.pop(0) + licznik = licznik + 1 + mapa[licznik] = wezel + if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y: + return wezel + lista1 = nastepnik(wezel, licznik) + for obecny_wezel in lista1: + flag_juz_odwiedzony = 0 + for odwiedzony_wezel in odwiedzone: + # sprawdzenie czy odwiedzilismy juz ten stan + if odwiedzony_wezel.stan.x == obecny_wezel.stan.x and odwiedzony_wezel.stan.y == obecny_wezel.stan.y\ + and odwiedzony_wezel.stan.kierunek == obecny_wezel.stan.kierunek: + flag_juz_odwiedzony = 1 + break + if flag_juz_odwiedzony == 1: + continue + else: + fringe.append(obecny_wezel) + odwiedzone.append(obecny_wezel) + return pierwszy_wezel +def znajdz_sciezke(wezel): + sciezka = [wezel] + index = wezel.rodzic + while index != 0: + wezel = mapa[index] + sciezka.append(wezel) + index = wezel.rodzic + sc = list(reversed(sciezka)) + return sc