This commit is contained in:
2025-02-04 08:49:09 +01:00
parent dcc8955763
commit c630b302d5

View File

@@ -1,20 +1,19 @@
import fifo
import random as rnd import random as rnd
import lifo
class Labyrinth: class Labyrinth:
def __init__(self, rows, cols) -> None: def __init__(self, rows, cols) -> None:
self.rows = rows self.rows = rows
self.cols = cols self.cols = cols
# Grille initiale : 1 = mur, 0 = chemin
self.grid = [[1 for _ in range(cols)] for _ in range(rows)] self.grid = [[1 for _ in range(cols)] for _ in range(rows)]
self.visited = [[False for _ in range(cols)]for _ in range(rows)]
self.stack = fifo.Pile()
self.queue = lifo.Queue()
self.start = None self.start = None
self.end = None self.end = None
def voisins(self, x, y): def voisins(self, x, y):
directions = [(0, 2), (0, -2), (2, 0), (-2, 0)] # Les déplacements par-dessus un mur """
Retourne les voisins valides (encore des murs) de la cellule (x, y).
"""
directions = [(0, 2), (0, -2), (2, 0), (-2, 0)]
voisins = [] voisins = []
for dx, dy in directions: for dx, dy in directions:
@@ -25,45 +24,49 @@ class Labyrinth:
return voisins return voisins
def casser_mur(self, x1, y1, x2, y2): def casser_mur(self, x1, y1, x2, y2):
mx, my = (x1 + x2) // 2, (y1 + y2) // 2 # Position du mur entre deux cellules """
self.grid[mx][my] = 0 # Le mur devient un chemin Casse le mur entre les cellules (x1, y1) et (x2, y2).
self.grid[x2][y2] = 0 # La cellule voisine devient aussi un chemin """
mx, my = (x1 + x2) // 2, (y1 + y2) // 2 # Coordonnées du mur à casser
self.grid[mx][my] = 0 # Transformer le mur en chemin
self.grid[x2][y2] = 0 # Transformer la cellule voisine en chemin
def est_mur(self, x, y):
return self.grid[y][x] == 1
def cell_type(self, x, y):
return self.grid[y][x]
def __str__(self) -> str:
return "\n".join("".join(" " if cell == 0 else "#" for cell in row) for row in self.grid)
def set_start_end(self, start, end):
self.start = start
self.end = end
def generate_maze(self): def generate_maze(self):
"""
Génère un labyrinthe parfait à l'aide de l'algorithme de Prim.
"""
# Choisir une cellule de départ aléatoire
x, y = rnd.randrange(0, self.rows, 2), rnd.randrange(0, self.cols, 2) x, y = rnd.randrange(0, self.rows, 2), rnd.randrange(0, self.cols, 2)
self.grid[x][y] = 0 self.grid[x][y] = 0 # Transformer la cellule en chemin
# Liste des murs candidats (voisins de la cellule initiale)
murs = self.voisins(x, y) murs = self.voisins(x, y)
while murs: while murs:
# Choisir un mur aléatoire
nx, ny = rnd.choice(murs) nx, ny = rnd.choice(murs)
murs.remove((nx, ny)) murs.remove((nx, ny))
# Trouver une cellule voisine qui est déjà un chemin
for dx, dy in [(-2, 0), (2, 0), (0, -2), (0, 2)]: for dx, dy in [(-2, 0), (2, 0), (0, -2), (0, 2)]:
cx, cy = nx + dx, ny + dy cx, cy = nx + dx, ny + dy
if 0 <= cx < self.rows and 0 <= cy < self.cols and self.grid[cx][cy] == 0: if 0 <= cx < self.rows and 0 <= cy < self.cols and self.grid[cx][cy] == 0:
# Casser le mur entre les deux cellules
self.casser_mur(cx, cy, nx, ny) self.casser_mur(cx, cy, nx, ny)
# Ajouter les nouveaux murs adjacents
murs.extend(self.voisins(nx, ny)) murs.extend(self.voisins(nx, ny))
break break
def set_start_end(self, start, end):
"""
Définit les points de départ et d'arrivée du labyrinthe.
"""
self.start = start
self.end = end
def solve(self): def __str__(self) -> str:
pass """
Représente le labyrinthe sous forme de chaîne de caractères.
"""
return "\n".join("".join(" " if cell == 0 else "#" for cell in row) for row in self.grid)