From cdbc599d14259bf8bd3a065839a57ddb535b2a1c Mon Sep 17 00:00:00 2001 From: Marcin Dobrowolski Date: Fri, 24 Apr 2020 16:14:58 +0200 Subject: [PATCH] 1st part AStar implementation --- src/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 173 bytes src/__pycache__/graphics.cpython-38.pyc | Bin 0 -> 2296 bytes src/__pycache__/matrix.cpython-38.pyc | Bin 0 -> 2021 bytes src/__pycache__/tile.cpython-38.pyc | Bin 0 -> 869 bytes src/__pycache__/waiter.cpython-38.pyc | Bin 0 -> 2786 bytes src/graphics.py | 20 ++--- src/matrix.py | 9 ++- src/tile.py | 16 +++- src/waiter.py | 95 ++++++++++++++++++++++-- 9 files changed, 118 insertions(+), 22 deletions(-) create mode 100644 src/__pycache__/__init__.cpython-38.pyc create mode 100644 src/__pycache__/graphics.cpython-38.pyc create mode 100644 src/__pycache__/matrix.cpython-38.pyc create mode 100644 src/__pycache__/tile.cpython-38.pyc create mode 100644 src/__pycache__/waiter.cpython-38.pyc diff --git a/src/__pycache__/__init__.cpython-38.pyc b/src/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b2fcf31293074e6ef966066491a1469e50775a3 GIT binary patch literal 173 zcmWIL<>g`k0=|a}<3RLd5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;x_eerR!OQL%n* zVo`EtUP^vaQGR)TPH}dozDsIxc1eDLen4eOMt+`ta8*fZa#dbpyk}lXYEEW)YF=_y qV!V-ok%4}3QL=t~d}dx|NqoFsLFFwDo80`A(wtN~kX@gFm;nGN)GT%Y literal 0 HcmV?d00001 diff --git a/src/__pycache__/graphics.cpython-38.pyc b/src/__pycache__/graphics.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af0895da7566e6c6e08663140d009c2514052bae GIT binary patch literal 2296 zcmcImyN=sN6rJHql=k7+Uc`1@2#{t4B&)@`NQxj>BnFH$LJ-3ZVVf9nMijLa$-P5C z79m$Q@&zeVtb;WBH>ugC+8;=fD)$aojGQ=~HN>1b^Wc5W%q1W1?e!RzpML-K*_U0$ z{-Dlgv9WWCReyjWndB)8*h3~QX}@C9erW|<@<*)iT;V($MueNi!pp zO=6WrQxTpVpBxWB>3j~6(t~6sVr<4~p2N|!h^r^t5Wf&EdrC$kI@`96RE--ywiql(;)zj$_uDmxH*n~X1@=fl z&_xKFQP&)f+H3YO*fFsVO{{}n)1jEGIoZBmWOQ7eU~0I!L9ma|@77+ijKxgVuDLq3 zljcI!y-}J+XQ56iReKXf*46GJk>#ZB$V3;ZSO&gUWjMbn0ekw@3(NE@(>r`Ysm#7`D4|JykFBWhVQRCQ789Gr+4M`GzI2Q?@ILZ?oVm1(3viD{ z?-J1A+A!aZQYGM19MooKd9~l#YNpt0CrXPy$@4a4)fNShhBP2%a_0zM|7bH1U?=%uX#a+r+LK7!BvTYlHK a&1l~O8Z-QDuh#z8jqY#g&%s2_xBmuVfPAz7 literal 0 HcmV?d00001 diff --git a/src/__pycache__/matrix.cpython-38.pyc b/src/__pycache__/matrix.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d25964548a24e1c8386dbb212202cf61540f6d73 GIT binary patch literal 2021 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 literal 0 HcmV?d00001 diff --git a/src/graphics.py b/src/graphics.py index b8d7781..b593205 100644 --- a/src/graphics.py +++ b/src/graphics.py @@ -4,16 +4,16 @@ import pygame class Graphics: def __init__(self): self.image = { - 'floor': pygame.image.load('../resources/images/floor.jpg'), - 'wall': pygame.image.load('../resources/images/wall.png'), # - 'bar': pygame.image.load('../resources/images/table3.png'), # - 'bar_floor': pygame.image.load('../resources/images/waiter.png'), - 'table': pygame.image.load('../resources/images/table3.png'), - 'waiter': pygame.image.load('../resources/images/waiter.png'), - 'chair_front': pygame.image.load('../resources/images/chair-front.png'), # - 'chair_back': pygame.image.load('../resources/images/chair-back.png'), # - 'chair_left': pygame.image.load('../resources/images/chair-left.png'), # - 'chair_right': pygame.image.load('../resources/images/chair-right.png') # + 'floor': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/floor.jpg'), + 'wall': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/wall.png'), # + 'bar': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/table3.png'), # + 'bar_floor': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/waiter.png'), + 'table': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/table3.png'), + 'waiter': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/waiter.png'), + 'chair_front': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/chair-front.png'), # + 'chair_back': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/chair-back.png'), # + 'chair_left': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/chair-left.png'), # + 'chair_right': pygame.image.load('/Users/marcindobrowolski/Desktop/Python/Sztuczna_Inteligencja_2020/resources/images/chair-right.png') # } self.block_size = 50 self.height = 15 diff --git a/src/matrix.py b/src/matrix.py index bd74866..f262245 100644 --- a/src/matrix.py +++ b/src/matrix.py @@ -1,4 +1,4 @@ -from src.tile import Tile +from .tile import Tile class Matrix: @@ -13,10 +13,11 @@ class Matrix: for x in range(graphics.width): 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): - 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 = { '_': 'floor', 'W': 'wall', @@ -33,7 +34,7 @@ class Matrix: for x in range(graphics.width): for y in range(graphics.height): 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): return self.matrix[x][y].type diff --git a/src/tile.py b/src/tile.py index 25f107b..56273a9 100644 --- a/src/tile.py +++ b/src/tile.py @@ -1,6 +1,6 @@ # TILE class Tile: - def __init__(self, type_): + def __init__(self, type_, x, y): self.type = type_ if self.type == 'wall': @@ -15,3 +15,17 @@ class Tile: 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 diff --git a/src/waiter.py b/src/waiter.py index b6e1de5..f0fa5f8 100644 --- a/src/waiter.py +++ b/src/waiter.py @@ -1,6 +1,6 @@ import pygame -from src.matrix import Matrix +from .matrix import Matrix # WAITER @@ -11,6 +11,7 @@ class Waiter(pygame.sprite.Sprite): self.Y = 0 self.frame = 0 self.matrix = Matrix(graphics=graphics) + self.direction = 'E' # Borders def move(self, x, y, graphics): @@ -21,12 +22,92 @@ class Waiter(pygame.sprite.Sprite): def update(self, event, graphics): if event.type == pygame.KEYDOWN: - if event.key == pygame.K_LEFT: - self.move(-1, 0, graphics) 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: - self.move(0, -1, graphics) - if event.key == pygame.K_DOWN: - self.move(0, 1, graphics) + if self.direction == 'N': + 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) + + # 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 + + +