From c0218840998cdf900fac695671546e8b83529188 Mon Sep 17 00:00:00 2001 From: s473603 Date: Thu, 25 May 2023 22:51:00 +0200 Subject: [PATCH 1/2] storage added, a-star fixed --- field.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/field.py b/field.py index bfdc107..e2dee84 100644 --- a/field.py +++ b/field.py @@ -86,7 +86,7 @@ def draw_interface(): grid = Grid(BOARD_SIZE, BOARD_SIZE, BLOCK_SIZE) graph1 = Graph(grid) - graph1.initialize_graph(grid) + #graph1.initialize_graph(grid) fl_running = True @@ -179,15 +179,15 @@ class Grid: class Graph: def __init__(self, grid: Grid): self.graph = {} - self.initialize_graph(grid) + # self.initialize_graph(grid) - def initialize_graph(self, grid: Grid): - for y, row in enumerate(grid.grid): - for x, col in enumerate(row): - for direction in Direction: - self.graph[(x, y, direction)] = get_next_nodes(x, y, direction, grid) + # def initialize_graph(self, grid: Grid): + # for y, row in enumerate(grid.grid): + # for x, col in enumerate(row): + # for direction in Direction: + # self.graph[(x, y, direction)] = get_next_nodes(x, y, direction, grid) - def a_star(self, start, goal): + def a_star(self, start, goal, grid: Grid): # not finished yet https://www.youtube.com/watch?v=abHftC1GU6w queue = PriorityQueue() queue.put((0, start)) @@ -203,7 +203,7 @@ class Graph: returnGoal=cur_node break - next_nodes = self.graph[cur_node] + next_nodes = get_next_nodes(cur_node[0], cur_node[1], cur_node[2], grid) for next_node in next_nodes: neigh_cost, neigh_node = next_node @@ -384,23 +384,23 @@ def decisionTree(startpoint, endpoint, tractor, grid, graph1): arr.append(eight) - a1, c1 = graph1.a_star(startpoint, endpoint) + a1, c1 = graph1.a_star(startpoint, endpoint, grid) b1 = getRoad(startpoint, c1, a1) cost1 = getCost(tractor, grid, b1) - a2, c2 = graph1.a_star(startpoint, (SPAWN_POINT[0], SPAWN_POINT[1], Direction.RIGHT)) + a2, c2 = graph1.a_star(startpoint, (SPAWN_POINT[0], SPAWN_POINT[1], Direction.RIGHT), grid) b2 = getRoad(startpoint, c2, a2) cost2 = getCost(tractor, grid, b2) - a3, c3 = graph1.a_star(startpoint, (SKLEP_POINT[0], SKLEP_POINT[1], Direction.RIGHT)) + a3, c3 = graph1.a_star(startpoint, (SKLEP_POINT[0], SKLEP_POINT[1], Direction.RIGHT), grid) b3 = getRoad(startpoint, c3, a3) cost3 = getCost(tractor, grid, b3) - a4, c4 = graph1.a_star(c1, (SPAWN_POINT[0], SPAWN_POINT[1], Direction.RIGHT)) + a4, c4 = graph1.a_star(c1, (SPAWN_POINT[0], SPAWN_POINT[1], Direction.RIGHT), grid) b4 = getRoad(c1, c4, a4) cost4 = getCost(tractor, grid, b4) - a5, c5 = graph1.a_star(c3, (SPAWN_POINT[0], SPAWN_POINT[1], Direction.RIGHT)) + a5, c5 = graph1.a_star(c3, (SPAWN_POINT[0], SPAWN_POINT[1], Direction.RIGHT), grid) b5 = getRoad(c3, c5, a5) cost5 = getCost(tractor, grid, b5) -- 2.20.1 From 1a5af940f1f30b6420c5b54e21abc991baf6c874 Mon Sep 17 00:00:00 2001 From: s473603 Date: Fri, 26 May 2023 10:34:08 +0200 Subject: [PATCH 2/2] gas station/storage adding/closing added --- field.py | 100 +++++++++++++++++++++++++--------------- images/storage_open.png | Bin 0 -> 24558 bytes 2 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 images/storage_open.png diff --git a/field.py b/field.py index e2dee84..463e92f 100644 --- a/field.py +++ b/field.py @@ -1,9 +1,12 @@ +import asyncio 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 @@ -22,8 +25,7 @@ WATER_TANK_CAPACITY = 10 GAS_TANK_CAPACITY = 250 SPAWN_POINT = (0, 0) SKLEP_POINT = (14, 14) - - +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)) @@ -32,7 +34,10 @@ carrot_image = pygame.transform.scale(pygame.image.load("images/carrot.png"), (B 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)) gas_station_image = pygame.transform.scale(pygame.image.load("images/gas_station.png"), (BLOCK_SIZE, BLOCK_SIZE)) -sklep_station_image = pygame.transform.scale(pygame.image.load("images/storage.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)) font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE // 2) @@ -55,7 +60,6 @@ def get_click_mouse_pos(): return (grid_x, grid_y, Direction.RIGHT) if click[0] else False - def draw_interface(): def returnFun(): for y, row in enumerate(grid.grid): @@ -72,7 +76,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.ONION: 0} global sc sc = pygame.display.set_mode((WINDOW_DIMENSIONS, WINDOW_DIMENSIONS)) @@ -86,9 +90,9 @@ def draw_interface(): grid = Grid(BOARD_SIZE, BOARD_SIZE, BLOCK_SIZE) graph1 = Graph(grid) - #graph1.initialize_graph(grid) - - + t2 = Thread(target=close_open, args=(grid,)) + t2.setDaemon(True) + t2.start() fl_running = True while fl_running: draw_grid() @@ -115,6 +119,11 @@ def draw_interface(): # movement(tractor, grid, b) updateDisplay(tractor, grid) + # graph1.initialize_graph(grid) + + + + class Direction(IntEnum): UP = 0 @@ -146,6 +155,8 @@ class Grid: self.block_size = block_size self.grid = [[types.EMPTY for col in range(BOARD_SIZE)] for row in range(BOARD_SIZE)] self.initialize_grid() + self.is_gas_station_closed = False + self.is_storage_closed = False def add_object(self, x, y, type_of_object: types): if self.grid[x][y] == types.EMPTY: @@ -195,12 +206,13 @@ class Graph: visited = {start: None} returnGoal = goal - h = lambda start, goal: abs(start[0] - goal[0]) + abs(start[1] - goal[1]) #heuristic function (manhattan distance) + h = lambda start, goal: abs(start[0] - goal[0]) + abs( + start[1] - goal[1]) # heuristic function (manhattan distance) while not queue.empty(): cur_cost, cur_node = queue.get() if cur_node[0] == goal[0] and cur_node[1] == goal[1]: - returnGoal=cur_node + returnGoal = cur_node break next_nodes = get_next_nodes(cur_node[0], cur_node[1], cur_node[2], grid) @@ -258,7 +270,9 @@ class Tractor: def get_next_nodes(x, y, direction: Direction, grid: Grid): check_next_node = lambda x, y: True if 0 <= x < BOARD_SIZE and 0 <= y < BOARD_SIZE else False - way = [0, -1] if direction == Direction.UP else [1, 0] if direction == Direction.RIGHT else [0, 1] if direction == Direction.DOWN else [-1, 0] + way = [0, -1] if direction == Direction.UP else [1, 0] if direction == Direction.RIGHT else [0, + 1] if direction == Direction.DOWN else [ + -1, 0] next_nodes = [] for new_direction in Direction: if new_direction != direction: @@ -291,6 +305,8 @@ def movement(tractor: Tractor, grid: Grid, road): else: tractor.rot_center(Direction.LEFT) updateDisplay(tractor, grid) + + def getCost(tractor: Tractor, grid: Grid, road): n = len(road) cost = 0 @@ -309,11 +325,12 @@ def getCost(tractor: Tractor, grid: Grid, road): cost += 2 if aA[2] != bB[2]: if (bB[2].value - aA[2].value == 1) or (bB[2].value - aA[2].value == -3): - cost +=1 + cost += 1 else: - cost +=1 + cost += 1 return cost + def getRoad(start, goal, visited): arr = [] aFrom = goal @@ -340,7 +357,14 @@ def updateDisplay(tractor: Tractor, grid: Grid): 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)) - sc.blit(sklep_station_image, (SKLEP_POINT[0] * BLOCK_SIZE, SKLEP_POINT[1] * BLOCK_SIZE)) + if grid.is_storage_closed: + sc.blit(sklep_closed_station_image, (SKLEP_POINT[0] * BLOCK_SIZE, SKLEP_POINT[1] * BLOCK_SIZE)) + else: + sc.blit(sklep_station_image, (SKLEP_POINT[0] * BLOCK_SIZE, SKLEP_POINT[1] * BLOCK_SIZE)) + if grid.is_gas_station_closed: + sc.blit(gas_station_closed_image, (SPAWN_POINT[0] * BLOCK_SIZE, SPAWN_POINT[1] * BLOCK_SIZE)) + else: + sc.blit(gas_station_image, (SPAWN_POINT[0] * BLOCK_SIZE, SPAWN_POINT[1] * BLOCK_SIZE)) # region text vegetables_text = font.render( @@ -363,16 +387,16 @@ def updateDisplay(tractor: Tractor, grid: Grid): pygame.time.Clock().tick(60) -def decisionTree(startpoint, endpoint, tractor, grid, graph1): - one="can it get to the next point" - two="will it be able to get to the gas station" - three="will it be able to get to the gas station after arriving at the next point" - four="will it be able to take the next vegetable to the tractor storage" - five="will it be able to get to the vegetable warehouse" - six="will it be able to get to the gas station after it arrives at the vegetable warehouse" - seven="is the vegetable warehouse closed" - eight="is the gas station closed" +def decisionTree(startpoint, endpoint, tractor, grid, graph1): + one = "can it get to the next point" + two = "will it be able to get to the gas station" + three = "will it be able to get to the gas station after arriving at the next point" + four = "will it be able to take the next vegetable to the tractor storage" + five = "will it be able to get to the vegetable warehouse" + six = "will it be able to get to the gas station after it arrives at the vegetable warehouse" + seven = "is the vegetable warehouse closed" + eight = "is the gas station closed" arr = [] arr.append(one) arr.append(two) @@ -383,7 +407,6 @@ def decisionTree(startpoint, endpoint, tractor, grid, graph1): arr.append(seven) arr.append(eight) - a1, c1 = graph1.a_star(startpoint, endpoint, grid) b1 = getRoad(startpoint, c1, a1) cost1 = getCost(tractor, grid, b1) @@ -404,7 +427,6 @@ def decisionTree(startpoint, endpoint, tractor, grid, graph1): b5 = getRoad(c3, c5, a5) cost5 = getCost(tractor, grid, b5) - if tractor.gas - cost1 > 0: can_it_get_to_the_next_point = 1 else: @@ -429,18 +451,17 @@ def decisionTree(startpoint, endpoint, tractor, grid, graph1): will_it_be_able_to_take_the_next_vegetable_to_the_tractor_storage = 1 if tractor.gas - cost3 > 0: - will_it_be_able_to_get_to_the_vegetable_warehouse=1 + will_it_be_able_to_get_to_the_vegetable_warehouse = 1 else: - will_it_be_able_to_get_to_the_vegetable_warehouse=0 + will_it_be_able_to_get_to_the_vegetable_warehouse = 0 if tractor.gas - cost3 - cost5 > 0: - will_it_be_able_to_get_to_the_gas_station_after_it_arrives_at_the_vegetable_warehouse=1 + will_it_be_able_to_get_to_the_gas_station_after_it_arrives_at_the_vegetable_warehouse = 1 else: will_it_be_able_to_get_to_the_gas_station_after_it_arrives_at_the_vegetable_warehouse = 0 - is_the_vegetable_warehouse_closed=0 - is_the_gas_station_closed=0 - + is_the_vegetable_warehouse_closed = grid.is_storage_closed + is_the_gas_station_closed = grid.is_gas_station_closed brr = [] brr.append(can_it_get_to_the_next_point) @@ -462,16 +483,23 @@ def decisionTree(startpoint, endpoint, tractor, grid, graph1): return predict(tree[root_node][feature_value]) else: return None + decision = predict(tree) print(decision) - if decision==1: + if decision == 1: movement(tractor, grid, b1) - if decision==2: + if decision == 2: movement(tractor, grid, b2) - if decision==3: + if decision == 3: movement(tractor, grid, b3) - if decision==4: + if decision == 4: print("waiting") - if decision==5: + if decision == 5: 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)) diff --git a/images/storage_open.png b/images/storage_open.png new file mode 100644 index 0000000000000000000000000000000000000000..9401d483c1ed57dfdbcec0933e3619284dba82dd GIT binary patch literal 24558 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