rotation added to the agent
This commit is contained in:
parent
95f0e67516
commit
5afcc0a1a5
BIN
src/img/electronics.png
Normal file
BIN
src/img/electronics.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
215
src/main.py
215
src/main.py
@ -45,7 +45,7 @@ def generate_package(a, b):
|
|||||||
elif y == 2:
|
elif y == 2:
|
||||||
p1 = Package((a, b), x, "Explosive", 'img/package_explosive.png')
|
p1 = Package((a, b), x, "Explosive", 'img/package_explosive.png')
|
||||||
elif y == 3:
|
elif y == 3:
|
||||||
p1 = Package((a, b), x, "Electronic", 'img/package.png')
|
p1 = Package((a, b), x, "Electronic", 'img/electronics.png')
|
||||||
elif y == 4:
|
elif y == 4:
|
||||||
p1 = Package((a, b), x, "Builders", 'img/package_builders.png')
|
p1 = Package((a, b), x, "Builders", 'img/package_builders.png')
|
||||||
return p1
|
return p1
|
||||||
@ -57,10 +57,10 @@ def generate_package(a, b):
|
|||||||
# Goaltest -test spełnienia celu
|
# 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 = []
|
fringe = []
|
||||||
explored = []
|
explored = []
|
||||||
start = Node(istate)
|
start = Node(istate, agent_direction)
|
||||||
fringe.append(start)
|
fringe.append(start)
|
||||||
path = []
|
path = []
|
||||||
|
|
||||||
@ -73,14 +73,20 @@ def breadth_first_search(istate): # COORDINATES OF A START PLACE
|
|||||||
if agent.goal_test(elem.state):
|
if agent.goal_test(elem.state):
|
||||||
# return ciag akcji zbudowany z wykorzystaniem pol parent i action
|
# return ciag akcji zbudowany z wykorzystaniem pol parent i action
|
||||||
while elem.parent is not None:
|
while elem.parent is not None:
|
||||||
|
if type(elem.action) == list:
|
||||||
|
elem.action.reverse()
|
||||||
|
for each_action in elem.action:
|
||||||
|
path.append(each_action)
|
||||||
|
else:
|
||||||
path.append(elem.action)
|
path.append(elem.action)
|
||||||
elem = elem.parent
|
elem = elem.parent
|
||||||
|
|
||||||
path.reverse()
|
path.reverse()
|
||||||
return path
|
return path
|
||||||
|
|
||||||
explored.append(elem)
|
explored.append(elem)
|
||||||
|
|
||||||
for action, state in elem.successor():
|
for action, state, direction in elem.successor():
|
||||||
fringe_states = []
|
fringe_states = []
|
||||||
explored_states = []
|
explored_states = []
|
||||||
for node in fringe:
|
for node in fringe:
|
||||||
@ -89,34 +95,71 @@ def breadth_first_search(istate): # COORDINATES OF A START PLACE
|
|||||||
explored_states.append(node2.state)
|
explored_states.append(node2.state)
|
||||||
|
|
||||||
if state not in fringe_states and state not in explored_states:
|
if state not in fringe_states and state not in explored_states:
|
||||||
x = Node(state)
|
x = Node(state, direction)
|
||||||
x.parent = elem
|
x.parent = elem
|
||||||
x.action = action
|
x.action = action
|
||||||
fringe.append(x)
|
fringe.append(x)
|
||||||
|
|
||||||
|
|
||||||
class Node:
|
class Node:
|
||||||
def __init__(self, state, action=None, parent=None):
|
def __init__(self, state, agent_direction, action=None, parent=None):
|
||||||
self.state = state
|
self.state = state
|
||||||
self.action = action
|
self.action = action
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
self.agent_direction = agent_direction
|
||||||
|
|
||||||
def successor(self):
|
def successor(self):
|
||||||
neighbours = []
|
neighbours = []
|
||||||
x = self.state[0]
|
x = self.state[0]
|
||||||
y = self.state[1]
|
y = self.state[1]
|
||||||
|
|
||||||
if x < 8:
|
if x < 8: # RIGHT NEIGHBOUR
|
||||||
neighbours.append(("right", (x+1, y)))
|
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((actions, (x + 1, y), "right"))
|
||||||
neighbours.append(("left", (x-1, y)))
|
|
||||||
|
|
||||||
if y > 0:
|
if x > 0: # LEFT NEIGHBOUR
|
||||||
neighbours.append(("up", (x, y-1)))
|
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((actions, (x - 1, y), "left"))
|
||||||
neighbours.append(("down", (x, y+1)))
|
|
||||||
|
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
|
return neighbours
|
||||||
|
|
||||||
@ -141,7 +184,7 @@ class Shelf:
|
|||||||
|
|
||||||
|
|
||||||
class Agent:
|
class Agent:
|
||||||
def __init__(self, pos):
|
def __init__(self, pos, agent_direction="right"):
|
||||||
self.pos = pos
|
self.pos = pos
|
||||||
self.pos_coord = get_position_from_pix(pos)
|
self.pos_coord = get_position_from_pix(pos)
|
||||||
self.image = IMAGE
|
self.image = IMAGE
|
||||||
@ -149,82 +192,74 @@ class Agent:
|
|||||||
self.goal = (0, 0)
|
self.goal = (0, 0)
|
||||||
self.path = None
|
self.path = None
|
||||||
self.goal_achieved = False
|
self.goal_achieved = False
|
||||||
|
self.agent_direction = agent_direction
|
||||||
|
|
||||||
self.image_left = pygame.transform.flip(IMAGE, True, False)
|
self.image_left = pygame.transform.flip(IMAGE, True, False)
|
||||||
self.image_right = IMAGE
|
self.image_right = IMAGE
|
||||||
self.image_down = pygame.transform.rotate(self.image_right, -90)
|
self.image_down = pygame.transform.rotate(self.image_right, -90)
|
||||||
self.image_up = pygame.transform.rotate(self.image_left, -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):
|
def move_bfs(self):
|
||||||
if self.path is None or not self.path:
|
if self.path is None or not self.path:
|
||||||
self.goal_achieved = True
|
self.goal_achieved = True
|
||||||
# LIFT PACKAGE??
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
move = self.path.pop(0)
|
move = self.path.pop(0)
|
||||||
|
|
||||||
if move == "right":
|
if move == "rotate_left":
|
||||||
self.image = self.image_right # ROTATION
|
if self.agent_direction == "right":
|
||||||
|
self.agent_direction = "up"
|
||||||
|
self.image = self.image_up
|
||||||
|
|
||||||
|
elif self.agent_direction == "left":
|
||||||
|
self.agent_direction = "down"
|
||||||
|
self.image = self.image_down
|
||||||
|
|
||||||
|
elif self.agent_direction == "up":
|
||||||
|
self.agent_direction = "left"
|
||||||
|
self.image = self.image_left
|
||||||
|
|
||||||
|
elif self.agent_direction == "down":
|
||||||
|
self.agent_direction = "right"
|
||||||
|
self.image = self.image_right
|
||||||
|
|
||||||
|
elif move == "rotate_right":
|
||||||
|
if self.agent_direction == "right":
|
||||||
|
self.agent_direction = "down"
|
||||||
|
self.image = self.image_down
|
||||||
|
|
||||||
|
elif self.agent_direction == "left":
|
||||||
|
self.agent_direction = "up"
|
||||||
|
self.image = self.image_up
|
||||||
|
|
||||||
|
elif self.agent_direction == "up":
|
||||||
|
self.agent_direction = "right"
|
||||||
|
self.image = self.image_right
|
||||||
|
|
||||||
|
elif self.agent_direction == "down":
|
||||||
|
self.agent_direction = "left"
|
||||||
|
self.image = self.image_left
|
||||||
|
|
||||||
|
elif move == "move":
|
||||||
|
if self.agent_direction == "right":
|
||||||
self.rect.move_ip(size, 0)
|
self.rect.move_ip(size, 0)
|
||||||
self.pos = (self.pos[0] + size, self.pos[1])
|
self.pos = (self.pos[0] + size, self.pos[1])
|
||||||
self.pos_coord = get_position_from_pix(self.pos)
|
self.pos_coord = get_position_from_pix(self.pos)
|
||||||
elif move == "left":
|
|
||||||
self.image = self.image_left # ROTATION
|
|
||||||
|
|
||||||
|
elif self.agent_direction == "left":
|
||||||
self.rect.move_ip(-size, 0)
|
self.rect.move_ip(-size, 0)
|
||||||
self.pos = (self.pos[0] - size, self.pos[1])
|
self.pos = (self.pos[0] - size, self.pos[1])
|
||||||
self.pos_coord = get_position_from_pix(self.pos)
|
self.pos_coord = get_position_from_pix(self.pos)
|
||||||
|
|
||||||
elif move == "down":
|
elif self.agent_direction == "up":
|
||||||
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.rect.move_ip(0, -size)
|
||||||
self.pos = (self.pos[0], self.pos[1] - size)
|
self.pos = (self.pos[0], self.pos[1] - size)
|
||||||
self.pos_coord = get_position_from_pix(self.pos)
|
self.pos_coord = get_position_from_pix(self.pos)
|
||||||
|
|
||||||
else:
|
elif self.agent_direction == "down":
|
||||||
print("error: bad path :move_bfs")
|
self.rect.move_ip(0, size)
|
||||||
|
self.pos = (self.pos[0], self.pos[1] + size)
|
||||||
def lift_package(self, key):
|
self.pos_coord = get_position_from_pix(self.pos)
|
||||||
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
|
|
||||||
|
|
||||||
def lift_package_bfs(self):
|
def lift_package_bfs(self):
|
||||||
for package in Package_list:
|
for package in Package_list:
|
||||||
@ -233,35 +268,6 @@ class Agent:
|
|||||||
elif package.pos == agent.pos:
|
elif package.pos == agent.pos:
|
||||||
package.is_package_up = True
|
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):
|
def goal_test(self, state):
|
||||||
if state == self.goal:
|
if state == self.goal:
|
||||||
return True
|
return True
|
||||||
@ -298,7 +304,7 @@ Package_list = [
|
|||||||
generate_package(40, 40)
|
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
|
running = True
|
||||||
while running:
|
while running:
|
||||||
@ -308,9 +314,10 @@ while running:
|
|||||||
running = False
|
running = False
|
||||||
|
|
||||||
if event.type == pygame.KEYDOWN:
|
if event.type == pygame.KEYDOWN:
|
||||||
agent.move(event.key)
|
pass
|
||||||
agent.lift_package(event.key)
|
# agent.move(event.key)
|
||||||
agent.rotate(event.key)
|
# agent.lift_package(event.key)
|
||||||
|
# agent.rotate(event.key)
|
||||||
|
|
||||||
for package in Package_list:
|
for package in Package_list:
|
||||||
if package.is_package_up:
|
if package.is_package_up:
|
||||||
@ -329,12 +336,7 @@ while running:
|
|||||||
if is_dock_empty:
|
if is_dock_empty:
|
||||||
Package_list.append(generate_package(40, 40))
|
Package_list.append(generate_package(40, 40))
|
||||||
|
|
||||||
# screen.fill((0, 0, 0))
|
# PATHING
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# pathing
|
|
||||||
if not agent.goal_achieved:
|
if not agent.goal_achieved:
|
||||||
print(agent.path)
|
print(agent.path)
|
||||||
|
|
||||||
@ -348,8 +350,9 @@ while running:
|
|||||||
agent.goal = coord_goals.pop(0)
|
agent.goal = coord_goals.pop(0)
|
||||||
agent.goal_achieved = False
|
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(BACKGROUND, [0, 0])
|
||||||
screen.blit(DOCK, [0, 0])
|
screen.blit(DOCK, [0, 0])
|
||||||
screen.blit(board, board.get_rect())
|
screen.blit(board, board.get_rect())
|
||||||
@ -359,8 +362,6 @@ while running:
|
|||||||
for package in Package_list:
|
for package in Package_list:
|
||||||
screen.blit(package.image, package.rect)
|
screen.blit(package.image, package.rect)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pygame.display.update()
|
pygame.display.update()
|
||||||
|
|
||||||
pygame.quit()
|
pygame.quit()
|
||||||
|
Loading…
Reference in New Issue
Block a user