From 43033b966181d3976f7d17e9556ef3a00deb5cf4 Mon Sep 17 00:00:00 2001 From: alinanto Date: Sat, 18 Jul 2020 13:04:25 +0530 Subject: [PATCH 1/6] Added : set start and end point manually, randomize position while resetting. --- Pathfinder.py | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/Pathfinder.py b/Pathfinder.py index cbcdca1..b43a561 100644 --- a/Pathfinder.py +++ b/Pathfinder.py @@ -5,6 +5,8 @@ from pygame.locals import ( K_BACKSPACE, K_RETURN, + K_e, + K_s, KEYDOWN, MOUSEBUTTONUP, MOUSEBUTTONDOWN, @@ -42,6 +44,13 @@ def __lt__(self, other_cell): def setup(): + global start_coords, end_coords + start_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) + end_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) + + while start_coords == end_coords: + end_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) + screen.fill(BLACK) pygame.display.set_caption("Pathfinder") @@ -57,6 +66,7 @@ def initialize_matrix(): def draw_grid(): global start_coords, end_coords + screen.fill(BLACK) MARGIN = 1 DIMENSION = (WINDOW_WIDTH - MARGIN * NUMBER_OF_COLUMNS) // NUMBER_OF_COLUMNS @@ -67,12 +77,7 @@ def draw_grid(): pygame.draw.rect(screen, WHITE, rect) matrix[x][y] = Cell(rect.copy(), False, np.inf, (x, y)) - start_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) - end_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) - while start_coords == end_coords: - end_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) - start_cell = matrix[start_coords[0]][start_coords[1]] end_cell = matrix[end_coords[0]][end_coords[1]] @@ -186,9 +191,10 @@ def find_path(): screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) matrix = None + start_coords = None end_coords = None - + setup() pygame.init() @@ -213,7 +219,23 @@ def find_path(): if event.type == KEYDOWN: if event.key == K_RETURN: find_path() + if event.key == K_s: + position = pygame.mouse.get_pos() + col = position[0] // 10 + row = position[1] // 10 + start_coords = (row,col) + initialize_matrix() + draw_grid() + if event.key == K_e: + position = pygame.mouse.get_pos() + col = position[0] // 10 + row = position[1] // 10 + end_coords = (row,col) + initialize_matrix() + draw_grid() + + if event.key == K_BACKSPACE: setup() -pygame.quit() \ No newline at end of file +pygame.quit() From d14d42c2573b9efce97c85cc51ccd1e90ab6f28a Mon Sep 17 00:00:00 2001 From: alinanto Date: Sat, 18 Jul 2020 13:17:57 +0530 Subject: [PATCH 2/6] fixed bug : overlapping start and end coordinates while setting manually --- Pathfinder.py | 64 +++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Pathfinder.py b/Pathfinder.py index b43a561..b2c4bc0 100644 --- a/Pathfinder.py +++ b/Pathfinder.py @@ -23,7 +23,7 @@ def __init__(self, figure, is_wall, distance_from_start, coords, visited=False, self.coords = coords self.visited = visited self.predecessor = predecessor - + def __lt__(self, other_cell): return self.distance_from_start < other_cell.distance_from_start @@ -47,10 +47,10 @@ def setup(): global start_coords, end_coords start_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) end_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) - + while start_coords == end_coords: end_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) - + screen.fill(BLACK) pygame.display.set_caption("Pathfinder") @@ -60,10 +60,8 @@ def setup(): def initialize_matrix(): global matrix - matrix = np.empty((NUMBER_OF_ROWS, NUMBER_OF_COLUMNS), dtype=Cell) - def draw_grid(): global start_coords, end_coords screen.fill(BLACK) @@ -76,8 +74,8 @@ def draw_grid(): rect = pygame.Rect((MARGIN + DIMENSION) * y + MARGIN, (MARGIN + DIMENSION) * x + MARGIN, DIMENSION, DIMENSION) pygame.draw.rect(screen, WHITE, rect) matrix[x][y] = Cell(rect.copy(), False, np.inf, (x, y)) - - + + start_cell = matrix[start_coords[0]][start_coords[1]] end_cell = matrix[end_coords[0]][end_coords[1]] @@ -89,7 +87,7 @@ def draw_grid(): matrix[start_coords[0]][start_coords[1]] = Cell(start_rect.copy(), True, 0, start_coords, visited=True) matrix[end_coords[0]][end_coords[1]] = Cell(end_rect.copy(), False, np.inf, end_coords) - + pygame.display.update() @@ -105,7 +103,7 @@ def mark_as_wall(): matrix[row][col].is_wall = True rect = matrix[row][col].figure pygame.draw.rect(screen, BLACK, rect) - + pygame.display.update() @@ -121,9 +119,9 @@ def mark_as_visited(cell, distance, predecessor): pygame.draw.rect(screen, YELLOW, rect) pygame.display.update() - + return False - + return True @@ -145,10 +143,10 @@ def find_path(): start = matrix[start_coords[0]][start_coords[1]] queue = [start] found = True - + while queue: most_near = heapq.heappop(queue) - + if most_near.distance_from_start == np.inf: found = False break @@ -164,7 +162,7 @@ def find_path(): if mark_as_visited(above, new_distance, most_near): break heapq.heappush(queue, above) - + if below and not below.is_wall and not below.visited: if mark_as_visited(below, new_distance, most_near): break @@ -175,26 +173,26 @@ def find_path(): break heapq.heappush(queue, right) - if left and not left.is_wall and not left.visited: + if left and not left.is_wall and not left.visited: if mark_as_visited(left, new_distance, most_near): break heapq.heappush(queue, left) - + if all(value for value in [above != None, below != None, right != None, left != None]): if all(value for value in [above.is_wall, below.is_wall, right.is_wall, left.is_wall]): return - + if found: highlight_path() - + screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) matrix = None start_coords = None end_coords = None - + setup() pygame.init() @@ -206,16 +204,16 @@ def find_path(): for event in pygame.event.get(): if event.type == QUIT: running = False - + if event.type == MOUSEBUTTONDOWN: dragging = True - + if dragging and event.type == MOUSEMOTION: mark_as_wall() - + if event.type == MOUSEBUTTONUP: dragging = False - + if event.type == KEYDOWN: if event.key == K_RETURN: find_path() @@ -223,19 +221,21 @@ def find_path(): position = pygame.mouse.get_pos() col = position[0] // 10 row = position[1] // 10 - start_coords = (row,col) - initialize_matrix() - draw_grid() + if end_coords != (row,col) : + start_coords = (row,col) + screen.fill(BLACK) + initialize_matrix() + draw_grid() if event.key == K_e: position = pygame.mouse.get_pos() col = position[0] // 10 row = position[1] // 10 - end_coords = (row,col) - initialize_matrix() - draw_grid() - - + if start_coords != (row,col) : + end_coords = (row,col) + screen.fill(BLACK) + initialize_matrix() + draw_grid() if event.key == K_BACKSPACE: setup() - + pygame.quit() From 75bd7b1e23ab7bc8a6677c66fd437e7d6c6bcc0c Mon Sep 17 00:00:00 2001 From: alinanto Date: Sat, 18 Jul 2020 13:28:28 +0530 Subject: [PATCH 3/6] optimised redrawing --- Pathfinder.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Pathfinder.py b/Pathfinder.py index b2c4bc0..2fe2eb1 100644 --- a/Pathfinder.py +++ b/Pathfinder.py @@ -51,7 +51,6 @@ def setup(): while start_coords == end_coords: end_coords = (np.random.randint(0, NUMBER_OF_ROWS), np.random.randint(0, NUMBER_OF_COLUMNS)) - screen.fill(BLACK) pygame.display.set_caption("Pathfinder") initialize_matrix() @@ -223,7 +222,6 @@ def find_path(): row = position[1] // 10 if end_coords != (row,col) : start_coords = (row,col) - screen.fill(BLACK) initialize_matrix() draw_grid() if event.key == K_e: @@ -232,9 +230,8 @@ def find_path(): row = position[1] // 10 if start_coords != (row,col) : end_coords = (row,col) - screen.fill(BLACK) initialize_matrix() - draw_grid() + draw_grid() if event.key == K_BACKSPACE: setup() From 2e5f1f32de273b9da0ff692acb7568f72f134081 Mon Sep 17 00:00:00 2001 From: Alin Anto Date: Sat, 18 Jul 2020 13:42:54 +0530 Subject: [PATCH 4/6] Added new features to readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 38dfbb1..398dc59 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,11 @@ This is my first experiment with pygame, I made a pathfinding viewer that use Di ## How to use it: - To run it, after you go in the same directory of the project, write in the console: `python3 Pathfinder.py` - To make walls: drag with cursor on the grid -- To reset the grid: press **backspace** +- To reset the grid with random starting and ending points: press **backspace** - To execute the algorithm: press **enter** +- To set the mouse position as starting point: press **s** +- To set the mouse position as ending point: press **e** + ## How it looks: ![Image of how it looks](https://i.imgur.com/OiGjh21.png) From c92071595f28f7c292b39ff079fa15c7582a2b69 Mon Sep 17 00:00:00 2001 From: alinanto Date: Sat, 18 Jul 2020 14:15:44 +0530 Subject: [PATCH 5/6] Change the demo image --- image.PNG | Bin 0 -> 59143 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 image.PNG diff --git a/image.PNG b/image.PNG new file mode 100644 index 0000000000000000000000000000000000000000..c8fed101a7c1b06f67ba55f76117e390ed964ea6 GIT binary patch literal 59143 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 Date: Sat, 18 Jul 2020 14:18:46 +0530 Subject: [PATCH 6/6] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 398dc59..27c7389 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,4 @@ This is my first experiment with pygame, I made a pathfinding viewer that use Di ## How it looks: -![Image of how it looks](https://i.imgur.com/OiGjh21.png) +![Demo image](https://github.com/alinanto/Pathfinder/blob/master/image.PNG)