From 42c0a6ccfc2b3856032b86d6d339f2d8ea92a00a Mon Sep 17 00:00:00 2001 From: Adam Osiowy Date: Sun, 26 Apr 2020 12:18:15 +0200 Subject: [PATCH] dodany test sprawdzajacy dlugosc sciezki --- astar.py | 5 +++++ modele.py | 21 +++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/astar.py b/astar.py index 182ccac..81dccac 100644 --- a/astar.py +++ b/astar.py @@ -12,6 +12,7 @@ def astar(obiekty, start, cel): sasiedzi = [(0, 1), (0, -1), (1, 0), (-1, 0)] close_set = set() came_from = {} + hscore = {start: heurystyka(obiekty, start, cel)} gscore = {start: 0} fscore = {start: heurystyka(obiekty, start, cel)} oheap = [] @@ -20,12 +21,14 @@ def astar(obiekty, start, cel): while oheap: current = heapq.heappop(oheap)[1] if current == cel: + obiekty["plansza"][current[0], current[1]].setKolor((255, 0, 0)) data = [] while current in came_from: data.append(current) current = came_from[current] return data[::-1] close_set.add(current) + obiekty["plansza"][current[0], current[1]].setKolor((255, 0, 0)) for i, j in sasiedzi: sasiad = current[0] + i, current[1] + j @@ -36,6 +39,7 @@ def astar(obiekty, start, cel): elif 6 <= sasiad[0] <= 7 and 10 <= sasiad[1] <= 11: continue tentative_g_score = gscore[current] + heurystyka(obiekty, current, sasiad) + if sasiad in close_set and tentative_g_score >= gscore.get(sasiad, 0): continue if tentative_g_score < gscore.get(sasiad, 0) or sasiad not in [i[1] for i in oheap]: @@ -43,4 +47,5 @@ def astar(obiekty, start, cel): gscore[sasiad] = tentative_g_score fscore[sasiad] = tentative_g_score + heurystyka(obiekty, sasiad, cel) heapq.heappush(oheap, (fscore[sasiad], sasiad)) + obiekty["plansza"][sasiad[0], sasiad[1]].setKolor((0, 255, 0)) return False diff --git a/modele.py b/modele.py index a52d992..45f504f 100644 --- a/modele.py +++ b/modele.py @@ -57,17 +57,18 @@ class Smieciarka(pygame.sprite.Sprite): self.w_dol() def astar_move(self, obiekty): - sciezka = astar.astar(obiekty, self.pozycja, (14, 0)) + sciezka = astar.astar(obiekty, self.pozycja, (random.randrange(15), random.randrange(15))) print(sciezka) - for koord in sciezka: - if koord[0] == self.x - 1 and koord[1] == self.y: - self.w_lewo() - elif koord[0] == self.x + 1 and koord[1] == self.y: - self.w_prawo() - elif koord[0] == self.x and koord[1] + 1 == self.y: - self.w_gore() - elif koord[0] == self.x and koord[1] - 1 == self.y: - self.w_dol() + if sciezka: + for koord in sciezka: + if koord[0] == self.x - 1 and koord[1] == self.y: + self.w_lewo() + elif koord[0] == self.x + 1 and koord[1] == self.y: + self.w_prawo() + elif koord[0] == self.x and koord[1] + 1 == self.y: + self.w_gore() + elif koord[0] == self.x and koord[1] - 1 == self.y: + self.w_dol() print("skonczylem") def w_lewo(self):