use rand::prelude::*;
use std::collections::HashSet;
fn main() {
// Dimensions du labyrinthe (doit être impair pour avoir des murs aux bords)
let width = 29;
let height = 19;
// Générer le labyrinthe
let maze = generate_maze(width, height);
// Afficher le labyrinthe
print_maze(&maze, width, height);
}
fn generate_maze(width: usize, height: usize) -> Vec<Vec<char>> {
// Initialiser le labyrinthe avec des murs partout
let mut maze = vec![vec!['#'; width]; height];
let mut rng = rand::thread_rng();
// Ensemble pour suivre les cellules visitées
let mut visited = HashSet::new();
// Pile pour l'algorithme DFS
let mut stack = Vec::new();
// Point de départ (coordonnées impaires)
let start_x = 1;
let start_y = 1;
// Marquer le point de départ comme un chemin
maze[start_y][start_x] = ' ';
visited.insert((start_x, start_y));
stack.push((start_x, start_y));
// Directions possibles: droite, bas, gauche, haut
let directions = [(2, 0), (0, 2), (-2, 0), (0, -2)];
// Tant que la pile n'est pas vide
while !stack.is_empty() {
let current = stack.last().unwrap().clone();
let (x, y) = current;
// Trouver les voisins non visités
let mut neighbors = Vec::new();
for (dx, dy) in directions.iter() {
let nx = (x as isize + dx) as usize;
let ny = (y as isize + dy) as usize;
// Vérifier si le voisin est dans les limites du labyrinthe
if nx > 0 && nx < width - 1 && ny > 0 && ny < height - 1
&& !visited.contains(&(nx, ny)) {
neighbors.push((nx, ny, *dx, *dy));
}
}
// S'il y a des voisins non visités
if !neighbors.is_empty() {
// Choisir un voisin au hasard
let (nx, ny, dx, dy) = neighbors[rng.gen_range(0..neighbors.len())];
// Creuser un passage
let wall_x = (x as isize + dx / 2) as usize;
let wall_y = (y as isize + dy / 2) as usize;
maze[wall_y][wall_x] = ' ';
// Marquer le voisin comme visité
maze[ny][nx] = ' ';
visited.insert((nx, ny));
// Pousser le nouveau voisin sur la pile
stack.push((nx, ny));
} else {
// Retour en arrière si aucun voisin non visité
stack.pop();
}
}
// Définir l'entrée et la sortie
maze[0][1] = ' '; // Entrée en haut
maze[height - 1][width - 2] = ' '; // Sortie en bas
maze
}
fn print_maze(maze: &Vec<Vec<char>>, width: usize, height: usize) {
for y in 0..height {
for x in 0..width {
print!("{}", maze[y][x]);
}
println!();
}
}
cargo.toml:
[dependencies]
rand = "0.8.5"
résultat:
$ cargo run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/maze_claudeia`
# ###########################
# # # # # #
# ####### # # # ### ##### # #
# # # # # # # #
### # ############### ### # #
# # # # # #
# ##### # ### ##### ### ### #
# # # # # # #
########### ### # ####### ###
# # # # # #
# ### ### ### ############# #
# # # # # # #
# # ### ######### ##### ### #
# # # # # # #
# ### ### # ### # ### ##### #
# # # # # # # # # #
# ### # ##### # ### # # # # #
# # # # # #
########################### #
Le widget 2D et la vue 3D OpenGL ne correspondaient pas : la direction des murs et des chemins était inversée.
J’ai modifié la classe qui s’occupe du rendu en OpenGL avec le signe – pour que les coordonnées des murs soient dessinées correctement. J’ai aussi modifié la position de la caméra. Donc -x à la place de x.
J’ai testé avec GNU_LINUX. Le résultat me convenait.
J’ai fabriqué un exécutable pour Windows 11 avec les dlls que l’exécutable a besoin pour fonctionner.

J’ai corrigé les erreurs de compilation.
Je devais récupérer le temps écoulé ElapsedTime.
J’ai utilisé une classe de QT6 : https://doc.qt.io/qt-6/qelapsedtimer.html.
Le programme QMAZEGEN fonctionne à nouveau.
Je vais continuer de le tester puis le mettre en ligne avec les fichiers source sur SourceForge.
Après certains tests réseaux j’ai découvert que le PC sous MX Linux avait un firewall après l’installation.
Je voulais supprimer le firewall et donc supprimer les règles iptables.
J’ai donc écrit ces commandes dans un script.
https://korben.info/comment-supprimer-toutes-les-regles-iptables.html
$cd /home
$ls
$cd ~
$sudo apt install nano mc
Update grub.
grub-mkconfig -o /boot/grub/grub.cfg



