Labyrinthe avec langage c

halim_zidoune 2 Messages postés mercredi 17 mai 2017Date d'inscription 4 juin 2017 Dernière intervention - 17 mai 2017 à 15:19 - Dernière réponse : halim_zidoune 2 Messages postés mercredi 17 mai 2017Date d'inscription 4 juin 2017 Dernière intervention
- 4 juin 2017 à 13:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

http://codes-sources.commentcamarche.net/source/101975-labyrinthe-avec-langage-c

Afficher la suite 
cptpingu 3778 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 15 février 2018 Dernière intervention - 18 mai 2017 à 11:33
Bonjour.

Pas mal de soucis dans ce code:
  • Aucun explication. Le code est balancé sans commentaires, sans explication de l'algo, ce qui est un peu dommage dans une section où l'on est censé expliqué comment ça fonctionne !
  • Quand on compile le code, ça génère *beaucoup* de warnings (et pas mal d'erreurs aussi) !
  • C'est du C, mais ça a sûrement du être compilé avec du C++ (par exemple les // n'existe pas en C).
  • Les fonctions ne sont pas dans le bon ordre, ça ne compile pas chez moi (j'ai du inverser l'ordre).
  • En C ansi, il n'est pas possible d'initialiser une matrice avec des variables (il faut des constantes ou des macros). En C99, c'est possible, mais je suppose que tu veux faire du C ansi, car tu pré-déclares toutes variables en début de fonctions, ce qui n'est nécessaire qu'en ancien C...
  • Au lieu de "puiss", utilise "pow" qui est dans math.h
  • Il manque le header: time.h
  • Plutôt que des matrices de int, utilise des matrices de char, c'est plus petit et en plus tu aurais pu mettre directement ' ' ou '#' ce qui t'aurait facilité l'affichage pour après.
  • Tu fais des tests inutiles, par exemple: "int a= (rand() % 3);" suivi de "if (a!=3)", "a" ne sera jamais égale à 3, donc cette condition sera toujours vraie.
  • Tu appelles srand au milieu de ta fonction, alors que srand ne doit être appelé qu'une seule fois au début de ton main. Comme tu relances le "seed" du random à chaque tour, ce n'est plus très aléatoire, et tous tes morceaux de grille se ressemblent ! (Juste en déplaçant srand, on obtient immédiatement de meilleures grilles).
  • Si on modifie, n, p ou k, le programme peut planter ! (Si on veut agrandir la grille, alors celle-ci n'est plus rempli entièrement, si on la rétrécit le programme plante). k devrait être calculé en fonction de n et p. De plus, on est obligé de créer un carré, car il y a une mauvaise interdépendence entre tes dimensions.
  • Que viennent faire les puissances dans ce code ? Pourquoi ne pas calculer tes "centres" en utilisant tout simplement "(a + b) / 2" et en modifiant des pivots pour les bornes ?



Au niveau fonctionnelle:
Ça n'a pas l'air d'une génération de labyrinthe, mais plutôt une manière de poser des murs récursivement. Tu découpes les espaces en 4, puis redécoupe ces espaces à nouveaux en 4, etc... Tu poses ensuite aléatoirement des murs. Le souci, c'est que ça ne génère pas vraiment un labyrinthe, juste une carte avec des murs... Pour générer un vrai labyrinthe, il faut utiliser des systèmes de portes, et s'assurer que celui-ci ne possède qu'un seul chemin valable entre l'entrée et la sortie.
Pour un bon code dessus, bien expliqué, et clair, plutôt voir ici:
http://ilay.org/yann/articles/maze/

Je déconseille le code qui a été posté ici, et conseille plutôt vivement le lien proposé.
halim_zidoune 2 Messages postés mercredi 17 mai 2017Date d'inscription 4 juin 2017 Dernière intervention > cptpingu 3778 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 15 février 2018 Dernière intervention - 4 juin 2017 à 13:29
la solution proposé permet d’engendrer
des grilles carrées de taille (2 puissance k) + 1 :
– On découpe la grille en quatre zones carrées de même
taille.
– Dans trois des quatre murs de séparation (choisis
aléatoirement), on creuse un trou `a une position impaire.
– On recommence récursivement pour chacun des
quatre carrés.
Commenter la réponse de halim_zidoune

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.