From 4b6117779f7166126af1ccf7154dc5ac445a04b1 Mon Sep 17 00:00:00 2001 From: eugenep Date: Sat, 10 Apr 2021 22:23:34 +0200 Subject: [PATCH] Add bfs path finding Co-authored-by: Marcin Matoga Co-authored-by: Sebastian Piotrowski Co-authored-by: Ladislaus3III --- grid.py | 12 +++--- main.py | 37 +++++++++++++++++ map.txt | 11 +++-- maze.py | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++ settings.py | 2 +- sprites.py | 84 +++++++++++++++++++++++++++++++++++-- 6 files changed, 249 insertions(+), 14 deletions(-) create mode 100644 maze.py diff --git a/grid.py b/grid.py index 4fac112..4aa4e13 100644 --- a/grid.py +++ b/grid.py @@ -1,7 +1,8 @@ -from copy import copy, deepcopy +#from copy import copy, deepcopy +""" class Grid: - #def __init__(self, width, height, locationGrid=[[]], graph={}, translationGrid)=: +def __init__(self, width, height, locationGrid=[[]], graph={}, translationGrid)=: def __init__(self, width, height): self.width = width self.heigth = height @@ -21,12 +22,12 @@ class Grid: def fillLocationGrid(self): pass - """self.locationGrid[0] = + self.locationGrid[0] = self.locationGrid[1] = self.locationGrid[2] = self.locationGrid[3] = self.locationGrid[4] = - self.locationGrid[5] = """ + self.locationGrid[5] = def printLocationGrid(self): @@ -52,4 +53,5 @@ class Grid: self.locationGrid[x][y] = value def setTranslationGridCell(self, x, y, value): - self.translationGrid[x][y] = value \ No newline at end of file + self.translationGrid[x][y] = value +""" \ No newline at end of file diff --git a/main.py b/main.py index 6e75c05..da404e0 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ import pygame as pg import sys import ctypes from os import path +from maze import * from grid import * from settings import * from sprites import * @@ -84,6 +85,38 @@ class Game: self.player.move(dy=-1, direction='Up') if event.key == pg.K_DOWN: self.player.move(dy=1, direction='Down') + if event.key == pg.K_F2: + self.player.maze.run() + self.player.parse_maze_moves() + self.i_like_to_move_it() + + def i_like_to_move_it(self): + for i in self.player.moves: + if i == 'Right': + self.player.move(dx=1, direction='Right') + + if i == 'Turn Right': + self.player.move(0, 0, direction='Right') + + if i == 'Left': + self.player.move(dx=-1, direction='Left') + + if i == 'Turn Left': + self.player.move(0, 0, direction='Left') + + if i == 'Down': + self.player.move(dy=1, direction='Down') + + if i == 'Turn Down': + self.player.move(0, 0, direction='Down') + + if i == 'Up': + self.player.move(dy=-1, direction='Up') + + if i == 'Turn Up': + self.player.move(0, 0, direction='Up') + + def show_start_screen(self): pass @@ -94,6 +127,10 @@ class Game: # create the game object g = Game() g.show_start_screen() + +#m = Maze() +#m.run() + while True: g.new() g.run() diff --git a/map.txt b/map.txt index c842675..8ac70b3 100644 --- a/map.txt +++ b/map.txt @@ -1,4 +1,7 @@ -.A.... -..222. -.222.. -...... \ No newline at end of file +.A..... +....... +....... +....... +....... +....2.. +....... diff --git a/maze.py b/maze.py new file mode 100644 index 0000000..3ce671a --- /dev/null +++ b/maze.py @@ -0,0 +1,117 @@ +import queue +from os import path + +class Maze: + def __init__(self): + self.maze = [] + self.moves = "" + + + + + + def loadMaze(self): + maze_folder = path.dirname(__file__) + with open(path.join(maze_folder, 'map.txt'), 'rt') as f: + for line in f: + self.maze.append(line) + return self.maze + + def printMaze(self, maze, path=""): + for x, pos in enumerate(maze[0]): + if pos == "A": + start = x + + i = start + j = 0 + pos = set() + for move in path: + if move == "L": + i -= 1 + + elif move == "R": + i += 1 + + elif move == "U": + j -= 1 + + elif move == "D": + j += 1 + pos.add((j,i)) + + for j, row in enumerate(maze): + for i, col in enumerate(row): + if (j, i) in pos: + print("+ ", end="") + else: + print(col + " ", end="") + print() + + def valid(self, maze, moves): + for x, pos in enumerate(maze[0]): + if pos == "A": + start = x + + i = start + j = 0 + for move in moves: + if move == "L": + i -= 1 + + elif move == "R": + i += 1 + + elif move == "U": + j -= 1 + + elif move == "D": + j += 1 + + if not(0 <= i < len(maze[0]) and 0 <= j < len(maze)): + return False + + + return True + + def findEnd(self, maze, moves): + for x, pos in enumerate(maze[0]): + if pos == "A": + start = x + + i = start + j = 0 + for move in moves: + if move == "L": + i -= 1 + + elif move == "R": + i += 1 + + elif move == "U": + j -= 1 + + elif move == "D": + j += 1 + + if maze[j][i] == "2": + print("Found: " + moves) + self.moves = moves + self.printMaze(maze, moves) + return True + + return False + + def run(self): + nums = queue.Queue() + nums.put("") + add = "" + self.loadMaze() + + while not self.findEnd(self.maze, add): + add = nums.get() + for j in ["L", "R", "U", "D"]: + put = add + j + if self.valid(self.maze, put): + nums.put(put) + + diff --git a/settings.py b/settings.py index 7a22523..3c9cf26 100644 --- a/settings.py +++ b/settings.py @@ -8,7 +8,7 @@ RED = (255, 0, 0) YELLOW = (255, 255, 0) # game settings -MAP_SIZE = 6 +MAP_SIZE = 7 TILESIZE = 100 WIDTH = TILESIZE * MAP_SIZE # 16 * 64 or 32 * 32 or 64 * 16 HEIGHT = TILESIZE * MAP_SIZE # 16 * 48 or 32 * 24 or 64 * 12 diff --git a/sprites.py b/sprites.py index 3e566ff..9dfda29 100644 --- a/sprites.py +++ b/sprites.py @@ -1,7 +1,9 @@ import pygame as pg import enum import ctypes +import ast from settings import * +from maze import * class Player(pg.sprite.Sprite): def __init__(self, game, x, y, direction = 'Right'): @@ -18,6 +20,8 @@ class Player(pg.sprite.Sprite): self.x = x self.y = y self.direction = direction + self.maze = Maze() + self.moves = '' def move(self, dx=0, dy=0, direction = ''): if direction == self.direction: @@ -25,7 +29,9 @@ class Player(pg.sprite.Sprite): if dx > 0: if self.check_border(dx): if self.collide_with_mines(dx): - ctypes.windll.user32.MessageBoxW(0, "Mine Ahead!", "Warning", 1) + #ctypes.windll.user32.MessageBoxW(0, "Mine Ahead!", "Warning", 1) + print("Mine Ahead!") + self.x += dx else: self.x += dx @@ -33,7 +39,9 @@ class Player(pg.sprite.Sprite): if dy < 0: if self.check_border(0, dy): if self.collide_with_mines(0, dy): - ctypes.windll.user32.MessageBoxW(0, "Mine Ahead!", "Warning", 1) + #ctypes.windll.user32.MessageBoxW(0, "Mine Ahead!", "Warning", 1) + print("Mine Ahead!") + self.y += dy else: self.y += dy @@ -41,7 +49,9 @@ class Player(pg.sprite.Sprite): if dy > 0: if self.check_border(0, dy): if self.collide_with_mines(0, dy): - ctypes.windll.user32.MessageBoxW(0, "Mine Ahead!", "Warning", 1) + #ctypes.windll.user32.MessageBoxW(0, "Mine Ahead!", "Warning", 1) + print("Mine Ahead!") + self.y += dy else: self.y += dy @@ -49,7 +59,9 @@ class Player(pg.sprite.Sprite): if dx < 0: if self.check_border(dx): if self.collide_with_mines(dx): - ctypes.windll.user32.MessageBoxW(0, "Mine Ahead!", "Warning", 1) + #ctypes.windll.user32.MessageBoxW(0, "Mine Ahead!", "Warning", 1) + print("Mine Ahead!") + self.x += dx else: self.x += dx @@ -78,6 +90,70 @@ class Player(pg.sprite.Sprite): return True return False + + """ + right = 1 + left = -1 + if self.self.moves[n+1] != 'R': + if self.moves[n+1] == 'U': + module.insert(n, 'Turn Up') + if self.moves[n+1] == 'L': + module.insert(n, 'Turn Left') + if self.moves[n+1] == 'D': + module.insert(n, 'Turn Down') + """ + + def parse_maze_moves(self): + self.moves = [char for char in self.maze.moves] + for n, i in enumerate(self.moves): + if i == 'R': + self.moves[n] = 'Right' + if n != len(self.moves)-1: + if i != self.moves[n+1]: + if self.moves[n+1] == 'D': + self.moves.insert(n+1, 'Turn Down') + if self.moves[n+1] == 'U': + self.moves.insert(n+1, 'Turn Up') + if self.moves[n+1] == 'L': + self.moves.insert(n+1, 'Turn Left') + else: + self.move(dx=-1, direction='Right') + if i == 'L': + self.moves[n] = 'Left' + if n != len(self.moves)-1: + if i != self.moves[n+1]: + if self.moves[n+1] == 'D': + self.moves.insert(n+1, 'Turn Down') + if self.moves[n+1] == 'U': + self.moves.insert(n+1, 'Turn Up') + if self.moves[n+1] == 'R': + self.moves.insert(n+1, 'Turn Right') + if i == 'D': + self.moves[n] = 'Down' + if n != len(self.moves)-1: + if i != self.moves[n+1]: + if self.moves[n+1] == 'R': + self.moves.insert(n+1, 'Turn Right') + if self.moves[n+1] == 'U': + self.moves.insert(n+1, 'Turn Up') + if self.moves[n+1] == 'L': + self.moves.insert(n+1, 'Turn Left') + if i == 'U': + self.moves[n] = 'Up' + if n != len(self.moves)-1: + if i != self.moves[n+1]: + if self.moves[n+1] == 'D': + self.moves.insert(n+1, 'Turn Down') + if self.moves[n+1] == 'R': + self.moves.insert(n+1, 'Turn Right') + if self.moves[n+1] == 'L': + self.moves.insert(n+1, 'Turn Left') + print(self.moves) + + + + + def update(self): self.rect.x = self.x * TILESIZE self.rect.y = self.y * TILESIZE