mirror of
https://github.com/Fare-spec/cours.git
synced 2025-12-07 10:50:36 +00:00
164 lines
4.9 KiB
Python
164 lines
4.9 KiB
Python
import pygame
|
|
import random
|
|
import sys
|
|
|
|
# Paramètres de la grille
|
|
CELL_SIZE = 20 # Taille d'une cellule en pixels
|
|
COLS = 30 # Nombre de colonnes
|
|
ROWS = 30 # Nombre de lignes
|
|
WIDTH = COLS * CELL_SIZE
|
|
HEIGHT = ROWS * CELL_SIZE
|
|
|
|
# Couleurs
|
|
BLACK = (0, 0, 0)
|
|
WHITE = (255, 255, 255)
|
|
GRAY = (100, 100, 100)
|
|
GREEN = (0, 255, 0)
|
|
|
|
|
|
class Cell:
|
|
def __init__(self, i, j):
|
|
self.i = i # Numéro de la colonne
|
|
self.j = j # Numéro de la ligne
|
|
# Chaque cellule possède 4 murs, tous présents initialement
|
|
self.walls = {"top": True, "right": True, "bottom": True, "left": True}
|
|
self.visited = False
|
|
|
|
def draw(self, surface):
|
|
"""Dessine la cellule et ses murs sur la surface donnée."""
|
|
x = self.i * CELL_SIZE
|
|
y = self.j * CELL_SIZE
|
|
|
|
# Remplir la cellule (si visitée) AVANT de dessiner les murs
|
|
if self.visited:
|
|
pygame.draw.rect(surface, GRAY, (x, y, CELL_SIZE, CELL_SIZE))
|
|
|
|
# Dessiner les murs par-dessus la couleur de fond
|
|
if self.walls["top"]:
|
|
pygame.draw.line(surface, WHITE, (x, y), (x + CELL_SIZE, y))
|
|
if self.walls["right"]:
|
|
pygame.draw.line(
|
|
surface, WHITE, (x + CELL_SIZE, y), (x + CELL_SIZE, y + CELL_SIZE)
|
|
)
|
|
if self.walls["bottom"]:
|
|
pygame.draw.line(
|
|
surface, WHITE, (x + CELL_SIZE, y + CELL_SIZE), (x, y + CELL_SIZE)
|
|
)
|
|
if self.walls["left"]:
|
|
pygame.draw.line(surface, WHITE, (x, y + CELL_SIZE), (x, y))
|
|
|
|
|
|
def get_cell(i, j):
|
|
"""Retourne la cellule aux coordonnées (i, j) si elle existe."""
|
|
if 0 <= i < COLS and 0 <= j < ROWS:
|
|
return grid[i][j]
|
|
return None
|
|
|
|
|
|
def get_unvisited_neighbors(cell):
|
|
"""Retourne la liste des voisins non visités de la cellule donnée."""
|
|
neighbors = []
|
|
i, j = cell.i, cell.j
|
|
# Voisin du haut
|
|
top = get_cell(i, j - 1)
|
|
if top and not top.visited:
|
|
neighbors.append(top)
|
|
# Voisin de droite
|
|
right = get_cell(i + 1, j)
|
|
if right and not right.visited:
|
|
neighbors.append(right)
|
|
# Voisin du bas
|
|
bottom = get_cell(i, j + 1)
|
|
if bottom and not bottom.visited:
|
|
neighbors.append(bottom)
|
|
# Voisin de gauche
|
|
left = get_cell(i - 1, j)
|
|
if left and not left.visited:
|
|
neighbors.append(left)
|
|
|
|
return neighbors
|
|
|
|
|
|
def remove_walls(current, next_cell):
|
|
"""
|
|
Enlève les murs entre la cellule courante et le voisin sélectionné.
|
|
"""
|
|
dx = next_cell.i - current.i
|
|
dy = next_cell.j - current.j
|
|
if dx == 1: # Voisin à droite
|
|
current.walls["right"] = False
|
|
next_cell.walls["left"] = False
|
|
elif dx == -1: # Voisin à gauche
|
|
current.walls["left"] = False
|
|
next_cell.walls["right"] = False
|
|
elif dy == 1: # Voisin en bas
|
|
current.walls["bottom"] = False
|
|
next_cell.walls["top"] = False
|
|
elif dy == -1: # Voisin en haut
|
|
current.walls["top"] = False
|
|
next_cell.walls["bottom"] = False
|
|
|
|
|
|
def main():
|
|
global grid
|
|
pygame.init()
|
|
screen = pygame.display.set_mode((WIDTH, HEIGHT))
|
|
pygame.display.set_caption("Labyrinthe généré par DFS")
|
|
clock = pygame.time.Clock()
|
|
|
|
# Création de la grille : une matrice de cellules
|
|
grid = [[Cell(i, j) for j in range(ROWS)] for i in range(COLS)]
|
|
|
|
# Initialisation de l'algorithme DFS
|
|
current = grid[0][0] # Départ en haut à gauche
|
|
current.visited = True
|
|
stack = []
|
|
|
|
running = True
|
|
finished = False # Indique si la génération est terminée
|
|
|
|
while running:
|
|
clock.tick(60) # Limite à 60 images par seconde
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
running = False
|
|
|
|
# Exécution de l'algorithme DFS tant que la génération n'est pas terminée
|
|
if not finished:
|
|
neighbors = get_unvisited_neighbors(current)
|
|
if neighbors:
|
|
# Choix aléatoire d'un voisin non visité
|
|
next_cell = random.choice(neighbors)
|
|
stack.append(current)
|
|
remove_walls(current, next_cell)
|
|
current = next_cell
|
|
current.visited = True
|
|
elif stack:
|
|
# Revenir en arrière si aucun voisin n'est disponible
|
|
current = stack.pop()
|
|
else:
|
|
# Génération terminée
|
|
finished = True
|
|
|
|
# Affichage
|
|
screen.fill(BLACK)
|
|
# Dessiner toutes les cellules de la grille
|
|
for i in range(COLS):
|
|
for j in range(ROWS):
|
|
grid[i][j].draw(screen)
|
|
|
|
# Mettre en évidence la cellule courante (seulement si la génération est en cours)
|
|
if not finished:
|
|
x = current.i * CELL_SIZE
|
|
y = current.j * CELL_SIZE
|
|
pygame.draw.rect(screen, GREEN, (x, y, CELL_SIZE, CELL_SIZE))
|
|
|
|
pygame.display.flip()
|
|
|
|
pygame.quit()
|
|
sys.exit()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|