diff --git a/src/img/electronics.png b/src/img/electronics.png new file mode 100644 index 0000000..2f04b1a Binary files /dev/null and b/src/img/electronics.png differ diff --git a/src/main.py b/src/main.py index 3048fa0..fedb66a 100644 --- a/src/main.py +++ b/src/main.py @@ -45,7 +45,7 @@ def generate_package(a, b): elif y == 2: p1 = Package((a, b), x, "Explosive", 'img/package_explosive.png') elif y == 3: - p1 = Package((a, b), x, "Electronic", 'img/package.png') + p1 = Package((a, b), x, "Electronic", 'img/electronics.png') elif y == 4: p1 = Package((a, b), x, "Builders", 'img/package_builders.png') return p1 @@ -57,10 +57,10 @@ def generate_package(a, b): # Goaltest -test spełnienia celu -def breadth_first_search(istate): # COORDINATES OF A START PLACE +def breadth_first_search(istate, agent_direction): # COORDINATES OF A START PLACE fringe = [] explored = [] - start = Node(istate) + start = Node(istate, agent_direction) fringe.append(start) path = [] @@ -73,14 +73,20 @@ def breadth_first_search(istate): # COORDINATES OF A START PLACE 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) + if type(elem.action) == list: + elem.action.reverse() + for each_action in elem.action: + path.append(each_action) + else: + path.append(elem.action) elem = elem.parent + path.reverse() return path explored.append(elem) - for action, state in elem.successor(): + for action, state, direction in elem.successor(): fringe_states = [] explored_states = [] for node in fringe: @@ -89,34 +95,71 @@ def breadth_first_search(istate): # COORDINATES OF A START PLACE explored_states.append(node2.state) if state not in fringe_states and state not in explored_states: - x = Node(state) + x = Node(state, direction) x.parent = elem x.action = action fringe.append(x) class Node: - def __init__(self, state, action=None, parent=None): + def __init__(self, state, agent_direction, action=None, parent=None): self.state = state self.action = action self.parent = parent + self.agent_direction = agent_direction def successor(self): neighbours = [] x = self.state[0] y = self.state[1] - if x < 8: - neighbours.append(("right", (x+1, y))) + if x < 8: # RIGHT NEIGHBOUR + if self.agent_direction == "right": + actions = "move" + elif self.agent_direction == "left": + actions = ["rotate_right", "rotate_right", "move"] + elif self.agent_direction == "up": + actions = ["rotate_right", "move"] + elif self.agent_direction == "down": + actions = ["rotate_left", "move"] - if x > 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()