forked from s444417/ProjektAI
stoły mają 4 stany. Status gotowy do złożenia zamówienia ustawiany jest w nowym wątku w klasie TaskManager co 3 sekundy dla jednego stolika, kelner moze odbierać zamówienia od stolików gotowych do ich złożenia
This commit is contained in:
parent
3306461a60
commit
81a2f7db60
@ -2,16 +2,15 @@
|
||||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="4be2149b-d9bc-4e21-8365-293320ae7f92" name="Default Changelist" comment="">
|
||||
<change afterPath="$PROJECT_DIR$/src/components/Drawable.py" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/components/Table.py" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/managers/DrawableCollection.py" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/images/srcWaiter.png" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/managers/MenuManager.py" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/managers/TaskManager.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/images/20x20grid.png" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/images/bigWaiter.jpg" beforeDir="false" afterPath="$PROJECT_DIR$/images/bigWaiter.jpg" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/images/waiter.png" beforeDir="false" afterPath="$PROJECT_DIR$/images/waiter.png" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/components/GridBoard.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/GridBoard.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/components/Drawable.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Drawable.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/components/Table.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Table.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/components/Waiter.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Waiter.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/managers/DrawableCollection.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/managers/DrawableCollection.py" afterDir="false" />
|
||||
</list>
|
||||
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
@ -30,8 +29,11 @@
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
|
||||
</component>
|
||||
<component name="ProjectId" id="1ZSC25l5bE6jvUIMcW31QzsqTTN" />
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
|
||||
<ConfirmationsSetting value="2" id="Add" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">
|
||||
<property name="ASKED_ADD_EXTERNAL_FILES" value="true" />
|
||||
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
|
||||
<property name="WebServerToolWindowFactoryState" value="false" />
|
||||
<property name="settings.editor.selected.configurable" value="settings.github" />
|
||||
@ -106,6 +108,13 @@
|
||||
<workItem from="1585939347531" duration="8682000" />
|
||||
<workItem from="1585948578229" duration="795000" />
|
||||
<workItem from="1585950329643" duration="151000" />
|
||||
<workItem from="1585950592457" duration="1447000" />
|
||||
<workItem from="1586011803812" duration="407000" />
|
||||
<workItem from="1586015125508" duration="1424000" />
|
||||
<workItem from="1586025614413" duration="11394000" />
|
||||
<workItem from="1586089047557" duration="6590000" />
|
||||
<workItem from="1586098345503" duration="112000" />
|
||||
<workItem from="1586098478408" duration="902000" />
|
||||
</task>
|
||||
<task id="LOCAL-00001" summary="klasa kelner">
|
||||
<created>1584889744892</created>
|
||||
@ -135,7 +144,14 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1585257603366</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="5" />
|
||||
<task id="LOCAL-00005" summary="dodano manager rysujący wszystkie obiekty, kelner rozpoznaje kolizje ze stołami">
|
||||
<created>1585950875511</created>
|
||||
<option name="number" value="00005" />
|
||||
<option name="presentableId" value="LOCAL-00005" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1585950875511</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="6" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
@ -155,10 +171,31 @@
|
||||
</option>
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
|
||||
<MESSAGE value="klasa kelner" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="klasa kelner" />
|
||||
<MESSAGE value="dodano manager rysujący wszystkie obiekty, kelner rozpoznaje kolizje ze stołami" />
|
||||
<MESSAGE value="stoły mają 4 stany. Status gotowy do złożenia zamówienia ustawiany jest w nowym wątku w klasie TaskManager co 3 sekundy dla jednego stolika, kelner moze odbierać zamówienia od stolików gotowych do ich złożenia" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="stoły mają 4 stany. Status gotowy do złożenia zamówienia ustawiany jest w nowym wątku w klasie TaskManager co 3 sekundy dla jednego stolika, kelner moze odbierać zamówienia od stolików gotowych do ich złożenia" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<breakpoint-manager>
|
||||
<breakpoints>
|
||||
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
||||
<url>file://$PROJECT_DIR$/src/managers/DrawableCollection.py</url>
|
||||
<line>69</line>
|
||||
<option name="timeStamp" value="6" />
|
||||
</line-breakpoint>
|
||||
</breakpoints>
|
||||
<default-breakpoints>
|
||||
<breakpoint type="python-exception">
|
||||
<properties notifyOnTerminate="true" exception="BaseException">
|
||||
<option name="notifyOnTerminate" value="true" />
|
||||
</properties>
|
||||
</breakpoint>
|
||||
</default-breakpoints>
|
||||
</breakpoint-manager>
|
||||
</component>
|
||||
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
||||
<SUITE FILE_PATH="coverage/kelner$main.coverage" NAME="main Coverage Results" MODIFIED="1585950468781" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||
<SUITE FILE_PATH="coverage/kelner$main.coverage" NAME="main Coverage Results" MODIFIED="1586100415912" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||
</component>
|
||||
</project>
|
BIN
kelner/images/srcWaiter.png
Normal file
BIN
kelner/images/srcWaiter.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 155 KiB |
@ -1,9 +1,10 @@
|
||||
import pygame
|
||||
from src.components.GridBoard import GridBoard
|
||||
from src.managers.DrawableCollection import DrawableCollection
|
||||
from src.managers.MenuManager import MenuManager
|
||||
from src.components.Waiter import Waiter
|
||||
from src.components.Table import Table
|
||||
|
||||
from src.managers.TaskManager import TaskManager
|
||||
|
||||
#create screen consts
|
||||
CellSize = 50 #pixel size of 1 square cell in the grid
|
||||
@ -18,17 +19,30 @@ gridBoard = GridBoard(ScreenWidth, ScreenHeight, CellSize)
|
||||
#initialize drawable objects manager
|
||||
drawableManager = DrawableCollection()
|
||||
|
||||
#initialize menu manager
|
||||
menuManager = MenuManager()
|
||||
|
||||
#initialize waiter component
|
||||
waiter = Waiter(0, 0, 0, GridCountX - 1, 0, GridCountY - 1, CellSize)
|
||||
|
||||
#adds waiter to drawable collection
|
||||
drawableManager.add(waiter)
|
||||
|
||||
#initialize a number of tables given in range
|
||||
for i in range(1, 15):
|
||||
for i in range(1, 20):
|
||||
table = Table(0, GridCountX - 1, 0, GridCountY - 1, CellSize)
|
||||
drawableManager.generatePosition(table)
|
||||
drawableManager.add(table)
|
||||
|
||||
#main loop
|
||||
doRepaint = True
|
||||
|
||||
#object that controlls repainting of changed objects
|
||||
doRepaint = [True]
|
||||
|
||||
#new thread
|
||||
task = TaskManager(drawableManager, menuManager, doRepaint)
|
||||
task.start()
|
||||
|
||||
running = True
|
||||
while running:
|
||||
|
||||
@ -54,13 +68,13 @@ while running:
|
||||
# checks if new waiter's position down is not occupied by other object
|
||||
if drawableManager.isPositionAvailable(waiter.getX(), waiter.getY() + 1):
|
||||
waiter.moveDown()
|
||||
doRepaint = True
|
||||
doRepaint[0] = True
|
||||
|
||||
# repaints all objects to the screen
|
||||
#is set only on initial paint or after keyboard event
|
||||
if doRepaint:
|
||||
gridBoard.reinitialize()
|
||||
gridBoard.draw(drawableManager)
|
||||
gridBoard.draw(waiter)
|
||||
gridBoard.udpdate()
|
||||
doRepaint = False
|
||||
# repaints all objects to the screen
|
||||
# is set only on initial paint or after keyboard event
|
||||
if doRepaint[0]:
|
||||
gridBoard.reinitialize()
|
||||
gridBoard.draw(drawableManager)
|
||||
gridBoard.udpdate()
|
||||
doRepaint[0] = False
|
||||
drawableManager.collectOrders()
|
@ -1,8 +1,9 @@
|
||||
class Drawable:
|
||||
|
||||
BLUE = (0, 0, 255)
|
||||
GREEN = (0, 255, 0)
|
||||
RED = (255, 0, 0)
|
||||
GREY = (128, 128, 128)
|
||||
YELLOW = (255, 255, 0)
|
||||
RED = (255, 0, 0)
|
||||
GREEN = (0, 255, 0)
|
||||
|
||||
def __init__(self, x, y, minX, maxX, minY, maxY, ratio):
|
||||
self.__minX = minX
|
||||
|
@ -1,5 +1,5 @@
|
||||
import pygame
|
||||
import random
|
||||
from enum import Enum
|
||||
from .Drawable import Drawable
|
||||
|
||||
class Table(Drawable):
|
||||
@ -7,8 +7,44 @@ class Table(Drawable):
|
||||
def __init__(self, minX, maxX, minY, maxY, ratio):
|
||||
#call base class constructor
|
||||
Drawable.__init__(self, 0, 0, minX, maxX, minY, maxY, ratio)
|
||||
self.__order = []
|
||||
self.__status = Status.NotReady
|
||||
|
||||
#sets table color based on it's status
|
||||
def getColor(self):
|
||||
color = None
|
||||
if self.__status == Status.NotReady:
|
||||
color = self.GREY
|
||||
elif self.__status == Status.Ready:
|
||||
color = self.YELLOW
|
||||
elif self.__status == Status.Waiting:
|
||||
color = self.RED
|
||||
elif self.__status == Status.Served:
|
||||
color = self.GREEN
|
||||
return color
|
||||
|
||||
def draw(self, screen):
|
||||
pygame.draw.circle(screen, self.GREEN, ((self.getX() * self.getRatio()) + (self.getRatio() // 2),
|
||||
(self.getY() * self.getRatio()) + (self.getRatio() // 2)),
|
||||
(self.getRatio() // 3))
|
||||
pygame.draw.circle(screen, self.getColor(), ((self.getX() * self.getRatio()) + (self.getRatio() // 2),
|
||||
(self.getY() * self.getRatio()) + (self.getRatio() // 2)),
|
||||
(self.getRatio() // 3))
|
||||
def setOrder(self, order):
|
||||
self.__order = order
|
||||
|
||||
def getOrder(self):
|
||||
return self.__order
|
||||
|
||||
def delOrder(self):
|
||||
self.setOrder([])
|
||||
|
||||
def isStatus(self, status):
|
||||
return status == self.__status
|
||||
|
||||
def setStatus(self, status):
|
||||
self.__status = status
|
||||
|
||||
#status of the table
|
||||
class Status(Enum):
|
||||
NotReady = 0
|
||||
Ready = 1
|
||||
Waiting = 2
|
||||
Served = 3
|
@ -7,6 +7,7 @@ class Waiter(Drawable):
|
||||
#call base class constructor
|
||||
Drawable.__init__(self, x, y, minX, maxX, minY, maxY, ratio)
|
||||
self.__image = self.__loadImg('./images/waiter.png')
|
||||
self.__acceptedOrders = []
|
||||
|
||||
def moveUp(self):
|
||||
if self.getY() > self.getMinY():
|
||||
@ -36,6 +37,10 @@ class Waiter(Drawable):
|
||||
else:
|
||||
return False
|
||||
|
||||
#accepts orders from the table and stores them in queue
|
||||
def addOrder(self, table):
|
||||
self.__acceptedOrders += [(table, table.getOrder())]
|
||||
|
||||
def __loadImg(self, filePath):
|
||||
return pygame.image.load(filePath)
|
||||
|
||||
|
@ -1,9 +1,11 @@
|
||||
import random
|
||||
from src.components.Table import Table, Status
|
||||
from src.components.Waiter import Waiter
|
||||
|
||||
#drawable objects manager
|
||||
class DrawableCollection:
|
||||
#const, minimal distance between objects
|
||||
__MinDistance = 1
|
||||
__MinDistance = 0
|
||||
|
||||
def __init__(self):
|
||||
#collection that holds all drawable objects
|
||||
@ -13,7 +15,7 @@ class DrawableCollection:
|
||||
def add(self, drawable):
|
||||
self.__drawables.append(drawable)
|
||||
|
||||
#generates and sets random x, y and cheks if it's not occupied by other object
|
||||
#generates and sets random (x, y) and cheks if it's not occupied by other object
|
||||
def generatePosition(self, drawable):
|
||||
isPositionUnique = False
|
||||
while not isPositionUnique:
|
||||
@ -41,3 +43,30 @@ class DrawableCollection:
|
||||
isPositionAvailable = False
|
||||
break
|
||||
return isPositionAvailable
|
||||
|
||||
#gets all tables by status from collection
|
||||
def getTables(self, status):
|
||||
result = []
|
||||
for item in self.__drawables:
|
||||
if isinstance(item, Table) and item.isStatus(status):
|
||||
result += [item]
|
||||
return result
|
||||
|
||||
#gets all waiters from collection
|
||||
def getWaites(self):
|
||||
result = []
|
||||
for item in self.__drawables:
|
||||
if isinstance(item, Waiter):
|
||||
result += [item]
|
||||
return result
|
||||
|
||||
#waiter collects order from the nearest table
|
||||
def collectOrders(self):
|
||||
waiters = self.getWaites()
|
||||
for waiter in waiters:
|
||||
tables = self.getTables(Status.Ready)
|
||||
for table in tables:
|
||||
if (table.getX() == waiter.getX() and abs(table.getY() - waiter.getY()) == 1) or (table.getY() == waiter.getY() and abs(table.getX() - waiter.getX()) == 1):
|
||||
table.setStatus(Status.Waiting)
|
||||
waiter.addOrder(table)
|
||||
table.delOrder()
|
33
kelner/src/managers/MenuManager.py
Normal file
33
kelner/src/managers/MenuManager.py
Normal file
@ -0,0 +1,33 @@
|
||||
import random
|
||||
|
||||
#contains all dishes and generates random order for the table
|
||||
class MenuManager:
|
||||
|
||||
#consts, min and max dishes oredered by the people sitting by the same table
|
||||
__MinDishes = 1
|
||||
__MaxDishes = 3
|
||||
|
||||
def __init__(self):
|
||||
self.__menuCard = ["PORK",
|
||||
"FRENCH FRIES",
|
||||
"PIZZA",
|
||||
"CHICKEN",
|
||||
"RIBS",
|
||||
"FISH",
|
||||
"SPAGHETTI",
|
||||
"BEEF",
|
||||
"STEAK",
|
||||
"SALAD",
|
||||
"GRILLED VEGETABLES",
|
||||
"VEAL",
|
||||
"CHOPS",
|
||||
"EMPTY PLATE",
|
||||
"BEER",
|
||||
"CAKE"]
|
||||
#generator
|
||||
def generateOrder(self):
|
||||
count = random.randint(self.__MinDishes, self.__MaxDishes)
|
||||
order = []
|
||||
for i in range(0, count):
|
||||
order += [(self.__menuCard[random.randint(0, len(self.__menuCard) - 1)])]
|
||||
return order
|
25
kelner/src/managers/TaskManager.py
Normal file
25
kelner/src/managers/TaskManager.py
Normal file
@ -0,0 +1,25 @@
|
||||
import threading
|
||||
import time
|
||||
import random
|
||||
from src.components.Table import Status
|
||||
|
||||
#creates new threads
|
||||
class TaskManager (threading.Thread):
|
||||
|
||||
def __init__(self, drawableManager, menuManager, doRepaintObject):
|
||||
threading.Thread.__init__(self)
|
||||
self.__drawableManager = drawableManager
|
||||
self.__menuManager = menuManager
|
||||
self.__doRepaintObject = doRepaintObject
|
||||
|
||||
#changes the status of a random table from NotReady to Ready
|
||||
def run(self):
|
||||
while True:
|
||||
time.sleep(3)
|
||||
tables = self.__drawableManager.getTables(Status.NotReady)
|
||||
if tables != []:
|
||||
tableIndex = random.randint(0, len(tables) - 1)
|
||||
table = tables[tableIndex]
|
||||
table.setStatus(Status.Ready)
|
||||
table.setOrder(self.__menuManager.generateOrder())
|
||||
self.__doRepaintObject[0] = True
|
Loading…
Reference in New Issue
Block a user