2019SZI-Projekt/UI/window.py

135 lines
4.5 KiB
Python

import pygame as pg
import numpy as np
import random
from math import hypot
import itertools as it
from UI.grid import Grid, Node
from Logic.Apath import a_path
class Window():
def __init__(self, grid: Grid,start: (int,int),end: (int,int)):
self.start = start
self.end = end
self.grid = grid
# assign to variables for brevity
cols = self.grid.cols
rows = self.grid.rows
width = Node.r_width
height = Node.r_height
margin = Node.r_margin
screen_width = cols * (width + margin) + 2 * margin
screen_height = rows * (height + margin) + 2 * margin
self.screen = pg.display.set_mode([screen_width, screen_height])
self.end = False
self.clock = pg.time.Clock()
def random_trash(grid: Grid):
for x in range(len(grid.table)*2):
grid.generate_trash(random.randint(1,len(grid.table)-1),random.randint(1,len(grid.table)-1))
#generate trash
random_trash(grid)
grid.change_field(start[0], start[1], 1)
grid.change_field(end[0], end[1], 2)
garbage = grid.garbage_to_collect()
#all obstacles, remove from list objects to collect
obs = [3,5,6,7,8]
for x in garbage:
obs.remove(x)
#list of garbage to collect
to_collect = []
for x in garbage:
to_collect.extend(grid.get_trash_possition(x))
print("\n",len(to_collect)," garbage to collect.")
print(to_collect)
#sort list of tuples to get minimum distance betwen all of them
#fajnie jakby sie udalo to zrobic wydajniej ale narazie niech bedzie tak
#dzielimy plansze na 4 cwiartki
to_collect_sorted = []
q = [[],[],[],[]]
distance = []
for point in to_collect:
if point[0]<10 and point[1] < 10:
q[0].append(point)
elif point[0] < 10 and point[1] >=10 :
q[1].append(point)
elif point[0] >= 10 and point[1] < 10:
q[2].append(point)
elif point[0] >= 10 and point[1] >= 10:
q[3].append(point)
for ind, y in enumerate(q):
di = []
def dist(x,y):
return hypot(y[0]-x[0],y[1]-x[1])
paths = [ p for p in it.permutations(y) ]
path_distances = [ sum(map(lambda x: dist(x[0],x[1]),zip(p[:-1],p[1:]))) for p in paths ]
min_index = np.argmin(path_distances)
print (paths[min_index], path_distances[min_index])
to_collect_sorted.extend(paths[min_index])
#window init
pg.init() # pylint: disable=no-member
# setup window
pg.display.set_caption('Inteligentna śmieciarka')
#draw starting map
self.grid.draw_map(self.screen)
#move of the truck
def move_truck(path):
for index, t in enumerate(path):
x,y =t
if index != 0:
self.grid.change_field(path[index-1][0],path[index-1][1],4)
self.grid.change_field(x, y, 1)
self.grid.draw_node(self.screen, path[index-1][0],path[index-1][1])
self.grid.draw_node(self.screen, x, y)
pg.time.delay(500)
print("collected:",grid.table[x][y].house.trash[2],"on possition: (",x,",",y,") ", grid.table[x][y].house.trash_file)
#visit all points from to_collect
for ind, x in enumerate(to_collect_sorted):
if ind == 0:
array = [[self.grid.table[col][row] for row in range(cols)] for col in range(rows)]
path = a_path(array,(start[0],start[1]),(x[0],x[1]),obs)
#print("Path:",path)
else:
array = [[self.grid.table[col][row] for row in range(cols)] for col in range(rows)]
path = a_path(array,(to_collect_sorted[ind-1][0],to_collect_sorted[ind-1][1]),(x[0],x[1]),obs)
#print("Path:",path)
#draw movement of garbage truck
move_truck(path)
#last move
array = [[self.grid.table[col][row] for row in range(cols)] for col in range(rows)]
path = a_path(array,(to_collect_sorted[len(to_collect)-1][0],to_collect_sorted[len(to_collect)-1][1]),(end[0],end[1]),obs)
#print("Path:",path)
move_truck(path)
pg.quit() # pylint: disable=no-member