├── .gitignore ├── LICENSE ├── README.md ├── main.py ├── requirements.txt └── screenshot └── 0.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 StanislavPetrovV 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python-Maze-Generator 2 | Based on Recursive Backtracker algo 3 | 4 | ![maze](screenshot/0.png "maze") 5 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | from random import choice 3 | 4 | RES = WIDTH, HEIGHT = 1202, 902 5 | TILE = 50 6 | cols, rows = WIDTH // TILE, HEIGHT // TILE 7 | 8 | pygame.init() 9 | sc = pygame.display.set_mode(RES) 10 | clock = pygame.time.Clock() 11 | 12 | 13 | class Cell: 14 | def __init__(self, x, y): 15 | self.x, self.y = x, y 16 | self.walls = {'top': True, 'right': True, 'bottom': True, 'left': True} 17 | self.visited = False 18 | 19 | def draw_current_cell(self): 20 | x, y = self.x * TILE, self.y * TILE 21 | pygame.draw.rect(sc, pygame.Color('saddlebrown'), (x + 2, y + 2, TILE - 2, TILE - 2)) 22 | 23 | def draw(self): 24 | x, y = self.x * TILE, self.y * TILE 25 | if self.visited: 26 | pygame.draw.rect(sc, pygame.Color('black'), (x, y, TILE, TILE)) 27 | 28 | if self.walls['top']: 29 | pygame.draw.line(sc, pygame.Color('darkorange'), (x, y), (x + TILE, y), 3) 30 | if self.walls['right']: 31 | pygame.draw.line(sc, pygame.Color('darkorange'), (x + TILE, y), (x + TILE, y + TILE), 3) 32 | if self.walls['bottom']: 33 | pygame.draw.line(sc, pygame.Color('darkorange'), (x + TILE, y + TILE), (x , y + TILE), 3) 34 | if self.walls['left']: 35 | pygame.draw.line(sc, pygame.Color('darkorange'), (x, y + TILE), (x, y), 3) 36 | 37 | def check_cell(self, x, y): 38 | find_index = lambda x, y: x + y * cols 39 | if x < 0 or x > cols - 1 or y < 0 or y > rows - 1: 40 | return False 41 | return grid_cells[find_index(x, y)] 42 | 43 | def check_neighbors(self): 44 | neighbors = [] 45 | top = self.check_cell(self.x, self.y - 1) 46 | right = self.check_cell(self.x + 1, self.y) 47 | bottom = self.check_cell(self.x, self.y + 1) 48 | left = self.check_cell(self.x - 1, self.y) 49 | if top and not top.visited: 50 | neighbors.append(top) 51 | if right and not right.visited: 52 | neighbors.append(right) 53 | if bottom and not bottom.visited: 54 | neighbors.append(bottom) 55 | if left and not left.visited: 56 | neighbors.append(left) 57 | return choice(neighbors) if neighbors else False 58 | 59 | 60 | def remove_walls(current, next): 61 | dx = current.x - next.x 62 | if dx == 1: 63 | current.walls['left'] = False 64 | next.walls['right'] = False 65 | elif dx == -1: 66 | current.walls['right'] = False 67 | next.walls['left'] = False 68 | dy = current.y - next.y 69 | if dy == 1: 70 | current.walls['top'] = False 71 | next.walls['bottom'] = False 72 | elif dy == -1: 73 | current.walls['bottom'] = False 74 | next.walls['top'] = False 75 | 76 | 77 | grid_cells = [Cell(col, row) for row in range(rows) for col in range(cols)] 78 | current_cell = grid_cells[0] 79 | stack = [] 80 | colors, color = [], 40 81 | 82 | while True: 83 | sc.fill(pygame.Color('darkslategray')) 84 | 85 | for event in pygame.event.get(): 86 | if event.type == pygame.QUIT: 87 | exit() 88 | 89 | [cell.draw() for cell in grid_cells] 90 | current_cell.visited = True 91 | current_cell.draw_current_cell() 92 | [pygame.draw.rect(sc, colors[i], (cell.x * TILE + 2, cell.y * TILE + 2, 93 | TILE - 4, TILE - 4)) for i, cell in enumerate(stack)] 94 | 95 | next_cell = current_cell.check_neighbors() 96 | if next_cell: 97 | next_cell.visited = True 98 | stack.append(current_cell) 99 | colors.append((min(color, 255), 10, 100)) 100 | color += 1 101 | remove_walls(current_cell, next_cell) 102 | current_cell = next_cell 103 | elif stack: 104 | current_cell = stack.pop() 105 | 106 | pygame.display.flip() 107 | clock.tick(30) 108 | 109 | 110 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pygame 2 | -------------------------------------------------------------------------------- /screenshot/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StanislavPetrovV/Python-Maze-Generator/755a0ddb0f5c70afabda88d8750ef8ee949dc010/screenshot/0.png --------------------------------------------------------------------------------