diff --git a/kelner/.idea/workspace.xml b/kelner/.idea/workspace.xml index fb4144a..0a79d84 100644 --- a/kelner/.idea/workspace.xml +++ b/kelner/.idea/workspace.xml @@ -2,7 +2,16 @@ + + + + + + + + + @@ -138,6 +159,6 @@ - + \ No newline at end of file diff --git a/kelner/images/20x20grid.png b/kelner/images/20x20grid.png deleted file mode 100644 index a6abc0d..0000000 Binary files a/kelner/images/20x20grid.png and /dev/null differ diff --git a/kelner/images/bigWaiter.jpg b/kelner/images/bigWaiter.jpg deleted file mode 100644 index 852ced3..0000000 Binary files a/kelner/images/bigWaiter.jpg and /dev/null differ diff --git a/kelner/images/waiter.png b/kelner/images/waiter.png index 38dafd1..67722bb 100644 Binary files a/kelner/images/waiter.png and b/kelner/images/waiter.png differ diff --git a/kelner/main.py b/kelner/main.py index 0931ebd..fc12e62 100644 --- a/kelner/main.py +++ b/kelner/main.py @@ -1,6 +1,8 @@ import pygame from src.components.GridBoard import GridBoard +from src.managers.DrawableCollection import DrawableCollection from src.components.Waiter import Waiter +from src.components.Table import Table #create screen consts @@ -13,10 +15,19 @@ ScreenHeight = CellSize * GridCountY #screen height in pixels #initialize background gridBoard = GridBoard(ScreenWidth, ScreenHeight, CellSize) -#initialize waiter component -waiter = Waiter(1, 1, 0, GridCountX - 1, 0, GridCountY - 1, CellSize) +#initialize drawable objects manager +drawableManager = DrawableCollection() -#loop +#initialize waiter component +waiter = Waiter(0, 0, 0, GridCountX - 1, 0, GridCountY - 1, CellSize) + +#initialize a number of tables given in range +for i in range(1, 15): + table = Table(0, GridCountX - 1, 0, GridCountY - 1, CellSize) + drawableManager.generatePosition(table) + drawableManager.add(table) + +#main loop doRepaint = True running = True while running: @@ -25,19 +36,31 @@ while running: if event.type == pygame.QUIT: running = False + #handles keyboard events if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: - waiter.moveLeft() + #checks if new waiter's position to the left is not occupied by other object + if drawableManager.isPositionAvailable(waiter.getX() - 1, waiter.getY()): + waiter.moveLeft() if event.key == pygame.K_RIGHT: - waiter.moveRight() + # checks if new waiter's position to the right is not occupied by other object + if drawableManager.isPositionAvailable(waiter.getX() + 1, waiter.getY()): + waiter.moveRight() if event.key == pygame.K_UP: - waiter.moveUp() + # checks if new waiter's position up is not occupied by other object + if drawableManager.isPositionAvailable(waiter.getX(), waiter.getY() - 1): + waiter.moveUp() if event.key == pygame.K_DOWN: - waiter.moveDown() + # 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 + # 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 \ No newline at end of file diff --git a/kelner/src/components/Drawable.py b/kelner/src/components/Drawable.py new file mode 100644 index 0000000..9a01e6a --- /dev/null +++ b/kelner/src/components/Drawable.py @@ -0,0 +1,52 @@ +class Drawable: + + BLUE = (0, 0, 255) + GREEN = (0, 255, 0) + RED = (255, 0, 0) + + def __init__(self, x, y, minX, maxX, minY, maxY, ratio): + self.__minX = minX + self.__maxX = maxX + self.__minY = minY + self.__maxY = maxY + self.setX(x) + self.setY(y) + self.__ratio = ratio #cell size + + def setX(self, x): + if (x < self.__minX or self.__maxX < x): + return False + else: + self.__x = x + return True + + def setY(self, y): + if (y < self.__minY or self.__maxY < y): + return False + else: + self.__y = y + return True + + def getX(self): + return self.__x + + def getY(self): + return self.__y + + def getMinX(self): + return self.__minX + + def getMaxX(self): + return self.__maxX + + def getMinY(self): + return self.__minY + + def getMaxY(self): + return self.__maxY + + def getRatio(self): + return self.__ratio + + def draw(self, screen): + pass \ No newline at end of file diff --git a/kelner/src/components/GridBoard.py b/kelner/src/components/GridBoard.py index 72e8cea..222260b 100644 --- a/kelner/src/components/GridBoard.py +++ b/kelner/src/components/GridBoard.py @@ -8,8 +8,9 @@ class GridBoard: self.__width = width self.__height = height self.__cellSize = cellSize - self.__screen = pygame.display.set_mode((width, height)) #initialize screen + self.__screen = pygame.display.set_mode((width, height)) # initialize screen + #fills the screen with white and draws grid def reinitialize(self): self.__screen.fill((255, 255, 255)) for x in range(0, self.__width, self.__cellSize): @@ -17,8 +18,10 @@ class GridBoard: for y in range(0, self.__height, self.__cellSize): pygame.draw.line(self.__screen, (0,0,0), (0,y), ((self.__width - 1),y)) + #draws object on screen def draw(self, component): component.draw(self.__screen) + #updates screen def udpdate(self): pygame.display.update() \ No newline at end of file diff --git a/kelner/src/components/Table.py b/kelner/src/components/Table.py new file mode 100644 index 0000000..adc2ca4 --- /dev/null +++ b/kelner/src/components/Table.py @@ -0,0 +1,14 @@ +import pygame +import random +from .Drawable import Drawable + +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) + + 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)) diff --git a/kelner/src/components/Waiter.py b/kelner/src/components/Waiter.py index b33a306..f28e0e0 100644 --- a/kelner/src/components/Waiter.py +++ b/kelner/src/components/Waiter.py @@ -1,74 +1,37 @@ import pygame +from .Drawable import Drawable - -class Waiter: +class Waiter(Drawable): def __init__(self, x, y, minX, maxX, minY, maxY, ratio): - self.__minX = minX - self.__maxX = maxX - self.__minY = minY - self.__maxY = maxY - self.setX(x) - self.setY(y) - self.__ratio = ratio #cell size + #call base class constructor + Drawable.__init__(self, x, y, minX, maxX, minY, maxY, ratio) self.__image = self.__loadImg('./images/waiter.png') - def setX(self, x): - if (x < self.__minX or self.__maxX < x): - return False - else: - self.__x = x - return True - - def setY(self, y): - if (y < self.__minY or self.__maxY < y): - return False - else: - self.__y = y - return True - - def getX(self): - return self.__x - - def getY(self): - return self.__y - - def getXmin(self): - return self.__minX - - def getXmax(self): - return self.__maxX - - def getYmin(self): - return self.__minY - - def getYmax(self): - return self.__maxY - def moveUp(self): - if self.__y > self.__minY: - self.__y -= 1 + if self.getY() > self.getMinY(): + self.setY(self.getY() - 1) return True else: return False def moveDown(self): - if self.__y < self.__maxY: - self.__y += 1 + if self.getY() < self.getMaxY(): + self.setY(self.getY() + 1) return True else: return False def moveLeft(self): - if self.__x > self.__minX: - self.__x -= 1 + if self.getX() > self.getMinX(): + self.setX(self.getX() - 1) return True else: return False def moveRight(self): - if self.__x < self.__maxX: - self.__x += 1 + if self.getX() < self.getMaxX(): + self.setX(self.getX() + 1) return True else: return False @@ -77,4 +40,4 @@ class Waiter: return pygame.image.load(filePath) def draw(self, screen): - screen.blit(self.__image, (self.__x * self.__ratio, self.__y * self.__ratio)) \ No newline at end of file + screen.blit(self.__image, (self.getX() * self.getRatio(), self.getY() * self.getRatio())) \ No newline at end of file diff --git a/kelner/src/managers/DrawableCollection.py b/kelner/src/managers/DrawableCollection.py new file mode 100644 index 0000000..a7063f0 --- /dev/null +++ b/kelner/src/managers/DrawableCollection.py @@ -0,0 +1,43 @@ +import random + +#drawable objects manager +class DrawableCollection: + #const, minimal distance between objects + __MinDistance = 1 + + def __init__(self): + #collection that holds all drawable objects + self.__drawables = [] + + #adds drawable objects to the collection + def add(self, drawable): + self.__drawables.append(drawable) + + #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: + x = random.randint(drawable.getMinX() + 1, drawable.getMaxX() - 1) + y = random.randint(drawable.getMinY() + 1, drawable.getMaxY() - 1) + isPositionUnique = True + for item in self.__drawables: + if abs(item.getX() - x) <= self.__MinDistance and abs(item.getY() - y) <= self.__MinDistance: + isPositionUnique = False + break + if isPositionUnique: + drawable.setX(x) + drawable.setY(y) + + #draws all objects stored in collection + def draw(self, screen): + for item in self.__drawables: + item.draw(screen) + + #checks if position (x,y) is not occupied by other object + def isPositionAvailable(self, x, y): + isPositionAvailable = True + for item in self.__drawables: + if item.getX() == x and item.getY() == y: + isPositionAvailable = False + break + return isPositionAvailable \ No newline at end of file