diff --git a/.idea/SztIn_gr.234798.iml b/.idea/SztIn_gr.234798.iml index d0876a7..8388dbc 100644 --- a/.idea/SztIn_gr.234798.iml +++ b/.idea/SztIn_gr.234798.iml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index dc9ea49..d56657a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/field.py b/field.py index cd4b8c0..57ac78e 100644 --- a/field.py +++ b/field.py @@ -1,15 +1,14 @@ -import asyncio +import os import random import time -from heapq import * from enum import Enum, IntEnum from queue import PriorityQueue -from collections import deque from threading import Thread -from IC3 import tree - import pygame +#from recognition_v1.proverka import * + +from IC3 import tree pygame.init() BLACK = (0, 0, 0) @@ -17,15 +16,15 @@ WHITE = (200, 200, 200) BLUE = (46, 34, 240) WINDOW_DIMENSIONS = 900 BLOCK_SIZE = 60 -ROCKS_NUMBER = 30 +ROCKS_NUMBER = 20 VEGETABLES_NUMBER = 20 -VEGETABLES = ('Potato', 'Broccoli', 'Carrot', 'Onion') +VEGETABLES = ('Potato', 'Broccoli', 'Carrot', 'Capsicum') BOARD_SIZE = int(WINDOW_DIMENSIONS / BLOCK_SIZE) WATER_TANK_CAPACITY = 10 GAS_TANK_CAPACITY = 250 SPAWN_POINT = (0, 0) SKLEP_POINT = (14, 14) -TIMEOUT = 30 +TIMEOUT = 1 tractor_image = pygame.transform.scale(pygame.image.load("images/tractor_image.png"), (BLOCK_SIZE, BLOCK_SIZE)) rock_image = pygame.transform.scale(pygame.image.load("images/rock_image.png"), (BLOCK_SIZE, BLOCK_SIZE)) @@ -33,8 +32,11 @@ potato_image = pygame.transform.scale(pygame.image.load("images/potato.png"), (B carrot_image = pygame.transform.scale(pygame.image.load("images/carrot.png"), (BLOCK_SIZE, BLOCK_SIZE)) broccoli_image = pygame.transform.scale(pygame.image.load("images/broccoli.png"), (BLOCK_SIZE, BLOCK_SIZE)) onion_image = pygame.transform.scale(pygame.image.load("images/onion.png"), (BLOCK_SIZE, BLOCK_SIZE)) +capsicum_image = pygame.transform.scale(pygame.image.load("images/capsicum.png"), (BLOCK_SIZE, BLOCK_SIZE)) +unknown_image = pygame.transform.scale(pygame.image.load("images/unknown.png"), (BLOCK_SIZE, BLOCK_SIZE)) gas_station_image = pygame.transform.scale(pygame.image.load("images/gas_station.png"), (BLOCK_SIZE, BLOCK_SIZE)) -gas_station_closed_image = pygame.transform.scale(pygame.image.load("images/gas_station_closed.png"), (BLOCK_SIZE, BLOCK_SIZE)) +gas_station_closed_image = pygame.transform.scale(pygame.image.load("images/gas_station_closed.png"), + (BLOCK_SIZE, BLOCK_SIZE)) sklep_station_image = pygame.transform.scale(pygame.image.load("images/storage_open.png"), (BLOCK_SIZE, BLOCK_SIZE)) sklep_closed_station_image = pygame.transform.scale(pygame.image.load("images/storage_closed.png"), (BLOCK_SIZE, BLOCK_SIZE)) @@ -76,7 +78,7 @@ def draw_interface(): tractor.gas = GAS_TANK_CAPACITY if (tractor.x, tractor.y) == SKLEP_POINT: tractor.collected_vegetables = {vegetables.POTATO: 0, vegetables.BROCCOLI: 0, vegetables.CARROT: 0, - vegetables.ONION: 0} + vegetables.CAPSICUM: 0} global sc sc = pygame.display.set_mode((WINDOW_DIMENSIONS, WINDOW_DIMENSIONS)) @@ -90,7 +92,13 @@ def draw_interface(): grid = Grid(BOARD_SIZE, BOARD_SIZE, BLOCK_SIZE) graph1 = Graph(grid) + t2 = Thread(target=close_open, args=(grid,)) + t2.setDaemon(True) + t2.start() fl_running = True + determine_thread = Thread(target=grid.determine) + determine_thread.setDaemon(True) + determine_thread.start() while fl_running: draw_grid() # region events @@ -110,9 +118,6 @@ def draw_interface(): elif event.type == pygame.MOUSEBUTTONDOWN: startpoint = (tractor.x, tractor.y, tractor.direction) endpoint = get_click_mouse_pos() - a, c = graph1.a_star(startpoint, endpoint, grid) - b = getRoad(startpoint, c, a) - #movement(tractor, grid, b) decisionTree(startpoint, endpoint, tractor, grid, graph1) # a, c = graph1.a_star(startpoint, endpoint) # b = getRoad(startpoint, c, a) @@ -122,9 +127,6 @@ def draw_interface(): # graph1.initialize_graph(grid) - - - class Direction(IntEnum): UP = 0 RIGHT = 1 @@ -136,7 +138,8 @@ class vegetables(Enum): POTATO = 3 BROCCOLI = 4 CARROT = 5 - ONION = 6 + CAPSICUM = 6 + UNKNOWN = 7 class types(Enum): @@ -145,7 +148,8 @@ class types(Enum): POTATO = 3 BROCCOLI = 4 CARROT = 5 - ONION = 6 + CAPSICUM = 6 + UNKNOWN = 7 class Grid: @@ -154,20 +158,13 @@ class Grid: self.height = height self.block_size = block_size self.grid = [[types.EMPTY for col in range(BOARD_SIZE)] for row in range(BOARD_SIZE)] + self.photo_paths = [['' for col in range(BOARD_SIZE)] for row in range(BOARD_SIZE)] + self.vegetables_locations = [] self.initialize_grid() - self.is_gas_station_closed = True - self.is_storage_closed = True - t2 = Thread(target=self.close_open, args=(self,)) - t2.setDaemon(True) - t2.start() + self.is_gas_station_closed = False + self.is_storage_closed = False - def close_open(self): - while True: - time.sleep(TIMEOUT) - self.is_gas_station_closed = bool(random.getrandbits(1)) - self.is_storage_closed = bool(random.getrandbits(1)) - - def add_object(self, x, y, type_of_object: types): + def add_object(self, x, y, type_of_object): if self.grid[x][y] == types.EMPTY: self.grid[x][y] = type_of_object return True @@ -185,7 +182,9 @@ class Grid: for i in range(VEGETABLES_NUMBER): x, y = random.randrange(0, BOARD_SIZE), random.randrange(0, BOARD_SIZE) if self.grid[x][y] == types.EMPTY and (x, y) != (0, 0): - self.add_object(x, y, random.choice(list(vegetables))) + if self.add_object(x, y, vegetables.UNKNOWN): # random.choice(list(vegetables))) + self.vegetables_locations.append((x, y)) + self.photo_paths[x][y] = get_random_photo_path() else: i -= 1 for i in range(ROCKS_NUMBER): @@ -195,13 +194,27 @@ class Grid: else: i -= 1 + def determine(self): + + for x, y in self.vegetables_locations: + if self.grid[x][y] == vegetables.UNKNOWN: + timeout = time.time() + 0.5 + while True: + sc.blit(pygame.transform.scale(pygame.image.load(self.photo_paths[x][y]), (BLOCK_SIZE*2, BLOCK_SIZE*2)), + ((x * BLOCK_SIZE) - BLOCK_SIZE/2, (y * BLOCK_SIZE) - BLOCK_SIZE/2)) + if time.time() > timeout: + break + # time.sleep(1) + random_veg = random.choice(list(vegetables)) + while random_veg == vegetables.UNKNOWN: + random_veg = random.choice(list(vegetables)) + self.grid[x][y] = random_veg + # self.grid[x][y] = VegebatlesRecognizer.recognize(self.photo_paths[x][y]) + class Graph: def __init__(self, grid: Grid): self.graph = {} -#<<<<<<< HEAD - -#======= # self.initialize_graph(grid) # def initialize_graph(self, grid: Grid): @@ -210,7 +223,6 @@ class Graph: # for direction in Direction: # self.graph[(x, y, direction)] = get_next_nodes(x, y, direction, grid) -#>>>>>>> 2287b2b09f973efdd2dec60834b09109e0b221b9 def a_star(self, start, goal, grid: Grid): # not finished yet https://www.youtube.com/watch?v=abHftC1GU6w queue = PriorityQueue() @@ -250,7 +262,7 @@ class Tractor: self.gas = GAS_TANK_CAPACITY self.water = WATER_TANK_CAPACITY self.collected_vegetables = {vegetables.POTATO: 0, vegetables.BROCCOLI: 0, vegetables.CARROT: 0, - vegetables.ONION: 0} + vegetables.CAPSICUM: 0} self.image = pygame.transform.scale(pygame.image.load("images/tractor_image.png"), (BLOCK_SIZE, BLOCK_SIZE)) def rot_center(self, direc: Direction): @@ -304,7 +316,6 @@ def get_next_nodes(x, y, direction: Direction, grid: Grid): def movement(tractor: Tractor, grid: Grid, road): - print(road) n = len(road) for i in range(n - 1): aA = road[i] @@ -366,8 +377,10 @@ def updateDisplay(tractor: Tractor, grid: Grid): sc.blit(carrot_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5)) elif grid.grid[x][y] == vegetables.BROCCOLI: sc.blit(broccoli_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5)) - elif grid.grid[x][y] == vegetables.ONION: - sc.blit(onion_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5)) + elif grid.grid[x][y] == vegetables.CAPSICUM: + sc.blit(capsicum_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5)) + elif grid.grid[x][y] == vegetables.UNKNOWN: + sc.blit(unknown_image, (x * BLOCK_SIZE + 5, y * BLOCK_SIZE + 5)) elif grid.grid[x][y] == types.ROCK: sc.blit(rock_image, (x * BLOCK_SIZE, y * BLOCK_SIZE)) sc.blit(gas_station_image, (SPAWN_POINT[0] * BLOCK_SIZE, SPAWN_POINT[1] * BLOCK_SIZE)) @@ -384,8 +397,8 @@ def updateDisplay(tractor: Tractor, grid: Grid): vegetables_text = font.render( 'Potato: ' + str(tractor.collected_vegetables[vegetables.POTATO]) + ' Broccoli: ' + str( tractor.collected_vegetables[vegetables.BROCCOLI]) + ' Carrot: ' + str( - tractor.collected_vegetables[vegetables.CARROT]) + ' Onion: ' + str( - tractor.collected_vegetables[vegetables.ONION]), True, WHITE, BLACK) + tractor.collected_vegetables[vegetables.CARROT]) + ' Capsicum: ' + str( + tractor.collected_vegetables[vegetables.CAPSICUM]), True, WHITE, BLACK) vegetables_textrect = vegetables_text.get_rect() vegetables_textrect.center = (WINDOW_DIMENSIONS // 2, WINDOW_DIMENSIONS - 30) sc.blit(vegetables_text, vegetables_textrect) @@ -512,4 +525,23 @@ def decisionTree(startpoint, endpoint, tractor, grid, graph1): print("GAME OVER") +def close_open(grid: Grid): + while True: + time.sleep(TIMEOUT) + grid.is_gas_station_closed = bool(random.getrandbits(1)) + grid.is_storage_closed = bool(random.getrandbits(1)) + +def get_random_photo_path(): + dir_num = random.randint(1, 4) + image_dir = "test_image_dataset" + if dir_num == 1: + image_dir = "test_image_dataset/Broccoli" + if dir_num == 2: + image_dir = "test_image_dataset/Capsicum" + if dir_num == 3: + image_dir = "test_image_dataset/Carrot" + if dir_num == 4: + image_dir = "test_image_dataset/Potato" + + return image_dir + '\\' + random.choice(os.listdir(image_dir)) diff --git a/images/capsicum.png b/images/capsicum.png new file mode 100644 index 0000000..6b9606a Binary files /dev/null and b/images/capsicum.png differ diff --git a/images/unknown.png b/images/unknown.png new file mode 100644 index 0000000..6b0d532 Binary files /dev/null and b/images/unknown.png differ