agent finding the way to multiple chests, stopping after there are none on the board

This commit is contained in:
tubks 2021-04-14 02:48:54 +02:00
parent 99ca90e29a
commit 97e762fd08
2 changed files with 20 additions and 13 deletions

31
hero.py
View File

@ -20,7 +20,8 @@ class Player(Creature):
self.directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]
self.direction = 0
self.queue=[]
self.goalchest=False
self.hasgoalchest=False
self.openedchests=0
def rotate(self, clockwise=True):
if clockwise:
@ -128,6 +129,10 @@ class Player(Creature):
self.gold = self.gold + chest.gold
print("Chest opened. Gold inside:", chest.gold)
chest.gold = 0
self.openedchests+=1
self.hasgoalchest=False
chest.model.grid.remove_agent(chest)
self.direction=0 #po osiągnięciu jednego celu 'restartuje sie' na szukanie ścieżki do kolejnego
# if isinstance(chest.loot,Armor):
# buffer = self.armor
# self.armor = chest.loot
@ -159,7 +164,7 @@ class Player(Creature):
cell_contents = self.model.grid.get_cell_list_contents([cur_pos])
if cell_contents and any([isinstance(thing, Box) for thing in cell_contents]):
found_target = cur_pos
self.goalchest=True
self.hasgoalchest=True
break
#enqueue safe unvisited neighbours
@ -184,7 +189,7 @@ class Player(Creature):
path.insert(0, precedessor)
return path
return False
return "no chests left"
# Funkcja konwertujaca wspolrzedne nastepnego pola do odwiedzenia
# na kolejke akcji do wykonania
@ -273,18 +278,20 @@ class Player(Creature):
def step(self):
if self.health > 0:
# self.moveFwd()
# self.rotate(False)
print("position: ", self.pos)
#print("direction: ", self.direction)
if not self.goalchest: #jeśli nie ma wyznaczonej skrzynki do której idzie to robi bfs żeby ją wyznaczyć
if not self.hasgoalchest: #jeśli nie ma wyznaczonej skrzynki do której idzie to robi bfs żeby ją wyznaczyć
self.path=self.findShortestPathToTarget()
print("the player should follow this path:", self.path)
for i in range(len(self.path)-1): #iteruje po kolejnych krotkach ze współrzędnymi pól
#actionPlanner ma się wykonać i-1 razy, bo dla ostatniego pola już nie
self.actionPlanner(self.path[i], self.path[i+1]) #dla każdego pola dodaje do kolejki kilka akcji potrzebnych żeby do niego dojść
print(self.queue)
self.direction=0 # bo po obrotach w wyznaczaniu ścieżki trzeba wrócić do orientacji takiej, jaka była na starcie wyznaczania
if self.path=="no chests left":
print("no chests left, life has lost meaning")
else:
print("the player should follow this path:", self.path)
for i in range(len(self.path)-1): #iteruje po kolejnych krotkach ze współrzędnymi pól
#actionPlanner ma się wykonać i-1 razy, bo dla ostatniego pola już nie
self.actionPlanner(self.path[i], self.path[i+1]) #dla każdego pola dodaje do kolejki kilka akcji potrzebnych żeby do niego dojść
print(self.queue)
self.direction=0 # bo po obrotach w wyznaczaniu ścieżki trzeba wrócić do orientacji takiej, jaka była na starcie wyznaczania
#to znaczy, że po otwarciu skrzynki też się zeruje żeby zacząć wyznaczanie i chodzenie od takiej samej
while len(self.queue)!=0:
self.action=self.queue.pop(0)
if self.action=="tr":

View File

@ -10,7 +10,7 @@ import random
x = 10
y = 10
step_counter = 0
boxes_number = 1
boxes_number = 4
creatures_number = 5