This commit is contained in:
Mateusz Kantorski 2023-05-06 15:23:49 +02:00
commit d8d4bde5d9
14 changed files with 302 additions and 121 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

79
ekran.py Normal file
View File

@ -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)

179
main.py
View File

@ -1,107 +1,72 @@
import sys import sys
import pygame import pygame
import regal from wozek import Wozek
from paczka import Paczka import wyszukiwanie
from wozek import Wozek import ekran
from packageList import listOfPackages
pygame.init()
pygame.init()
screen = pygame.display.set_mode((980, 980))
miejsce = pygame.image.load('images/miejsce_paczek.png') def main():
wozek = Wozek()
pygame.display.set_caption("Inteligentny wozek")
icon = pygame.image.load('images/icon.png') while True:
pygame.display.set_icon(icon) for event in pygame.event.get():
if event.type == pygame.QUIT:
def draw(self): sys.exit(0)
screen.blit(self.image, (self.x, self.y)) if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
sys.exit(0)
if event.type == pygame.MOUSEBUTTONDOWN:
# lewy przycisk myszy
def main(): if event.button == 1:
wozek = Wozek() x = pygame.mouse.get_pos()[0]
packageList = listOfPackages() y = pygame.mouse.get_pos()[1]
demo_paczka = Paczka('duzy', 10, any, False, any, any, any, any, any) wiersz = ekran.sprawdz_ktory_wiersz(x)
packageList.add(demo_paczka) kolumna = ekran.sprawdz_ktora_kolumna(y)
docelowy_stan = wyszukiwanie.Stan(wiersz * 70, kolumna * 70, 0)
while True: wezel = wyszukiwanie.wyszukiwanie_bfs(wozek.obecnyStan, docelowy_stan)
for event in pygame.event.get(): sciezka = wyszukiwanie.znajdz_sciezke(wezel)
if event.type == pygame.QUIT: wozek.przemiesc_wozek_po_sciezce(sciezka)
sys.exit(0)
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: if event.type == pygame.KEYDOWN:
sys.exit(0) if event.key == pygame.K_DOWN:
wozek.y_change = 1
if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP:
if event.key == pygame.K_DOWN: wozek.y_change = -1
wozek.y_change = 1 if event.key == pygame.K_RIGHT:
if event.key == pygame.K_UP: wozek.x_change = 1
wozek.y_change = -1 if event.key == pygame.K_LEFT:
if event.key == pygame.K_RIGHT: wozek.x_change = -1
wozek.x_change = 1
if event.key == pygame.K_LEFT: if event.type == pygame.KEYUP:
wozek.x_change = -1 if event.key == pygame.K_DOWN or event.key == pygame.K_UP:
wozek.y_change = 0
if event.type == pygame.KEYUP: if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
if event.key == pygame.K_DOWN or event.key == pygame.K_UP: wozek.x_change = 0
wozek.y_change = 0
if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT: if event.type == pygame.KEYDOWN:
wozek.x_change = 0 if event.key == pygame.K_SPACE:
if wozek.ln == 0:
if event.type == pygame.KEYDOWN: wozek.load_package()
if event.key == pygame.K_SPACE: wozek.dynamic_wozek_picture()
if wozek.ln == 0: else:
wozek.load_package() wozek.drop_package()
wozek.dynamic_wozek_picture() wozek.dynamic_wozek_picture()
else:
wozek.drop_package() wozek.obecnyStan.x += wozek.x_change
wozek.dynamic_wozek_picture() wozek.obecnyStan.y += wozek.y_change
wozek.x += wozek.x_change if wozek.obecnyStan.x <= 0:
wozek.y += wozek.y_change wozek.obecnyStan.x = 0
elif wozek.obecnyStan.x >= 916:
if wozek.x <= 0: wozek.obecnyStan.x = 916
wozek.x = 0 if wozek.obecnyStan.y <= 0:
elif wozek.x >= 916: wozek.obecnyStan.y = 0
wozek.x = 916 elif wozek.obecnyStan.x >= 916:
if wozek.y <= 0: wozek.obecnyStan.x = 916
wozek.y = 0
elif wozek.x >= 916: ekran.odswiez_ekran(wozek)
wozek.x = 916
# Drawing if __name__ == "__main__":
screen.fill((51,51,51)) # removes object trail main()
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()

View File

@ -1,8 +1,16 @@
class listOfPackages: class listOfPackages:
list = [] list = []
def add(self, item): def add(self, item):
self.list.append(item) self.list.append(item)
def remove(self): def remove(self):
self.list.pop() 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

View File

@ -1,5 +1,5 @@
from etykieta import Etykieta from etykieta import Etykieta
from main import pygame import pygame
class Paczka: class Paczka:

View File

@ -1,12 +1,12 @@
import pygame import pygame
from main import screen
def obliczPixeleNaPodstawieKratek(wymiar): #Przeliczanie współrzędnych podanych w kratkach na pixele def obliczPixeleNaPodstawieKratek(wymiar): #Przeliczanie współrzędnych podanych w kratkach na pixele
i = 1 i = 1
pixele = 100 # pixele = 100
pixele = 73
while (i < wymiar): while (i < wymiar):
pixele = pixele + 80 pixele = pixele + 70
i = i + 1 i = i + 1
return pixele return pixele
@ -20,6 +20,7 @@ def obliczPixeleDlugosciRegalu(self): #Przeliczanie dlugości regału podanego
class Regal: class Regal:
def __init__(self, numerRegalu, dlugoscRegaluWKratkach, numerWiersza, numerKolumny): def __init__(self, numerRegalu, dlugoscRegaluWKratkach, numerWiersza, numerKolumny):
from ekran import screen
self.numerRegalu = numerRegalu self.numerRegalu = numerRegalu
self.wysokoscRegalu = 64 self.wysokoscRegalu = 64
self.dlugoscRegaluWKratkach = dlugoscRegaluWKratkach self.dlugoscRegaluWKratkach = dlugoscRegaluWKratkach
@ -29,6 +30,9 @@ class Regal:
self.kolumna = obliczPixeleNaPodstawieKratek(numerKolumny) self.kolumna = obliczPixeleNaPodstawieKratek(numerKolumny)
self.dlugosc = obliczPixeleDlugosciRegalu(self) self.dlugosc = obliczPixeleDlugosciRegalu(self)
# from main import screen
# from ekran import screen
if(self.numerRegalu >= 0 and self.numerRegalu <= 4): if(self.numerRegalu >= 0 and self.numerRegalu <= 4):
reg = pygame.Surface([self.dlugosc, self.wysokoscRegalu]) reg = pygame.Surface([self.dlugosc, self.wysokoscRegalu])
reg = pygame.image.load("images/regal.png") reg = pygame.image.load("images/regal.png")

View File

@ -1,10 +1,13 @@
import pygame,math import ekran
import pygame,math
from packageList import listOfPackages from packageList import listOfPackages
class Wozek(): class Wozek():
def __init__(self): def __init__(self):
self.x = 55 self.obecnyStan = None
self.y = 55 # self.x = 55
# self.y = 55
self.x_change = 0 self.x_change = 0
self.y_change = 0 self.y_change = 0
self.height = 64 self.height = 64
@ -12,7 +15,10 @@ class Wozek():
self.image = pygame.image.load("images/pusty_wozek.png") self.image = pygame.image.load("images/pusty_wozek.png")
# Credit: Forklift icons created by Smashicons - Flaticon # Credit: Forklift icons created by Smashicons - Flaticon
# https://www.flaticon.com/free-icons/forklift # 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 = ["none"] * 10
storage = [] storage = []
@ -32,7 +38,7 @@ class Wozek():
return element return element
else: else:
print("I'm empty!") print("I'm empty!")
def dynamic_wozek_picture(self): def dynamic_wozek_picture(self):
if self.ln == 0: if self.ln == 0:
self.image = pygame.image.load("images/pusty_wozek.png") 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") self.image = pygame.image.load("images/pelny_wozek_2_crates.png")
elif (self.ln == 10): elif (self.ln == 10):
self.image = pygame.image.load("images/pelny_wozek_full_3_crates.png") self.image = pygame.image.load("images/pelny_wozek_full_3_crates.png")
def load_package(self): def load_package(self):
for package in listOfPackages.list: 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: if dist <= 50:
self.add_element(package) self.add_element(package)
listOfPackages.list.pop() listOfPackages.list.pop()
@ -53,5 +60,36 @@ class Wozek():
package = self.remove_element() package = self.remove_element()
if package is not None: if package is not None:
listOfPackages.list.append(package) listOfPackages.list.append(package)
package.x = self.x+50 package.x = self.obecnyStan.x+50
package.y = self.y 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)

87
wyszukiwanie.py Normal file
View File

@ -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