Sztuczna_Inteligencja/game.py
2019-06-05 01:19:55 +01:00

161 lines
5.6 KiB
Python

import pygame, sys, random
from waiter import Waiter
from table import Table
from gridElement import GridElement
from pygame.math import Vector2
from orderTable import OrderTable
from pool import Pool
from wasteTable import WasteTable
from operator import attrgetter
import copy
class Game(object):
def __init__(self):
pygame.init()
self.x = 10
self.y = 10
self.screen = pygame.display.set_mode((self.x * 50, self.y * 50))
self.fpsClock = pygame.time.Clock()
self.idTable = 0
self.idOrder = 0
self.idItem = -1
self.idOrderTable = 0
self.waiterNumberInGrid = Vector2()
pygame.display.set_caption('Automatic Waiter')
self.background = pygame.image.load("./Images/tlo.jpg")
# The most important lists
self.grid = []
self.row = []
self.tableList = []
self.orderTableList = []
# TWORZENIE ELEMENTÓW PLANSZY
for b in range(self.y):
for i in range(self.x):
if ((i == 0) or (i == 9)) and ((b == 0) or (b == 6)):
tmp = random.randint(0, 3)
table = Table(i * 50, b * 50, self)
if tmp == 1:
table.isOrdering = True
elif tmp == 2:
table.isWaiting = True
elif tmp == 3:
table.isClean = False
self.row.append(table)
self.tableList.append(table)
elif (b == self.y-1 or b == self.y-2 or b == self.y-3) and (i == 5):
orderTable = OrderTable(i * 50, b * 50, self)
self.row.append(orderTable)
self.orderTableList.append(orderTable)
elif i == 4 and b == 9:
self.waiter = Waiter(self, i * 50, b * 50)
self.row.append(self.waiter)
self.waiterNumberInGrid.x = i
self.waiterNumberInGrid.y = b
elif (((((b > 0 and b < 6) and (i > 0 and i < 9)) and not((i == 1 or i == 8) and (b == 1 or b == 5))) \
or (b > 6 and (i < 4 or i > 5)))) and not i == 4 and not (b == 3) and not (i==3 and b==9):
self.row.append(Pool(i * 50, b * 50, self))
elif i == 3 and b == 9:
self.row.append(WasteTable(i * 50, b * 50, self))
else:
self.row.append(GridElement(i * 50, b * 50, self))
if i == self.x-1:
self.grid.append(list(self.row))
self.row.clear()
#Wydawka jedzenia
for table in self.tableList:
if table.isWaiting:
self.orderTableList[0].hasDish = True
self.orderTableList.sort(key=attrgetter("hasDish"))
#self.dfs(self.waiter, 1, [])
#self.dfs(self.waiter, 3, [])
self.bfs(self.waiter, 1, [])
self.bfs(self.waiter, 4, [])
#path = self.waiter.bfsFind([self.waiter.positionX, self.waiter.positionY], [], 1)
# GŁÓWNA PĘTLA GRY
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
self.draw()
self.waiter.move(self)
#print(self.waiter.checkPoss(self.grid, self.waiter.lastStep))
#print(self.waiterNumberInGrid)
self.fpsClock.tick(10)
# WYRYSOWANIE KAZDEGO ELEMENTU Z GRIDU NA EKRAN
def draw(self):
tempTable = []
for row in self.grid:
for gridElement in row:
if gridElement.type == "gridElement":
gridElement.draw()
else:
tempTable.append(gridElement)
for otherElement in tempTable:
otherElement.draw()
pygame.display.flip()
def convert(self, object):
if object.type == "gridElement":
return 'G'
elif object.type == "table":
return 'T'
elif object.type == "waiter":
return 'W'
elif object.type == "orderTable":
return 'O'
elif object.type == "pool":
return 'P'
elif object.type == "wasteTable":
return 'Z'
def showGrid(self, grid):
charakterList = []
row = []
for y in range(self.y):
row = list(map(self.convert, grid[y]))
charakterList.append(row)
print(row)
# ZNAJDUJE NAJKRÓTSZĄ ŚCIEŻKĘ DFS I PRZECHODZI WEDŁUG LISTY KROKÓW
def dfs(self, waiter, soughtID, operation=[]):
visited = []
waiter.dfsFind([waiter.positionX, waiter.positionY], operation, visited, soughtID)
paths = waiter.dfsPaths
paths.sort(key=len)
print("Wszystkie sciezki dfs: ", paths)
if paths:
bestPath = paths[0]
waiter.dfsPaths = []
waiter.followThePath(bestPath)
# ZNAJDUJE NAJKRÓTSZĄ ŚCIEŻKĘ BFS I PRZECHODZI WEDŁUG LISTY KROKÓW
def bfs(self, waiter, soughtID, operation=[]):
waiter.bfsFind([waiter.positionX, waiter.positionY], operation, [], soughtID)
paths = waiter.bfsPaths
paths.sort(key=len)
print("Wszystkie sciezki bfs: ", paths)
if paths:
bestPath = paths[0]
savedPaths = open("savedPaths.txt", "a+")
print(str(bestPath))
savedPaths.write(str(bestPath) + "\n")
waiter.bfsPaths = []
waiter.bfsQueue = []
waiter.followThePath(bestPath)
savedPaths.close()
if __name__ == "__main__":
v1 = Game()