2nd part AStar implementation
This commit is contained in:
parent
cdbc599d14
commit
96b42fb6c0
2
main.py
2
main.py
@ -14,6 +14,7 @@ if __name__ == "__main__":
|
|||||||
# init functions
|
# init functions
|
||||||
graphics.drawBackground(waiter.matrix)
|
graphics.drawBackground(waiter.matrix)
|
||||||
graphics.update(waiter.X, waiter.Y)
|
graphics.update(waiter.X, waiter.Y)
|
||||||
|
print(waiter.findPath((1, 10)))
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
@ -29,6 +30,7 @@ if __name__ == "__main__":
|
|||||||
break
|
break
|
||||||
|
|
||||||
graphics.clear(waiter.X, waiter.Y)
|
graphics.clear(waiter.X, waiter.Y)
|
||||||
|
|
||||||
waiter.update(event, graphics)
|
waiter.update(event, graphics)
|
||||||
graphics.update(waiter.X, waiter.Y)
|
graphics.update(waiter.X, waiter.Y)
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -18,9 +18,9 @@ class Tile:
|
|||||||
# Atrybuty niezbedne dla A*
|
# Atrybuty niezbedne dla A*
|
||||||
self.position = (x, y)
|
self.position = (x, y)
|
||||||
self.parent = None
|
self.parent = None
|
||||||
self.totalCost = 0 # Koszt totalny czyli dystans do wierzcholka startowego + heurystyka
|
self.totalCost = 0 # Koszt totalny czyli dystans do wierzcholka startowego + heurystyka F
|
||||||
self.startCost = 0 # Dystans do wierzcholka startowego
|
self.startCost = 0 # Dystans do wierzcholka startowego G
|
||||||
# Dystant do wierzcholka koncowego oszacowany za pomoca funkcji heurystyki
|
# Dystant do wierzcholka koncowego oszacowany za pomoca funkcji heurystyki H
|
||||||
self.heuristic = 0
|
self.heuristic = 0
|
||||||
|
|
||||||
# Operator porownywania pol
|
# Operator porownywania pol
|
||||||
|
107
src/waiter.py
107
src/waiter.py
@ -1,6 +1,7 @@
|
|||||||
import pygame
|
import pygame
|
||||||
|
|
||||||
from .matrix import Matrix
|
from .matrix import Matrix
|
||||||
|
from .tile import Tile
|
||||||
|
|
||||||
|
|
||||||
# WAITER
|
# WAITER
|
||||||
@ -12,6 +13,7 @@ class Waiter(pygame.sprite.Sprite):
|
|||||||
self.frame = 0
|
self.frame = 0
|
||||||
self.matrix = Matrix(graphics=graphics)
|
self.matrix = Matrix(graphics=graphics)
|
||||||
self.direction = 'E'
|
self.direction = 'E'
|
||||||
|
self.tile = Tile(self, self.X, self.Y)
|
||||||
|
|
||||||
# Borders
|
# Borders
|
||||||
def move(self, x, y, graphics):
|
def move(self, x, y, graphics):
|
||||||
@ -53,61 +55,98 @@ class Waiter(pygame.sprite.Sprite):
|
|||||||
|
|
||||||
# AStar
|
# AStar
|
||||||
def findPath(self, goal):
|
def findPath(self, goal):
|
||||||
#Stworzenie startowego i koncowego wierzcholka
|
# Stworzenie startowego i koncowego wierzcholka
|
||||||
startNode = self.matrix.matrix[self.X][self.Y]
|
startNode = self.matrix.matrix[self.X][self.Y]
|
||||||
goalNode = self.matrix.matrix[goal[0]][goal[1]]
|
goalNode = self.matrix.matrix[goal[0]][goal[1]]
|
||||||
|
|
||||||
#Inicjalizacja list
|
# Inicjalizacja list
|
||||||
openList = []
|
openList = []
|
||||||
closedList = []
|
closedList = []
|
||||||
|
|
||||||
openList.append(startNode)
|
openList.append(startNode)
|
||||||
|
|
||||||
while len(openList) > 0:
|
while len(openList) > 0:
|
||||||
|
openList.sort(key=getTotalCost)
|
||||||
openList.sort(key=tile.totalCost)
|
|
||||||
currentNode = openList.pop(0)
|
currentNode = openList.pop(0)
|
||||||
closedList.append(currentNode)
|
closedList.append(currentNode)
|
||||||
|
|
||||||
|
print("\nOpenList")
|
||||||
|
for tile in openList:
|
||||||
|
print(tile.position, end=" ")
|
||||||
|
|
||||||
|
print("\nClosed List")
|
||||||
|
for tile in closedList:
|
||||||
|
print(tile.position, end=' ')
|
||||||
|
|
||||||
|
# Tutaj odbywac sie bedzie budowanie sciezki gdy algorytm osiagnie cel
|
||||||
if currentNode == goalNode:
|
if currentNode == goalNode:
|
||||||
pass
|
path = []
|
||||||
#Tutaj odbywac sie bedzie budowanie sciezki gdy algorytm osiagnie cel
|
current = currentNode
|
||||||
|
while current is not None:
|
||||||
|
path.append(current.position)
|
||||||
|
current = current.parent
|
||||||
|
return path[::-1]
|
||||||
|
|
||||||
children = []
|
children = []
|
||||||
if currentNode.X >= 0:
|
if currentNode.position[0] >= 0:
|
||||||
if currentNode.Y + 1 < len(self.matrix.matrix[0]):
|
if currentNode.position[1] + 1 < len(self.matrix.matrix[0]):
|
||||||
if self.matrix.matrix[currentNode.X][currentNode.Y + 1].walk_through == 1:
|
if self.matrix.matrix[currentNode.position[0]][currentNode.position[1] + 1].walk_through == 1:
|
||||||
children.append(self.matrix.matrix[currentNode.X][currentNode.Y + 1])
|
children.append(
|
||||||
if currentNode.Y - 1 >= 0:
|
self.matrix.matrix[currentNode.position[0]][currentNode.position[1] + 1])
|
||||||
if self.matrix.matrix[currentNode.X][currentNode.Y - 1].walk_through == 1:
|
if currentNode.position[1] - 1 >= 0:
|
||||||
children.append(self.matrix.matrix[currentNode.X][currentNode.Y - 1])
|
if self.matrix.matrix[currentNode.position[0]][currentNode.position[1] - 1].walk_through == 1:
|
||||||
|
children.append(
|
||||||
|
self.matrix.matrix[currentNode.position[0]][currentNode.position[1] - 1])
|
||||||
|
|
||||||
if currentNode.X + 1 < len(self.matrix.matrix):
|
if currentNode.position[0] + 1 < len(self.matrix.matrix):
|
||||||
if currentNode.Y + 1 < len(self.matrix.matrix[0]):
|
if currentNode.position[1] + 1 < len(self.matrix.matrix[0]):
|
||||||
if self.matrix.matrix[currentNode.X + 1][currentNode.Y + 1].walk_through == 1:
|
if self.matrix.matrix[currentNode.position[0] + 1][currentNode.position[1] + 1].walk_through == 1:
|
||||||
children.append(self.matrix.matrix[currentNode.X + 1][currentNode.Y + 1])
|
children.append(
|
||||||
if currentNode.Y - 1 >= 0:
|
self.matrix.matrix[currentNode.position[0] + 1][currentNode.position[1] + 1])
|
||||||
if self.matrix.matrix[currentNode.X + 1][currentNode.Y - 1].walk_through == 1:
|
if currentNode.position[1] - 1 >= 0:
|
||||||
children.append(self.matrix.matrix[currentNode.X + 1][currentNode.Y - 1])
|
if self.matrix.matrix[currentNode.position[0] + 1][currentNode.position[1] - 1].walk_through == 1:
|
||||||
if currentNode.Y >= 0:
|
children.append(
|
||||||
if self.matrix.matrix[currentNode.X + 1][currentNode.Y].walk_through == 1:
|
self.matrix.matrix[currentNode.position[0] + 1][currentNode.position[1] - 1])
|
||||||
children.append(self.matrix.matrix[currentNode.X + 1][currentNode.Y])
|
if currentNode.position[1] >= 0:
|
||||||
|
if self.matrix.matrix[currentNode.position[0] + 1][currentNode.position[1]].walk_through == 1:
|
||||||
|
children.append(
|
||||||
|
self.matrix.matrix[currentNode.position[0] + 1][currentNode.position[1]])
|
||||||
|
|
||||||
if currentNode.X - 1 >= 0:
|
if currentNode.position[0] - 1 >= 0:
|
||||||
if currentNode.Y + 1 < len(self.matrix.matrix[0]):
|
if currentNode.position[1] + 1 < len(self.matrix.matrix[0]):
|
||||||
if self.matrix.matrix[currentNode.X - 1][currentNode.Y + 1].walk_through == 1:
|
if self.matrix.matrix[currentNode.position[0] - 1][currentNode.position[1] + 1].walk_through == 1:
|
||||||
children.append(self.matrix.matrix[currentNode.X - 1][currentNode.Y + 1])
|
children.append(
|
||||||
if currentNode.Y - 1 >= 0:
|
self.matrix.matrix[currentNode.position[0] - 1][currentNode.position[1] + 1])
|
||||||
if self.matrix.matrix[currentNode.X - 1][currentNode.Y - 1].walk_through == 1:
|
if currentNode.position[1] - 1 >= 0:
|
||||||
children.append(self.matrix.matrix[currentNode.X - 1][currentNode.Y - 1])
|
if self.matrix.matrix[currentNode.position[0] - 1][currentNode.position[1] - 1].walk_through == 1:
|
||||||
if currentNode.Y >= 0:
|
children.append(
|
||||||
if self.matrix.matrix[currentNode.X - 1][currentNode.Y].walk_through == 1:
|
self.matrix.matrix[currentNode.position[0] - 1][currentNode.position[1] - 1])
|
||||||
children.append(self.matrix.matrix[currentNode.X - 1][currentNode.Y])
|
if currentNode.position[1] >= 0:
|
||||||
|
if self.matrix.matrix[currentNode.position[0] - 1][currentNode.position[1]].walk_through == 1:
|
||||||
|
children.append(
|
||||||
|
self.matrix.matrix[currentNode.position[0] - 1][currentNode.position[1]])
|
||||||
|
|
||||||
for child in children:
|
for child in children:
|
||||||
|
|
||||||
if child in closedList:
|
#child.parent = currentNode
|
||||||
|
|
||||||
|
for closedChild in closedList:
|
||||||
|
if child == closedChild:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
child.startCost = currentNode.startCost + 1
|
||||||
|
child.heuristic = ((child.position[0] - goalNode.position[0]) ** 2) + (
|
||||||
|
(child.position[1] - goalNode.position[1]) ** 2)
|
||||||
|
child.totalCost = child.startCost + child.heuristic
|
||||||
|
|
||||||
|
for openNode in openList:
|
||||||
|
|
||||||
|
if child == openNode and child.startCost >= openNode.startCost:
|
||||||
|
continue
|
||||||
|
|
||||||
|
#child.parent = currentNode
|
||||||
|
openList.append(child)
|
||||||
|
|
||||||
|
|
||||||
|
def getTotalCost(tile):
|
||||||
|
return tile.totalCost
|
||||||
|
Loading…
Reference in New Issue
Block a user