From 21b874d08972e13ba408654c9d64d960ec8e6069 Mon Sep 17 00:00:00 2001 From: Maciej Sobkowiak Date: Sun, 9 Jun 2019 12:13:31 +0200 Subject: [PATCH] add house class --- Logic/Apath.py | 4 +- UI/grid.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++++ UI/window.py | 42 ++++++++++++------- main.py | 6 +-- 4 files changed, 141 insertions(+), 19 deletions(-) diff --git a/Logic/Apath.py b/Logic/Apath.py index d547c2b..bd1c846 100644 --- a/Logic/Apath.py +++ b/Logic/Apath.py @@ -15,7 +15,7 @@ class AStarNode(): return self.position == other.position -def a_path(table, start, end): +def a_path(table, start, end, obstacles): # Create start and end node start_node = AStarNode(None, start) @@ -67,7 +67,7 @@ def a_path(table, start, end): continue # If not obstacle - if table[node_position[0]][node_position[1]].field_type == 3: + if table[node_position[0]][node_position[1]].field_type in obstacles: continue diff --git a/UI/grid.py b/UI/grid.py index 6c47771..d578dd3 100644 --- a/UI/grid.py +++ b/UI/grid.py @@ -1,5 +1,10 @@ import pygame as pg import numpy as np +import random as rd +from os import listdir +from os.path import isfile, join + + class Grid: @@ -20,9 +25,84 @@ class Grid: def change_field(self, row: int, col: int, f_type: int): self.table[row][col].change_field_type(f_type) + + def generate_trash(self,row: int, col: int): + self.table[row][col].generate_trash() def draw_node(self, screen, row: int, col: int): self.table[row][col].draw(screen) + + def get_trash_possition(self, trash: int): + trash_possition = [] + for row in self.table: + for node in row: + if node.field_type == trash and node.house.empty == False: + trash_possition.append((node.row,node.col)) + return trash_possition + + + + +class House: + # define some basic colors + BLACK = (0, 0, 0) + WHITE = (255, 255, 255) + GREEN = (0, 255, 0) + SKYBLUE = (0,191,255) + RED = (255, 0, 0) + BLUE = (0, 0, 255) + ORANGE = (255, 165, 0) + PINK = (199,21,133) + GREY = (192,192,192) + + #define trash + paper = (5,WHITE,"paper") + glass = (6,SKYBLUE,"glass") + metal = (7,GREY,"metal") + plastic = (8,ORANGE,"plastic") + + #define days of the week + MONDAY = (paper) + TUESDAY = (glass) + WEDNESDAY=(plastic,metal) + THURSDAY = (glass) + FRIDAY = (paper,metal) + SATURDAY = (plastic) + SUNDAY = (metal) + + + def __init__(self): + self.empty = True + self.trash = None + self.trash_file = None + + def find_trash_file(self, trash): + trash_files_list = [] + + file_names = [f for f in listdir("Images\\TestImages") if isfile(join("Images\\TestImages", f))] + #filter names + for f in file_names: + if trash[2] in f: + trash_files_list.append(f) + + f = rd.randint(0,len(trash_files_list)) + return trash_files_list[f-1] + + def generate_trash(self): + self.empty = False + num = rd.randint(1, 4) + if num == 1: + self.trash = self.paper + self.trash_file = self.find_trash_file(self.trash) + elif num == 2: + self.trash = self.glass + self.trash_file = self.find_trash_file(self.trash) + elif num == 3: + self.trash = self.metal + self.trash_file = self.find_trash_file(self.trash) + elif num == 4: + self.trash = self.plastic + self.trash_file = self.find_trash_file(self.trash) class Node: @@ -36,16 +116,22 @@ class Node: BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (0, 255, 0) + SKYBLUE = (0,191,255) RED = (255, 0, 0) BLUE = (0, 0, 255) ORANGE = (255, 165, 0) PINK = (199,21,133) + GREY = (192,192,192) + def __init__(self, row: int, col: int, field_type: int = 0): self.row = row self.col = col self.field_type = field_type + self.house = House() + self.house.generate_trash() + print(self.house.trash,self.house.trash_file) @@ -63,19 +149,41 @@ class Node: (row * (height + margin)) + margin, width, height)) pg.display.flip() # refresh screen + + def generate_trash(self): + self.house.generate_trash() + self.field_type = self.house.trash[0] + def change_field_type(self, field_type: int): self.field_type = field_type def get_field_color(self) -> tuple: """Gets the color tuple of field""" + #base color if self.field_type == 0: return self.GREEN + #truck color elif self.field_type == 1: return self.RED + #end point elif self.field_type == 2: return self.BLUE + #obstacles color elif self.field_type == 3: return self.ORANGE + #path color elif self.field_type == 4: return self.PINK + #paper + elif self.field_type == 5: + return self.WHITE + #glass + elif self.field_type == 6: + return self.SKYBLUE + #metal + elif self.field_type == 7: + return self.GREY + #plastic + elif self.field_type == 8: + return self.ORANGE diff --git a/UI/window.py b/UI/window.py index 13976dd..ef89150 100644 --- a/UI/window.py +++ b/UI/window.py @@ -36,7 +36,7 @@ class Window(): def obstacles(self, grid: Grid,option: int): if option == 1: for x in range(len(grid.table)*8): - grid.change_field(random.randint(1,len(grid.table)-2),random.randint(1,len(grid.table)-2),3) + grid.generate_trash(random.randint(1,len(grid.table)-1),random.randint(1,len(grid.table)-1)) elif option == 2: for x in range (13): grid.change_field(x,14,3) @@ -52,18 +52,32 @@ class Window(): #draw starting map self.grid.draw_map(self.screen) - #copy table - array = [[self.grid.table[col][row] for row in range(cols)] for col in range(rows)] - path = a_path(array,(start[0],start[1]),(end[0],end[1])) - print("Path:",path) + #list of trash to collect + to_collect = grid.get_trash_possition(5) + sorted(to_collect) + print(to_collect) + + for ind, x in enumerate(to_collect): + #copy table + if ind == 0: + array = [[self.grid.table[col][row] for row in range(cols)] for col in range(rows)] + obs = [3,8,6,7] + 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)] + obs = [3,6,7,8] + path = a_path(array,(to_collect[ind-1][0],to_collect[ind-1][1]),(x[0],x[1]),obs) + print("Path:",path) + + #draw movement of garbage truck + 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) - #draw movement of garbage truck - 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) pg.quit() # pylint: disable=no-member diff --git a/main.py b/main.py index 698bd62..cb2d95a 100644 --- a/main.py +++ b/main.py @@ -6,9 +6,9 @@ import PyQt5.QtWidgets as QtWidgets def main(): import sys - app = QtWidgets.QApplication(sys.argv) - Settings() - sys.exit(app.exec_()) + #app = QtWidgets.QApplication(sys.argv) + #Settings() + #sys.exit(app.exec_()) # initialize grid grid = Grid(20, 20) # initialize window (grid, start,end,mode)