From ba4e586aca4b73f97907f0df3f16d0daded7c468 Mon Sep 17 00:00:00 2001 From: Vadzim Valchkovich Date: Fri, 31 Mar 2023 00:48:17 +0200 Subject: [PATCH] added basic agent logic --- .gitignore | 59 +++++++++++++++++++++++++++ images/{wykonane.png => done.png} | Bin images/{kuchnia.png => kitchen.png} | Bin images/{zamowienie.png => order.png} | Bin images/{stół.png => table.png} | Bin images/{czeka.png => wait.png} | Bin images/{kelner.png => waiter.png} | Bin main.py | 54 +++++++++++++----------- models/Kitchen.py | 18 ++++++++ models/Object.py | 39 ++++++++++++++++++ models/Table.py | 41 +++++++++++++++++++ models/Waiter.py | 44 ++++++++++++++++++++ 12 files changed, 232 insertions(+), 23 deletions(-) create mode 100644 .gitignore rename images/{wykonane.png => done.png} (100%) rename images/{kuchnia.png => kitchen.png} (100%) rename images/{zamowienie.png => order.png} (100%) rename images/{stół.png => table.png} (100%) rename images/{czeka.png => wait.png} (100%) rename images/{kelner.png => waiter.png} (100%) create mode 100644 models/Kitchen.py create mode 100644 models/Object.py create mode 100644 models/Table.py create mode 100644 models/Waiter.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..686ca0d --- /dev/null +++ b/.gitignore @@ -0,0 +1,59 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +# Sphinx documentation +docs/_build/ + +# vscode + +.vscode + +# Pipfiles + +Pipfile +Pipfile.lock \ No newline at end of file diff --git a/images/wykonane.png b/images/done.png similarity index 100% rename from images/wykonane.png rename to images/done.png diff --git a/images/kuchnia.png b/images/kitchen.png similarity index 100% rename from images/kuchnia.png rename to images/kitchen.png diff --git a/images/zamowienie.png b/images/order.png similarity index 100% rename from images/zamowienie.png rename to images/order.png diff --git a/images/stół.png b/images/table.png similarity index 100% rename from images/stół.png rename to images/table.png diff --git a/images/czeka.png b/images/wait.png similarity index 100% rename from images/czeka.png rename to images/wait.png diff --git a/images/kelner.png b/images/waiter.png similarity index 100% rename from images/kelner.png rename to images/waiter.png diff --git a/main.py b/main.py index d9e1106..1f8aa39 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,10 @@ import pygame import random +from models.Kitchen import Kitchen +from models.Table import Table +from models.Waiter import Waiter + pygame.init() @@ -22,17 +26,15 @@ for i in range(num_squares): squares.append(row) -roles = ["kuchnia", "stół", "zamowienie", "czeka", "wykonane", "kelner"] -images = {} -roles_rect = {} - -for role in roles: - images[role] = pygame.transform.scale(pygame.image.load( - 'images/{0}.png'.format(role)), (square_size, square_size)) - left = random.randint(0, num_squares - 1) * square_size - top = random.randint(0, num_squares - 1) * square_size - roles_rect[role] = pygame.Rect(left, top, square_size, square_size) - +tables = [ + Table(square_size, screen_size, 2, 4), + Table(square_size, screen_size, 6, 5), + Table(square_size, screen_size, 4, 2), + Table(square_size, screen_size, 5, 6), + Table(square_size, screen_size, 4, 4), +] +kitchen = Kitchen(square_size, screen_size, 0, 0) +waiter = Waiter(square_size, screen_size, 0, 0) running = True while running: @@ -41,19 +43,17 @@ while running: if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: - if event.key == pygame.K_UP: - if roles_rect["kelner"].top > 0: - roles_rect["kelner"].top -= square_size + waiter.up() elif event.key == pygame.K_DOWN: - if roles_rect["kelner"].bottom < screen_size[1]: - roles_rect["kelner"].top += square_size + waiter.down() elif event.key == pygame.K_LEFT: - if roles_rect["kelner"].left > 0: - roles_rect["kelner"].left -= square_size + waiter.left() elif event.key == pygame.K_RIGHT: - if roles_rect["kelner"].right < screen_size[0]: - roles_rect["kelner"].left += square_size + waiter.right() + elif event.key == pygame.K_ESCAPE: + for table in tables: + table.new_order() screen.fill((255, 255, 255)) @@ -61,8 +61,16 @@ while running: for square_rect in row: pygame.draw.rect(screen, (0, 0, 0), square_rect, 1) - for role in roles: - pygame.draw.rect(screen, (0, 0, 0), roles_rect[role]) - screen.blit(images[role], roles_rect[role]) + for table in tables: + table.blit(screen) + kitchen.blit(screen) + waiter.blit(screen) + + for table in tables: + if table.collision(waiter): + waiter.do_smth(table) + + if kitchen.collision(waiter): + kitchen.take_orders(waiter) pygame.display.flip() diff --git a/models/Kitchen.py b/models/Kitchen.py new file mode 100644 index 0000000..1035a16 --- /dev/null +++ b/models/Kitchen.py @@ -0,0 +1,18 @@ +import pygame +from models.Object import Object +from models.Waiter import Waiter + + +class Kitchen(Object): + def __init__(self, square_size, screen_size, left_square, top_square): + super().__init__( + 'kitchen', + square_size, + screen_size, + left_square, + top_square + ) + + def take_orders(self, waiter: Waiter): + for table in waiter.get_order_list(): + table.done_order() diff --git a/models/Object.py b/models/Object.py new file mode 100644 index 0000000..c2b30e4 --- /dev/null +++ b/models/Object.py @@ -0,0 +1,39 @@ +import pygame + + +class Object: + def __init__(self, role, square_size, screen_size, left_square, top_square): + self.role = role + self.image = pygame.transform.scale(pygame.image.load( + 'images/{0}.png'.format(role)), (square_size, square_size)) + + self.square_size = square_size + self.screen_size = screen_size + + left = left_square * square_size + top = top_square * square_size + self.rect = pygame.Rect(left, top, square_size, square_size) + + def up(self): + if self.rect.top > 0: + self.rect.top -= self.square_size + + def down(self): + if self.rect.bottom < self.screen_size[1]: + self.rect.top += self.square_size + + def left(self): + if self.rect.left > 0: + self.rect.left -= self.square_size + + def right(self): + if self.rect.right < self.screen_size[0]: + self.rect.left += self.square_size + + def blit(self, screen): + screen.blit(self.image, self.rect) + + def collision(self, obj): + x = self.rect.left == obj.rect.left + y = self.rect.top == obj.rect.top + return x and y diff --git a/models/Table.py b/models/Table.py new file mode 100644 index 0000000..9e7ba05 --- /dev/null +++ b/models/Table.py @@ -0,0 +1,41 @@ +import pygame +from models.Object import Object + + +class Table(Object): + def __init__(self, square_size, screen_size, left_square, top_square): + super().__init__( + 'table', + square_size, + screen_size, + left_square, + top_square + ) + + self.state = 'table' + + def new_order(self): + self.state = 'order' + self.update_pic() + + def wait_order(self): + self.state = 'wait' + self.update_pic() + + def done_order(self): + self.state = 'done' + self.update_pic() + + def reset_order(self): + self.state = 'table' + self.update_pic() + + def is_order(self) -> bool: + return self.state == 'order' + + def is_done(self) -> bool: + return self.state == 'done' + + def update_pic(self): + self.image = pygame.transform.scale(pygame.image.load( + 'images/{0}.png'.format(self.state)), (self.square_size, self.square_size)) diff --git a/models/Waiter.py b/models/Waiter.py new file mode 100644 index 0000000..652a1fc --- /dev/null +++ b/models/Waiter.py @@ -0,0 +1,44 @@ +import pygame +from models.Object import Object +from models.Table import Table + + +class Waiter(Object): + def __init__(self, square_size, screen_size, left_square, top_square): + super().__init__( + 'waiter', + square_size, + screen_size, + left_square, + top_square + ) + self.orders_limit = 3 + self.orders_list = [] + + def do_smth(self, table: Table): + if table.is_order(): + self.take_order(table) + elif table.is_done(): + self.deliver_order(table) + + def take_order(self, table: Table): + if self.orders_limit <= 0: + return + + if not table.is_order(): + return + + self.orders_limit -= 1 + self.orders_list.append(table) + + table.wait_order() + + def deliver_order(self, table: Table): + if table.is_done() and table in self.orders_list: + self.orders_limit += 1 + self.orders_list.remove(table) + + table.reset_order() + + def get_order_list(self) -> list[Table]: + return self.orders_list