1st part AStar implementation
This commit is contained in:
parent
c227126bb2
commit
cdbc599d14
BIN
src/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
src/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
src/__pycache__/graphics.cpython-38.pyc
Normal file
BIN
src/__pycache__/graphics.cpython-38.pyc
Normal file
Binary file not shown.
BIN
src/__pycache__/matrix.cpython-38.pyc
Normal file
BIN
src/__pycache__/matrix.cpython-38.pyc
Normal file
Binary file not shown.
BIN
src/__pycache__/tile.cpython-38.pyc
Normal file
BIN
src/__pycache__/tile.cpython-38.pyc
Normal file
Binary file not shown.
BIN
src/__pycache__/waiter.cpython-38.pyc
Normal file
BIN
src/__pycache__/waiter.cpython-38.pyc
Normal file
Binary file not shown.
@ -4,16 +4,16 @@ import pygame
|
|||||||
class Graphics:
|
class Graphics:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.image = {
|
self.image = {
|
||||||
'floor': pygame.image.load('../resources/images/floor.jpg'),
|
'floor': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/floor.jpg'),
|
||||||
'wall': pygame.image.load('../resources/images/wall.png'), #
|
'wall': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/wall.png'), #
|
||||||
'bar': pygame.image.load('../resources/images/table3.png'), #
|
'bar': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/table3.png'), #
|
||||||
'bar_floor': pygame.image.load('../resources/images/waiter.png'),
|
'bar_floor': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/waiter.png'),
|
||||||
'table': pygame.image.load('../resources/images/table3.png'),
|
'table': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/table3.png'),
|
||||||
'waiter': pygame.image.load('../resources/images/waiter.png'),
|
'waiter': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/waiter.png'),
|
||||||
'chair_front': pygame.image.load('../resources/images/chair-front.png'), #
|
'chair_front': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/chair-front.png'), #
|
||||||
'chair_back': pygame.image.load('../resources/images/chair-back.png'), #
|
'chair_back': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/chair-back.png'), #
|
||||||
'chair_left': pygame.image.load('../resources/images/chair-left.png'), #
|
'chair_left': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/chair-left.png'), #
|
||||||
'chair_right': pygame.image.load('../resources/images/chair-right.png') #
|
'chair_right': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/chair-right.png') #
|
||||||
}
|
}
|
||||||
self.block_size = 50
|
self.block_size = 50
|
||||||
self.height = 15
|
self.height = 15
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from src.tile import Tile
|
from .tile import Tile
|
||||||
|
|
||||||
|
|
||||||
class Matrix:
|
class Matrix:
|
||||||
@ -13,10 +13,11 @@ class Matrix:
|
|||||||
|
|
||||||
for x in range(graphics.width):
|
for x in range(graphics.width):
|
||||||
for y in range(graphics.height):
|
for y in range(graphics.height):
|
||||||
self.matrix[x][y] = Tile(type_='floor')
|
self.matrix[x][y] = Tile('floor', x, y)
|
||||||
|
|
||||||
def set_default_restaurant(self, graphics):
|
def set_default_restaurant(self, graphics):
|
||||||
lines = [line.rstrip('\n') for line in open('../resources/simulations/simulation_1.txt')]
|
lines = [line.rstrip('\n') for line in open(
|
||||||
|
'/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/simulations/simulation_1.txt')]
|
||||||
symbols = {
|
symbols = {
|
||||||
'_': 'floor',
|
'_': 'floor',
|
||||||
'W': 'wall',
|
'W': 'wall',
|
||||||
@ -33,7 +34,7 @@ class Matrix:
|
|||||||
for x in range(graphics.width):
|
for x in range(graphics.width):
|
||||||
for y in range(graphics.height):
|
for y in range(graphics.height):
|
||||||
sign = lines[y][x]
|
sign = lines[y][x]
|
||||||
self.matrix[x][y] = Tile(symbols[sign])
|
self.matrix[x][y] = Tile(symbols[sign], x, y)
|
||||||
|
|
||||||
def get_type(self, x, y):
|
def get_type(self, x, y):
|
||||||
return self.matrix[x][y].type
|
return self.matrix[x][y].type
|
||||||
|
16
src/tile.py
16
src/tile.py
@ -1,6 +1,6 @@
|
|||||||
# TILE
|
# TILE
|
||||||
class Tile:
|
class Tile:
|
||||||
def __init__(self, type_):
|
def __init__(self, type_, x, y):
|
||||||
self.type = type_
|
self.type = type_
|
||||||
|
|
||||||
if self.type == 'wall':
|
if self.type == 'wall':
|
||||||
@ -15,3 +15,17 @@ class Tile:
|
|||||||
|
|
||||||
self.action_required = 0
|
self.action_required = 0
|
||||||
|
|
||||||
|
# Atrybuty niezbedne dla A*
|
||||||
|
self.position = (x, y)
|
||||||
|
self.parent = None
|
||||||
|
self.totalCost = 0 # Koszt totalny czyli dystans do wierzcholka startowego + heurystyka
|
||||||
|
self.startCost = 0 # Dystans do wierzcholka startowego
|
||||||
|
# Dystant do wierzcholka koncowego oszacowany za pomoca funkcji heurystyki
|
||||||
|
self.heuristic = 0
|
||||||
|
|
||||||
|
# Operator porownywania pol
|
||||||
|
def __eq__(self, other):
|
||||||
|
return True if (self.position == other.position) else False
|
||||||
|
|
||||||
|
|
||||||
|
# dodanie atrybutu x i y do klasy Tile
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import pygame
|
import pygame
|
||||||
|
|
||||||
from src.matrix import Matrix
|
from .matrix import Matrix
|
||||||
|
|
||||||
|
|
||||||
# WAITER
|
# WAITER
|
||||||
@ -11,6 +11,7 @@ class Waiter(pygame.sprite.Sprite):
|
|||||||
self.Y = 0
|
self.Y = 0
|
||||||
self.frame = 0
|
self.frame = 0
|
||||||
self.matrix = Matrix(graphics=graphics)
|
self.matrix = Matrix(graphics=graphics)
|
||||||
|
self.direction = 'E'
|
||||||
|
|
||||||
# Borders
|
# Borders
|
||||||
def move(self, x, y, graphics):
|
def move(self, x, y, graphics):
|
||||||
@ -21,12 +22,92 @@ class Waiter(pygame.sprite.Sprite):
|
|||||||
|
|
||||||
def update(self, event, graphics):
|
def update(self, event, graphics):
|
||||||
if event.type == pygame.KEYDOWN:
|
if event.type == pygame.KEYDOWN:
|
||||||
if event.key == pygame.K_LEFT:
|
|
||||||
self.move(-1, 0, graphics)
|
|
||||||
if event.key == pygame.K_RIGHT:
|
if event.key == pygame.K_RIGHT:
|
||||||
self.move(1, 0, graphics)
|
if self.direction == 'N':
|
||||||
|
self.direction = 'W'
|
||||||
|
elif self.direction == 'S':
|
||||||
|
self.direction = 'E'
|
||||||
|
elif self.direction == 'E':
|
||||||
|
self.direction = 'N'
|
||||||
|
elif self.direction == 'W':
|
||||||
|
self.direction = 'S'
|
||||||
|
if event.key == pygame.K_LEFT:
|
||||||
|
if self.direction == 'N':
|
||||||
|
self.direction = 'E'
|
||||||
|
elif self.direction == 'S':
|
||||||
|
self.direction = 'W'
|
||||||
|
elif self.direction == 'E':
|
||||||
|
self.direction = 'S'
|
||||||
|
elif self.direction == 'W':
|
||||||
|
self.direction = 'N'
|
||||||
if event.key == pygame.K_UP:
|
if event.key == pygame.K_UP:
|
||||||
self.move(0, -1, graphics)
|
if self.direction == 'N':
|
||||||
if event.key == pygame.K_DOWN:
|
self.move(0, 1, graphics)
|
||||||
self.move(0, 1, graphics)
|
if self.direction == 'S':
|
||||||
|
self.move(0, -1, graphics)
|
||||||
|
if self.direction == 'E':
|
||||||
|
self.move(1, 0, graphics)
|
||||||
|
if self.direction == 'W':
|
||||||
|
self.move(-1, 0, graphics)
|
||||||
print(self.X, self.Y)
|
print(self.X, self.Y)
|
||||||
|
|
||||||
|
# AStar
|
||||||
|
def findPath(self, goal):
|
||||||
|
#Stworzenie startowego i koncowego wierzcholka
|
||||||
|
startNode = self.matrix.matrix[self.X][self.Y]
|
||||||
|
goalNode = self.matrix.matrix[goal[0]][goal[1]]
|
||||||
|
|
||||||
|
#Inicjalizacja list
|
||||||
|
openList = []
|
||||||
|
closedList = []
|
||||||
|
|
||||||
|
openList.append(startNode)
|
||||||
|
|
||||||
|
while len(openList) > 0:
|
||||||
|
|
||||||
|
openList.sort(key=tile.totalCost)
|
||||||
|
currentNode = openList.pop(0)
|
||||||
|
closedList.append(currentNode)
|
||||||
|
|
||||||
|
if currentNode == goalNode:
|
||||||
|
pass
|
||||||
|
#Tutaj odbywac sie bedzie budowanie sciezki gdy algorytm osiagnie cel
|
||||||
|
|
||||||
|
children = []
|
||||||
|
if currentNode.X >= 0:
|
||||||
|
if currentNode.Y + 1 < len(self.matrix.matrix[0]):
|
||||||
|
if self.matrix.matrix[currentNode.X][currentNode.Y + 1].walk_through == 1:
|
||||||
|
children.append(self.matrix.matrix[currentNode.X][currentNode.Y + 1])
|
||||||
|
if currentNode.Y - 1 >= 0:
|
||||||
|
if self.matrix.matrix[currentNode.X][currentNode.Y - 1].walk_through == 1:
|
||||||
|
children.append(self.matrix.matrix[currentNode.X][currentNode.Y - 1])
|
||||||
|
|
||||||
|
if currentNode.X + 1 < len(self.matrix.matrix):
|
||||||
|
if currentNode.Y + 1 < len(self.matrix.matrix[0]):
|
||||||
|
if self.matrix.matrix[currentNode.X + 1][currentNode.Y + 1].walk_through == 1:
|
||||||
|
children.append(self.matrix.matrix[currentNode.X + 1][currentNode.Y + 1])
|
||||||
|
if currentNode.Y - 1 >= 0:
|
||||||
|
if self.matrix.matrix[currentNode.X + 1][currentNode.Y - 1].walk_through == 1:
|
||||||
|
children.append(self.matrix.matrix[currentNode.X + 1][currentNode.Y - 1])
|
||||||
|
if currentNode.Y >= 0:
|
||||||
|
if self.matrix.matrix[currentNode.X + 1][currentNode.Y].walk_through == 1:
|
||||||
|
children.append(self.matrix.matrix[currentNode.X + 1][currentNode.Y])
|
||||||
|
|
||||||
|
if currentNode.X - 1 >= 0:
|
||||||
|
if currentNode.Y + 1 < len(self.matrix.matrix[0]):
|
||||||
|
if self.matrix.matrix[currentNode.X - 1][currentNode.Y + 1].walk_through == 1:
|
||||||
|
children.append(self.matrix.matrix[currentNode.X - 1][currentNode.Y + 1])
|
||||||
|
if currentNode.Y - 1 >= 0:
|
||||||
|
if self.matrix.matrix[currentNode.X - 1][currentNode.Y - 1].walk_through == 1:
|
||||||
|
children.append(self.matrix.matrix[currentNode.X - 1][currentNode.Y - 1])
|
||||||
|
if currentNode.Y >= 0:
|
||||||
|
if self.matrix.matrix[currentNode.X - 1][currentNode.Y].walk_through == 1:
|
||||||
|
children.append(self.matrix.matrix[currentNode.X - 1][currentNode.Y])
|
||||||
|
|
||||||
|
for child in children:
|
||||||
|
|
||||||
|
if child in closedList:
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user