From 97e762fd089f8e907f667512d74566169c9f5db5 Mon Sep 17 00:00:00 2001 From: tubks Date: Wed, 14 Apr 2021 02:48:54 +0200 Subject: [PATCH] agent finding the way to multiple chests, stopping after there are none on the board --- hero.py | 31 +++++++++++++++++++------------ model.py | 2 +- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/hero.py b/hero.py index 6e59db6..fc20566 100644 --- a/hero.py +++ b/hero.py @@ -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": diff --git a/model.py b/model.py index 9b74481..b4e2f13 100644 --- a/model.py +++ b/model.py @@ -10,7 +10,7 @@ import random x = 10 y = 10 step_counter = 0 -boxes_number = 1 +boxes_number = 4 creatures_number = 5