############################################################################################################################################################################################################################# INFO ############################################################################################################################################################################################################################# This file is part of the PyRat library.# It is meant to be used as a library, and not to be executed directly.# Please import necessary elements using the following syntax:# from pyrat import <element_name>"""This module provides a maze that is created by adding cells from the center of the maze.It extends ``RandomMaze`` to create a specific type of maze with holes distributed on the sides of the maze."""########################################################################################################################################################################################################################### IMPORTS ############################################################################################################################################################################################################################ PyRat importsfrompyrat.src.RandomMazeimportRandomMaze########################################################################################################################################################################################################################### CLASSES ###########################################################################################################################################################################################################################
[docs]classHolesOnSideRandomMaze(RandomMaze):""" *(This class inherits from* ``RandomMaze`` *).* With this maze, holes are distributed on the sides of the maze. The maze is created by adding cells from the center of the maze You can use this class to create a maze with this algorithm. However, if you just want to play a game, you can use the ``Game`` class instead, which will create a maze for you. Just make sure to set the ``random_maze_algorithm`` parameter to ``RandomMazeAlgorithm.HOLES_ON_SIDE`` when creating the game. """############################################################################################################################################## MAGIC METHODS ##############################################################################################################################################
[docs]def__init__(self,*args:object,**kwargs:object)->None:""" Initializes a new instance of the class. Args: *args: Arguments to pass to the parent constructor. **kwargs: Keyword arguments to pass to the parent constructor. """# Inherit from parent classsuper().__init__(*args,**kwargs)# Generate the mazeself._create_maze()
############################################################################################################################################## PROTECTED METHODS ##############################################################################################################################################def_add_cells(self)->None:""" *(This method redefines the method of the parent class with the same name).* It adds cells to the maze by starting from a full maze and removing cells one by one. """# Add cells from the middle of the mazevertices_to_add=[self.rc_to_i(self.get_height()//2,self.get_width()//2)]# Make some sort of breadth-first search to add cellswhileself.nb_vertices()<self._target_nb_vertices:# Get a random vertexvertex=vertices_to_add.pop(self._rng.randint(0,len(vertices_to_add)-1))# Add it if it is not already in the mazeifvertexinself.get_vertices():continueself.add_vertex(vertex)# Add neighborsrow,col=self.i_to_rc(vertex)if0<row<self.get_height():vertices_to_add.append(self.rc_to_i(row-1,col))if0<=row<self.get_height()-1:vertices_to_add.append(self.rc_to_i(row+1,col))if0<col<self.get_width():vertices_to_add.append(self.rc_to_i(row,col-1))if0<=col<self.get_width()-1:vertices_to_add.append(self.rc_to_i(row,col+1))# Connect the verticesfori,vertex_1inenumerate(self.get_vertices()):forj,vertex_2inenumerate(self.get_vertices(),i+1):ifself.coords_difference(vertex_1,vertex_2)in[(0,1),(1,0),(-1,0),(0,-1)]:self.add_edge(vertex_1,vertex_2)