Automatyczny_kelner/main.py

216 lines
5.9 KiB
Python
Raw Normal View History

2024-03-13 18:05:38 +01:00
import pygame
import random
import time
import numpy
import threading
2024-04-18 15:35:34 +02:00
import collections
from collections import deque
2024-03-13 18:05:38 +01:00
2024-04-11 23:21:53 +02:00
kuchnia_xy = 0
pozycja_startowa = 0
2024-04-18 15:35:34 +02:00
# ------------Ustawienia siatki
2024-04-11 23:21:53 +02:00
blockSize = 60
rows = 14
columns = 24
2024-04-18 15:35:34 +02:00
# -----------------------------Inicjacja klas
class Stan:
def __init__(self,position, kierunek):
self.position = position
self.kierunek = kierunek
toVisit = deque()
visited = deque()
def succ(self):
newStan: Stan(x+1, y, 1)
queue = deque([x, y, self.kierunek])
print(queue[0])
#def BFS:
class Kelner:
def __init__(self, x, y):
self.x = x
self.y = y
2024-04-18 15:35:34 +02:00
self.speed = 70 # od 0 do 100, preferowane 70
self.stan = "stoi" # Stan kelnera: stoi, odbiera lub wraca
self.stolik_docelowy = None # Stolik, do którego idzie kelner
2024-04-11 23:21:53 +02:00
self.chodzi = True
self.cel_x = x
self.cel_y = y
2024-04-18 15:35:34 +02:00
self.kierunek = 0 # 0 - północ, 1 - wschód, 2 - południe, 3 - zachód
def wklej(self):
2024-04-17 21:22:50 +02:00
kelnerRotated = pygame.transform.rotate(kelnerImg, -90 * kelner.kierunek)
screen.blit(kelnerRotated, (self.x * blockSize, self.y * blockSize))
2024-04-18 15:35:34 +02:00
#def planuj_ruch(self):
def idz_do_stolika(self):
self.cel_x, self.cel_y = self.stolik_docelowy.x, self.stolik_docelowy.y
kelner.stan = "odbiera"
def idz_do_kuchni(self):
2024-04-11 23:21:53 +02:00
self.cel_x, self.cel_y = kuchnia_xy, kuchnia_xy
self.stolik_docelowy = None
kelner.stan = "wraca"
2024-04-17 21:22:50 +02:00
def obrot_w_lewo(self):
if self.kierunek == 0:
self.kierunek = 3
else:
self.kierunek -= 1
def obrot_w_prawo(self):
if self.kierunek == 3:
self.kierunek = 0
else:
self.kierunek += 1
def idz_do_przodu(self):
if self.kierunek == 0:
2024-04-18 15:35:34 +02:00
self.y -= 1
2024-04-17 21:22:50 +02:00
elif self.kierunek == 1:
2024-04-18 15:35:34 +02:00
self.x += 1
2024-04-17 21:22:50 +02:00
elif self.kierunek == 2:
2024-04-18 15:35:34 +02:00
self.y += 1
2024-04-17 21:22:50 +02:00
elif self.kierunek == 3:
2024-04-18 15:35:34 +02:00
self.x -= 1
2024-04-17 21:22:50 +02:00
class Stolik:
def __init__(self, x, y):
self.x = x
self.y = y
self.zamowione = False
def wklej(self):
2024-04-11 23:21:53 +02:00
screen.blit(stolikImg, (self.x * blockSize, self.y * blockSize))
2024-03-13 18:05:38 +01:00
2024-04-18 15:35:34 +02:00
# --------------Inicjacja obiektów
kelner = Kelner(pozycja_startowa, pozycja_startowa)
2024-04-18 15:35:34 +02:00
# -----------wspolrzedne stolikow
2024-04-11 23:21:53 +02:00
coords = ["8 8", "4 12", "16 8", "12 12", "20 12"]
2024-04-18 15:35:34 +02:00
# Tworzenie listy stolikow
stoliki = []
for coord in coords:
x, y = map(int, coord.split())
stoliki.append(Stolik(x, y))
pygame.init()
2024-03-13 18:05:38 +01:00
pygame.display.set_caption("Automatyczny kelner")
2024-04-18 15:35:34 +02:00
# ----------------wymiary okna
2024-04-11 23:21:53 +02:00
width = columns * blockSize
height = rows * blockSize
2024-03-13 18:05:38 +01:00
screen = pygame.display.set_mode((width, height))
kelnerImg = pygame.image.load("kelner.png")
2024-04-11 23:21:53 +02:00
kelnerImg = pygame.transform.scale(kelnerImg, (blockSize, blockSize))
2024-03-13 18:05:38 +01:00
stolikImg = pygame.image.load("stolik.png")
2024-04-11 23:21:53 +02:00
stolikImg = pygame.transform.scale(stolikImg, (blockSize, blockSize))
menuImg = pygame.image.load("menu.png")
2024-04-11 23:21:53 +02:00
menuImg = pygame.transform.scale(menuImg, (blockSize / 2, blockSize / 2))
kitchenImg = pygame.image.load("kitchen.png")
2024-04-11 23:21:53 +02:00
kitchenImg = pygame.transform.scale(kitchenImg, (blockSize * 2, blockSize * 2))
2024-04-18 15:35:34 +02:00
def kuchnia(x, y):
2024-04-11 23:21:53 +02:00
screen.blit(kitchenImg, (x * blockSize, y * blockSize))
2024-03-13 18:05:38 +01:00
2024-04-18 15:35:34 +02:00
def menu(x, y):
2024-04-11 23:21:53 +02:00
screen.blit(menuImg, (x * blockSize, y * blockSize))
2024-04-18 15:35:34 +02:00
def wypiszOkno():
screen.fill((0, 0, 0))
for x in range(0, width, blockSize):
for y in range(0, height, blockSize):
rect = pygame.Rect(x, y, blockSize, blockSize)
2024-04-18 15:35:34 +02:00
pygame.draw.rect(screen, (200, 200, 200), rect, 1) # -------------Wypisz kratę -TA
2024-03-13 18:05:38 +01:00
run = True
2024-04-11 23:21:53 +02:00
# czcionka = pygame.font.SysFont('Arial',50)
2024-04-11 23:21:53 +02:00
licznik = 0
2024-03-13 18:05:38 +01:00
while run:
wypiszOkno()
kuchnia(kuchnia_xy, kuchnia_xy)
for stolik in stoliki:
stolik.wklej()
2024-04-18 15:35:34 +02:00
kelner.wklej()
if kelner.stan == "wraca":
2024-04-18 15:35:34 +02:00
menu(kelner.x, kelner.y)
2024-04-11 23:21:53 +02:00
licznik += 1
2024-04-18 15:35:34 +02:00
# ------------weź zamowienie
for stolik in stoliki:
if stolik.zamowione == True:
menu(stolik.x, stolik.y)
if kelner.stan == "stoi":
kelner.stolik_docelowy = stolik
2024-04-18 15:35:34 +02:00
#kelner.planuj_ruch()
kelner.idz_do_stolika()
2024-04-18 15:35:34 +02:00
# ----------Losuje stoliki, które dokonają zamówienia
if kelner.stan == "stoi":
for stolik in stoliki:
2024-04-18 15:35:34 +02:00
if stolik.zamowione == True:
break
2024-04-11 23:21:53 +02:00
for i in range(len(stoliki)):
if random.randrange(2) == 1:
stoliki[i].zamowione = True
2024-04-18 15:35:34 +02:00
# print(kelner.stan)--------------------------Wypisuje stan kelnera
# print(f"{kelner.x} {kelner.y}")-------------Wypisuje wspolrzedne kelnera
2024-04-18 15:35:34 +02:00
# --------------Zmiana kierunku kelnera
2024-04-17 21:22:50 +02:00
if kelner.x != kelner.cel_x:
if kelner.x < kelner.cel_x:
kelner.kierunek = 1
else:
kelner.kierunek = 3
else:
2024-04-18 15:35:34 +02:00
if kelner.y < kelner.cel_y: # zmieniamy pozycje Y dopiero, gdy pozycja X bedzie prawidlowa
2024-04-17 21:22:50 +02:00
kelner.kierunek = 2
else:
kelner.kierunek = 0
2024-04-18 15:35:34 +02:00
# ----------------Zmiana pozycji kelnera
if kelner.chodzi == True and licznik % (101 - kelner.speed) == 0: # ograniczenie prędkości
2024-04-17 21:22:50 +02:00
kelner.idz_do_przodu()
2024-04-18 15:35:34 +02:00
# ----------------Sprawdzenie, czy kelner jest u celu
if kelner.x == kelner.cel_x and kelner.y == kelner.cel_y:
if kelner.stan == "odbiera":
kelner.stolik_docelowy.zamowione = False
kelner.idz_do_kuchni()
elif kelner.stan == "wraca":
kelner.stan = "stoi"
2024-03-13 18:05:38 +01:00
time.sleep(0.001)
key = pygame.key.get_pressed()
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
2024-04-18 15:35:34 +02:00
2024-03-13 18:05:38 +01:00
pygame.quit()