agent finding the way to multiple chests, stopping after there are none on the board
This commit is contained in:
parent
99ca90e29a
commit
97e762fd08
19
hero.py
19
hero.py
@ -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":
|
||||||
|
Loading…
Reference in New Issue
Block a user