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

19
hero.py
View File

@ -20,7 +20,8 @@ class Player(Creature):
self.directions = [[0, 1], [1, 0], [0, -1], [-1, 0]] self.directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]
self.direction = 0 self.direction = 0
self.queue=[] self.queue=[]
self.goalchest=False self.hasgoalchest=False
self.openedchests=0
def rotate(self, clockwise=True): def rotate(self, clockwise=True):
if clockwise: if clockwise:
@ -128,6 +129,10 @@ class Player(Creature):
self.gold = self.gold + chest.gold self.gold = self.gold + chest.gold
print("Chest opened. Gold inside:", chest.gold) print("Chest opened. Gold inside:", chest.gold)
chest.gold = 0 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): # if isinstance(chest.loot,Armor):
# buffer = self.armor # buffer = self.armor
# self.armor = chest.loot # self.armor = chest.loot
@ -159,7 +164,7 @@ class Player(Creature):
cell_contents = self.model.grid.get_cell_list_contents([cur_pos]) cell_contents = self.model.grid.get_cell_list_contents([cur_pos])
if cell_contents and any([isinstance(thing, Box) for thing in cell_contents]): if cell_contents and any([isinstance(thing, Box) for thing in cell_contents]):
found_target = cur_pos found_target = cur_pos
self.goalchest=True self.hasgoalchest=True
break break
#enqueue safe unvisited neighbours #enqueue safe unvisited neighbours
@ -184,7 +189,7 @@ class Player(Creature):
path.insert(0, precedessor) path.insert(0, precedessor)
return path return path
return False return "no chests left"
# Funkcja konwertujaca wspolrzedne nastepnego pola do odwiedzenia # Funkcja konwertujaca wspolrzedne nastepnego pola do odwiedzenia
# na kolejke akcji do wykonania # na kolejke akcji do wykonania
@ -273,18 +278,20 @@ class Player(Creature):
def step(self): def step(self):
if self.health > 0: if self.health > 0:
# self.moveFwd()
# self.rotate(False)
print("position: ", self.pos) print("position: ", self.pos)
#print("direction: ", self.direction) #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() self.path=self.findShortestPathToTarget()
if self.path=="no chests left":
print("no chests left, life has lost meaning")
else:
print("the player should follow this path:", self.path) 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 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 #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ść 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) 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 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: while len(self.queue)!=0:
self.action=self.queue.pop(0) self.action=self.queue.pop(0)
if self.action=="tr": if self.action=="tr":

View File

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