From 95f0e6751610eece66a266d9b903b53a8b4dbbc0 Mon Sep 17 00:00:00 2001 From: SaluSL Date: Fri, 23 Apr 2021 17:31:49 +0200 Subject: [PATCH 1/2] bfs graph implementation --- src/main.py | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 229 insertions(+), 5 deletions(-) diff --git a/src/main.py b/src/main.py index a25e64e..3048fa0 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,6 @@ import pygame import random +import time pygame.init() @@ -8,11 +9,33 @@ WIDTH = 675 HEIGHT = 675 size = 75 QTY_OF_PACKAGES = 8 +RECT_SIZE = 9 IMAGE = pygame.image.load('img/wozek2.png') BACKGROUND = pygame.transform.scale(pygame.image.load('img/background.png'), (WIDTH, HEIGHT)) DOCK = pygame.transform.scale(pygame.image.load('img/dock_left.png'), (75, 75)) +get_pix_from_position = {} + + +def get_position_from_pix(pix_pos): + for key, value in get_pix_from_position.items(): + if pix_pos == value: + return key + print("ERROR: THERE IS NO POSITION LIKE THIS (get_position_from_pix)") + + +def create_postiions(): + size_agent = 40 + x_position_pix = size_agent + y_position_pix = size_agent + for position_x in range(RECT_SIZE): + for position_y in range(RECT_SIZE): + get_pix_from_position[(position_x, position_y)] = (x_position_pix, y_position_pix) + y_position_pix += size + y_position_pix = size_agent + x_position_pix += size + def generate_package(a, b): y = random.randint(1, 4) @@ -27,6 +50,76 @@ def generate_package(a, b): p1 = Package((a, b), x, "Builders", 'img/package_builders.png') return p1 +# FRINGE - struktura danych przechowująca wierzchołki do odwiedzenia +# EXPLORED - lista odwiedzonych stanów +# istate - stan początkowy +# Succ - funkcja następnika +# Goaltest -test spełnienia celu + + +def breadth_first_search(istate): # COORDINATES OF A START PLACE + fringe = [] + explored = [] + start = Node(istate) + fringe.append(start) + path = [] + + while True: + if not fringe: + return False + + elem = fringe.pop(0) + + if agent.goal_test(elem.state): + # return ciag akcji zbudowany z wykorzystaniem pol parent i action + while elem.parent is not None: + path.append(elem.action) + elem = elem.parent + path.reverse() + return path + + explored.append(elem) + + for action, state in elem.successor(): + fringe_states = [] + explored_states = [] + for node in fringe: + fringe_states.append(node.state) + for node2 in explored: + explored_states.append(node2.state) + + if state not in fringe_states and state not in explored_states: + x = Node(state) + x.parent = elem + x.action = action + fringe.append(x) + + +class Node: + def __init__(self, state, action=None, parent=None): + self.state = state + self.action = action + self.parent = parent + + def successor(self): + neighbours = [] + x = self.state[0] + y = self.state[1] + + if x < 8: + neighbours.append(("right", (x+1, y))) + + if x > 0: + neighbours.append(("left", (x-1, y))) + + if y > 0: + neighbours.append(("up", (x, y-1))) + + if y < 8: + neighbours.append(("down", (x, y+1))) + + return neighbours + class Package: def __init__(self, pos, content, content_size, pack_image): @@ -40,34 +133,90 @@ class Package: class Shelf: def __init__(self, pos, content, content_size): + self.pos_pix = get_pix_from_position[pos] self.content = content self.content_size = content_size self.image = pygame.transform.scale(pygame.image.load('img/shelf.png'), (60, 60)) - self.rect = self.image.get_rect(center=pos) + self.rect = self.image.get_rect(center=self.pos_pix) class Agent: def __init__(self, pos): self.pos = pos + self.pos_coord = get_position_from_pix(pos) self.image = IMAGE self.rect = self.image.get_rect(center=pos) + self.goal = (0, 0) + self.path = None + self.goal_achieved = False + + self.image_left = pygame.transform.flip(IMAGE, True, False) + self.image_right = IMAGE + self.image_down = pygame.transform.rotate(self.image_right, -90) + self.image_up = pygame.transform.rotate(self.image_left, -90) def move(self, key): if key == pygame.K_UP and self.rect.y - size > 0: self.rect.move_ip(0, -size) self.pos = (self.pos[0], self.pos[1] - size) + # + self.pos_coord = get_position_from_pix(self.pos) if key == pygame.K_DOWN and self.rect.y + size < HEIGHT: self.rect.move_ip(0, size) self.pos = (self.pos[0], self.pos[1] + size) + # + self.pos_coord = get_position_from_pix(self.pos) if key == pygame.K_RIGHT and self.rect.x + size < WIDTH: self.rect.move_ip(size, 0) self.pos = (self.pos[0] + size, self.pos[1]) + # + self.pos_coord = get_position_from_pix(self.pos) if key == pygame.K_LEFT and self.rect.x - size > 0: self.rect.move_ip(-size, 0) self.pos = (self.pos[0] - size, self.pos[1]) + # + self.pos_coord = get_position_from_pix(self.pos) + + def move_bfs(self): + if self.path is None or not self.path: + self.goal_achieved = True + # LIFT PACKAGE?? + + else: + move = self.path.pop(0) + + if move == "right": + self.image = self.image_right # ROTATION + + self.rect.move_ip(size, 0) + self.pos = (self.pos[0] + size, self.pos[1]) + self.pos_coord = get_position_from_pix(self.pos) + elif move == "left": + self.image = self.image_left # ROTATION + + self.rect.move_ip(-size, 0) + self.pos = (self.pos[0] - size, self.pos[1]) + self.pos_coord = get_position_from_pix(self.pos) + + elif move == "down": + self.image = self.image_down # ROTATION + + self.rect.move_ip(0, size) + self.pos = (self.pos[0], self.pos[1] + size) + self.pos_coord = get_position_from_pix(self.pos) + + elif move == "up": + self.image = self.image_up # ROTATION + + self.rect.move_ip(0, -size) + self.pos = (self.pos[0], self.pos[1] - size) + self.pos_coord = get_position_from_pix(self.pos) + + else: + print("error: bad path :move_bfs") def lift_package(self, key): if key == pygame.K_e: @@ -77,9 +226,56 @@ class Agent: elif package.pos == agent.pos: package.is_package_up = True + def lift_package_bfs(self): + for package in Package_list: + if package.is_package_up: + package.is_package_up = False + elif package.pos == agent.pos: + package.is_package_up = True + + def rotate(self, key): + if key == pygame.K_a: + self.turn_agent_left() + + if key == pygame.K_d: + self.turn_agent_right() + + if key == pygame.K_s: + self.turn_agent_down() + + if key == pygame.K_w: + self.turn_agent_up() + + def turn_agent_left(self): + self.successor = (self.pos_coord[0]-1, self.pos_coord[1]) + self.image = self.image_left + + def turn_agent_right(self): + self.successor = (self.pos_coord[0]+1, self.pos_coord[1]) + self.image = self.image_right + + def turn_agent_down(self): + self.successor = (self.pos_coord[0], self.pos_coord[1]-1) + self.image = self.image_down + + def turn_agent_up(self): + self.successor = (self.pos_coord[0], self.pos_coord[1]+1) + self.image = self.image_up + + def goal_test(self, state): + if state == self.goal: + return True + else: + return False + board = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA) # transparently surface +# +create_postiions() + +# + for x in range(9): for y in range(9): pygame.draw.rect(board, (0, 0, 0), (x * size, y * size, size, size), 3) @@ -88,10 +284,13 @@ agent = Agent((40, 640)) Shelf_list = [ - Shelf((640, 340), 'Explosive', 5), Shelf((565, 340), 'Explosive', 5), Shelf((490, 340), 'Explosive', 5), Shelf((415, 340), 'Explosive', 5), - Shelf((640, 190), 'Grocery', 5), Shelf((565, 190), 'Grocery', 5), Shelf((490, 190), 'Grocery', 5), Shelf((415, 190), 'Grocery', 5), - Shelf((640, 640), 'Builders', 5), Shelf((565, 640), 'Builders', 5), Shelf((490, 640), 'Builders', 5), Shelf((415, 640), 'Builders', 5), - Shelf((640, 490), 'Electronic', 5), Shelf((565, 490), 'Electronic', 5), Shelf((490, 490), 'Electronic', 5), Shelf((415, 490), 'Electronic', 5)] + Shelf((5, 2), 'Explosive', 5), Shelf((6, 2), 'Explosive', 5), Shelf((7, 2), 'Explosive', 5), Shelf((8, 2), 'Explosive', 5), + Shelf((5, 4), 'Grocery', 5), Shelf((6, 4), 'Grocery', 5), Shelf((7, 4), 'Grocery', 5), Shelf((8, 4), 'Grocery', 5), + Shelf((5, 6), 'Builders', 5), Shelf((6, 6), 'Builders', 5), Shelf((7, 6), 'Builders', 5), Shelf((8, 6), 'Builders', 5), + Shelf((5, 8), 'Electronic', 5), Shelf((6, 8), 'Electronic', 5), Shelf((7, 8), 'Electronic', 5), Shelf((8, 8), 'Electronic', 5)] + + +coord_goals = [(6, 8), (0, 0), (5,8), (0, 0), (7,8), (0, 0), (8,8), (0, 0), (5,6), (0, 0), (6,6), (0, 0), (7,6), (0, 0), (8,6), (0, 8)] screen = pygame.display.set_mode([WIDTH, HEIGHT]) @@ -99,6 +298,8 @@ Package_list = [ generate_package(40, 40) ] +agent.path = breadth_first_search(agent.pos_coord) + running = True while running: @@ -109,10 +310,12 @@ while running: if event.type == pygame.KEYDOWN: agent.move(event.key) agent.lift_package(event.key) + agent.rotate(event.key) for package in Package_list: if package.is_package_up: package.rect.move_ip(agent.pos[0] - package.pos[0], agent.pos[1] - package.pos[1]) + package.pos = agent.pos if len(Package_list) < QTY_OF_PACKAGES: @@ -128,6 +331,25 @@ while running: # screen.fill((0, 0, 0)) + + + + # pathing + if not agent.goal_achieved: + print(agent.path) + + agent.move_bfs() + + else: + time.sleep(.25) + + agent.lift_package_bfs() + if coord_goals: + agent.goal = coord_goals.pop(0) + agent.goal_achieved = False + + agent.path = breadth_first_search(agent.pos_coord) + screen.blit(BACKGROUND, [0, 0]) screen.blit(DOCK, [0, 0]) screen.blit(board, board.get_rect()) @@ -137,6 +359,8 @@ while running: for package in Package_list: screen.blit(package.image, package.rect) + + pygame.display.update() pygame.quit() From 5afcc0a1a5178de280f5b2961106164c958867f5 Mon Sep 17 00:00:00 2001 From: SaluSL Date: Fri, 7 May 2021 19:25:13 +0200 Subject: [PATCH 2/2] rotation added to the agent --- src/img/electronics.png | Bin 0 -> 2617 bytes src/main.py | 227 ++++++++++++++++++++-------------------- 2 files changed, 114 insertions(+), 113 deletions(-) create mode 100644 src/img/electronics.png diff --git a/src/img/electronics.png b/src/img/electronics.png new file mode 100644 index 0000000000000000000000000000000000000000..2f04b1a24de2ee08e45267e25bf2112417dd81d5 GIT binary patch literal 2617 zcmZ`*e>{_G8-Em0BBdf;KYA;Qq+X|V#*E`vixBG6WRc3KOc-m6dFjXT7LMi|Avz6t z(I}Q5n;FN6%25ro{MaOE)`OkdSek8Tc2wtl)F1bAU!Ui>@9Vy<@BO{L*OTVwgwl*LdT(F zQRrxMxT~vqbPW1*#Mx5-fbAz|JlNmrx7PXjHPUN8YxVQdSmM^LweLdOif!EW?y)vL z=`FsqKVl6M$x6CZ6r^d8z-WGQFxqc!iNg8(yH|P}Q&Y7H`Gc*aF)japi75@u4%Iuu zih^`aU;I}3+sXjo#qye-sE4}1>&+SOTX@z>UR~&}bkLEvUA$?f5Dtx0(OrRHFjd+%G4s^ z5dUy`fKA2Er{J`F^(;rzQxKz*F)&^IpDfCYigx^{&}=@@^fC$(LykO(2j}c6c^!k? zOughIxa|m+y@9+TtLp_ryw`2m4Z7%1oIizQUEh~{86=Sp-)Yp4jMz4}`O3x+z9*Eh znuqQ4KL7x@EdY?53IMYT|BLHY6!rfc~vHjy5-|N{4 zChfutPpe;Wvig2Gw$H6Au$vMIH!nH3vKZ@Mw2K~5w2huS6Ov~{)?97f)?Ai7vn+zx zmU{Jd$=x&*yvO{1!+wz@i#@w%QXb`o#)pO{x7#g;!=7e3uCl9Q&*p>|!dmmgi2`|T zIY?a^ZCT%81E^~|-v?Tj=xtX%RJOYIO`X`NmN@+Ad!f}aBiYkddsD*Tfk(#clS9-} zG|Z0xDH>Yyw$^&3U6%uwIP_SzXO)umB{;T*M6`u%>-i(~Sc!33rGGUczSH5Qht8$^g{0RY>Y> zSE9NAZGHObs4m%Xm93lpINx+U7Az-$>kSO9Aq7)YG0YLx@DHN@F4ZJq`09AbYC?3U z9K{h8jL&sJIXSi21$%8}#(-B)lL6U5n6JZMNrQ6KzH~@pIkl`a*OlNTdf2fg)Bax> zMawxzbZ}hQ2br~d=J$tAY5w2^8xqegOJ$X(iSXiC&)zMdE^@%k#FitK$-^bc+$(~i znF1J%md1Olqy5LGjUVs$6PV392u7)Nw1dsI1aWj!b3-@yQ^DpTN?DK?t4M+kbkOQT zoe=ggMs1b|yreJ8ck+*4CB@w+7^*oV@dR};ZHofz0I`W+E|BG-;dtun=JMbwEJY~8_U zFbR$c?jsOGW2P%TOrtp4}vP}%h^pe09|%0dN0%AkfBMVJyxYW@vwPQ(LA zb2tezT|CYeb7uMP8H@>i;n#RcnkG*2i{l}yVK(~XgL&-2Z}pQDdpy9r{%+2fAqj|x zLhRVg?M~d8)=S4so~2X{1nZNH(<|3OxxM(hb#wwBy&~}P?SYI^Sg;sdB8l`Z!Ba~K z0p=`F1;*zhU!ZBoiq6h{4TeY(%cR;n$;(K$r5wC`9obl1}(nOl zr%VZ0OH(C#5zKu=-?*#Iz3ATU}_>Ht=xI%$a0D4exnqgCF*nc1qBW zg=^{Dl9K7^>l_BD9gKq*3=A$sA4xV_zDUoLHymVPCUyW{K2sIMLaSaB(4voDUzn_5 b5i|kId&B6+^|= 0: - neighbours.append(("left", (x-1, y))) + neighbours.append((actions, (x + 1, y), "right")) - if y > 0: - neighbours.append(("up", (x, y-1))) + if x > 0: # LEFT NEIGHBOUR + if self.agent_direction == "right": + actions = ["rotate_left", "rotate_left", "move"] + elif self.agent_direction == "left": + actions = "move" + elif self.agent_direction == "up": + actions = ["rotate_left", "move"] + elif self.agent_direction == "down": + actions = ["rotate_right", "move"] - if y < 8: - neighbours.append(("down", (x, y+1))) + neighbours.append((actions, (x - 1, y), "left")) + + if y > 0: # UP NEIGHBOUR + if self.agent_direction == "right": + actions = ["rotate_left", "move"] + elif self.agent_direction == "left": + actions = ["rotate_right", "move"] + elif self.agent_direction == "up": + actions = "move" + elif self.agent_direction == "down": + actions = ["rotate_left", "rotate_left", "move"] + + neighbours.append((actions, (x, y - 1), "up")) + + if y < 8: # DOWN NEIGHBOUR + if self.agent_direction == "right": + actions = ["rotate_right", "move"] + elif self.agent_direction == "left": + actions = ["rotate_left", "move"] + elif self.agent_direction == "up": + actions = ["rotate_left", "rotate_left", "move"] + elif self.agent_direction == "down": + actions = "move" + + neighbours.append((actions, (x, y + 1), "down")) return neighbours @@ -141,7 +184,7 @@ class Shelf: class Agent: - def __init__(self, pos): + def __init__(self, pos, agent_direction="right"): self.pos = pos self.pos_coord = get_position_from_pix(pos) self.image = IMAGE @@ -149,82 +192,74 @@ class Agent: self.goal = (0, 0) self.path = None self.goal_achieved = False + self.agent_direction = agent_direction self.image_left = pygame.transform.flip(IMAGE, True, False) self.image_right = IMAGE self.image_down = pygame.transform.rotate(self.image_right, -90) self.image_up = pygame.transform.rotate(self.image_left, -90) - def move(self, key): - if key == pygame.K_UP and self.rect.y - size > 0: - self.rect.move_ip(0, -size) - self.pos = (self.pos[0], self.pos[1] - size) - # - self.pos_coord = get_position_from_pix(self.pos) - - if key == pygame.K_DOWN and self.rect.y + size < HEIGHT: - self.rect.move_ip(0, size) - self.pos = (self.pos[0], self.pos[1] + size) - # - self.pos_coord = get_position_from_pix(self.pos) - - if key == pygame.K_RIGHT and self.rect.x + size < WIDTH: - self.rect.move_ip(size, 0) - self.pos = (self.pos[0] + size, self.pos[1]) - # - self.pos_coord = get_position_from_pix(self.pos) - - if key == pygame.K_LEFT and self.rect.x - size > 0: - self.rect.move_ip(-size, 0) - self.pos = (self.pos[0] - size, self.pos[1]) - # - self.pos_coord = get_position_from_pix(self.pos) - def move_bfs(self): if self.path is None or not self.path: self.goal_achieved = True - # LIFT PACKAGE?? else: move = self.path.pop(0) - if move == "right": - self.image = self.image_right # ROTATION + if move == "rotate_left": + if self.agent_direction == "right": + self.agent_direction = "up" + self.image = self.image_up - self.rect.move_ip(size, 0) - self.pos = (self.pos[0] + size, self.pos[1]) - self.pos_coord = get_position_from_pix(self.pos) - elif move == "left": - self.image = self.image_left # ROTATION + elif self.agent_direction == "left": + self.agent_direction = "down" + self.image = self.image_down - self.rect.move_ip(-size, 0) - self.pos = (self.pos[0] - size, self.pos[1]) - self.pos_coord = get_position_from_pix(self.pos) + elif self.agent_direction == "up": + self.agent_direction = "left" + self.image = self.image_left - elif move == "down": - self.image = self.image_down # ROTATION + elif self.agent_direction == "down": + self.agent_direction = "right" + self.image = self.image_right - self.rect.move_ip(0, size) - self.pos = (self.pos[0], self.pos[1] + size) - self.pos_coord = get_position_from_pix(self.pos) + elif move == "rotate_right": + if self.agent_direction == "right": + self.agent_direction = "down" + self.image = self.image_down - elif move == "up": - self.image = self.image_up # ROTATION + elif self.agent_direction == "left": + self.agent_direction = "up" + self.image = self.image_up - self.rect.move_ip(0, -size) - self.pos = (self.pos[0], self.pos[1] - size) - self.pos_coord = get_position_from_pix(self.pos) + elif self.agent_direction == "up": + self.agent_direction = "right" + self.image = self.image_right - else: - print("error: bad path :move_bfs") + elif self.agent_direction == "down": + self.agent_direction = "left" + self.image = self.image_left - def lift_package(self, key): - if key == pygame.K_e: - for package in Package_list: - if package.is_package_up: - package.is_package_up = False - elif package.pos == agent.pos: - package.is_package_up = True + elif move == "move": + if self.agent_direction == "right": + self.rect.move_ip(size, 0) + self.pos = (self.pos[0] + size, self.pos[1]) + self.pos_coord = get_position_from_pix(self.pos) + + elif self.agent_direction == "left": + self.rect.move_ip(-size, 0) + self.pos = (self.pos[0] - size, self.pos[1]) + self.pos_coord = get_position_from_pix(self.pos) + + elif self.agent_direction == "up": + self.rect.move_ip(0, -size) + self.pos = (self.pos[0], self.pos[1] - size) + self.pos_coord = get_position_from_pix(self.pos) + + elif self.agent_direction == "down": + self.rect.move_ip(0, size) + self.pos = (self.pos[0], self.pos[1] + size) + self.pos_coord = get_position_from_pix(self.pos) def lift_package_bfs(self): for package in Package_list: @@ -233,35 +268,6 @@ class Agent: elif package.pos == agent.pos: package.is_package_up = True - def rotate(self, key): - if key == pygame.K_a: - self.turn_agent_left() - - if key == pygame.K_d: - self.turn_agent_right() - - if key == pygame.K_s: - self.turn_agent_down() - - if key == pygame.K_w: - self.turn_agent_up() - - def turn_agent_left(self): - self.successor = (self.pos_coord[0]-1, self.pos_coord[1]) - self.image = self.image_left - - def turn_agent_right(self): - self.successor = (self.pos_coord[0]+1, self.pos_coord[1]) - self.image = self.image_right - - def turn_agent_down(self): - self.successor = (self.pos_coord[0], self.pos_coord[1]-1) - self.image = self.image_down - - def turn_agent_up(self): - self.successor = (self.pos_coord[0], self.pos_coord[1]+1) - self.image = self.image_up - def goal_test(self, state): if state == self.goal: return True @@ -298,7 +304,7 @@ Package_list = [ generate_package(40, 40) ] -agent.path = breadth_first_search(agent.pos_coord) +agent.path = breadth_first_search(agent.pos_coord, agent.agent_direction) running = True while running: @@ -308,9 +314,10 @@ while running: running = False if event.type == pygame.KEYDOWN: - agent.move(event.key) - agent.lift_package(event.key) - agent.rotate(event.key) + pass + # agent.move(event.key) + # agent.lift_package(event.key) + # agent.rotate(event.key) for package in Package_list: if package.is_package_up: @@ -329,12 +336,7 @@ while running: if is_dock_empty: Package_list.append(generate_package(40, 40)) - # screen.fill((0, 0, 0)) - - - - - # pathing + # PATHING if not agent.goal_achieved: print(agent.path) @@ -348,8 +350,9 @@ while running: agent.goal = coord_goals.pop(0) agent.goal_achieved = False - agent.path = breadth_first_search(agent.pos_coord) + agent.path = breadth_first_search(agent.pos_coord, agent.agent_direction) + # DRAWING screen.blit(BACKGROUND, [0, 0]) screen.blit(DOCK, [0, 0]) screen.blit(board, board.get_rect()) @@ -359,8 +362,6 @@ while running: for package in Package_list: screen.blit(package.image, package.rect) - - pygame.display.update() pygame.quit()