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)

83
main.py
View File

@ -1,28 +1,14 @@
import sys
import pygame
import regal
from paczka import Paczka
from wozek import Wozek
from packageList import listOfPackages
import wyszukiwanie
import ekran
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():
@ -30,6 +16,17 @@ def main():
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:
@ -56,51 +53,19 @@ def main():
wozek.drop_package()
wozek.dynamic_wozek_picture()
wozek.x += wozek.x_change
wozek.y += wozek.y_change
wozek.obecnyStan.x += wozek.x_change
wozek.obecnyStan.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
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
# 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
ekran.odswiez_ekran(wozek)
if __name__ == "__main__":

View File

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

View File

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

View File

@ -1,10 +1,13 @@
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 = []
@ -43,9 +49,10 @@ class Wozek():
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
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)

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