Génération automatique de labyrinthes – Algorithme “Growing Tree”

Table des matières

Table des matières. 2

Résumé. 3

Introduction. 4

Histoire et définitions. 5

Définitions et Étymologie. 5

Histoire. 5

Labyrinthes et Mathématiques. 6

Traduction d’un labyrinthe en modèle mathématique. 6

Déduction d’une logique informatique d’après l’arbre. 7

Labyrinthes et Algorithme. 8

Conception de l’algorithme. 8

Illustrations de l’algorithme. 9

Déroulement dynamique : 9

Déroulement statique : 10

Algorithme et implémentation. 11

Écriture de l’algorithme. 11

Implémentation de l’algorithme. 12

Étape 1 : Déclaration des différentes variables. 12

Étape 2 : établir les fonctions pour utiliser le canevas. 13

Étape 3 : création du labyrinthe. 14

Étape 4 : fonction permettant d’appeler les différentes parties du code. 16

Étape 5 : appel de la fonction d’initialisation pour créer le labyrinthe. 16

Aller plus loin. 17

Algorithme de résolution du labyrinthe. 17

D’autres labyrinthes obtenus à partir d’algorithmes. 17

Bibliographie. 19

 

Résumé

The Growing Tree Algorithm is an implementation of different mathematical approaches about labyrinths. 2D labyrinth can be imagined as a matrix and each of whose squares would be a labyrinth coordinate. The Growing Tree Algorithm use a search system based on a recursive model of research. So, he is able to find and save all available positions around the starting square and determinate way through the matrix.  During the execution of the algorithm, the coordinates of the neighbouring cells available are stored in memory of a stack of coordinates thus memorising the path to follow. Once the algorithm no finds neighbouring free cells, it retrieves the coordinates of previously saved squares in order to use them to define the path to follow in the matrix. Finally, once the execution of the algorithm is complete, no more cells remain unused and the labyrinth is completely finished. It only remains to find the way to cross it.   The principle of the algorithm remains simple to understand: It works in the same way as the branches of a tree that grows, hence the name of the algorithm « Growing Tree ». The different directions and ramifications of the branches of the tree can thus be transposed to the path traversing the labyrinth. Each path is a branch and each wall of the labyrinth is the space between the different branches.  The various types of implementations of the « Growing Tree Algorithm » make it possible to create different types of labyrinths such a perfect labyrinth, imperfect labyrinths or symmetrical labyrinths.

 

 

Introduction

Depuis la nuit des temps, les labyrinthes entourent notre monde et sont à l’origine de nombreux mythes ou encore utilisations anciennes. Dans l’Égypte antique, la quasi-totalité de l’intérieur des pyramides est constitué de galeries construites sur des modèles simplifiés de labyrinthes. La pyramide de Khéops [1] datant de -2560 av. J.-C. est un l’un des monuments les plus marquants de l’utilisation d’un labyrinthe aux vues de la complexité de l’ensemble des galeries qu’elle renferme.

De plus, dans la mythologie, de nombreux récits font état de labyrinthes tels que la conception du Tartare [2], qui n’est d’autre que la « prison des Dieux déchus ». Il aurait été construit de l’intérieur vers l’extérieur au plus profond des Enfers empêchant ainsi une cartographie précise de celui-ci évitant ainsi que les prisonniers ne puissent s’en échapper.

Comme vous l’avez compris, de nombreux types de labyrinthes ainsi que de nombreuses utilisations de celui-ci existent et peuvent être quasi sans limites. Du simple labyrinthe en deux dimensions classiques, nous pouvons imaginer différents casse-têtes à base de labyrinthes sur plusieurs étages, ou encore un labyrinthe en trois dimensions représenté sous forme de cube. Nous pouvons, en plus de ces différents types « classiques » de labyrinthes, imaginer des labyrinthes symétriques, sous formes géométriques telles que les cercles ou les losanges ou encore un mélange de toutes ces différentes caractéristiques rendant la conception du labyrinthe plus complexe.

Dans cet article, nous verrons plus en détail ce qu’est un labyrinthe, notamment la définition du mot « labyrinthe » ainsi que son étymologie et l’origine de sa conception, les différentes utilisations de labyrinthes au cours de l’Histoire et les différents modèles existants.

D’un point de vue informatique, nous verrons quelles liaisons nous pouvons faire entre sa conception aléatoire et comment la schématiser mathématiquement, avant de pouvoir créer un algorithme permettant d’effectuer la création automatiquement de celui-ci.

Nous détaillerons également le déroulement de l’algorithme « Growing Tree » utilisé pour créer automatiquement les labyrinthes, ainsi que les différentes méthodes d’implémentations de celui-ci qui tendent vers des résultats de labyrinthes bien différents plus originaux les uns que les autres.

 

 

Histoire et définitions

Définitions et Étymologie

Le terme « labyrinthe » est originaire du Grec ancien, en Latin « Labyrinthus » [3], désignant un tracé sinueux, muni d’embranchements, d’impasses et de fausses pistes destinant à perdre ou faire ralentir la personne cherchant à s’en échapper. Plus précisément, le terme « Labyrinthus » est défini par un enclos de bâtiments dont il est difficile de trouver l’issue.

D’après différentes études effectuées par des spécialistes en linguistique, l’origine du terme « labyrinthe » viendrait d’une langue préhellénique [4], mélangeant différentes langues du Grec ancien. Ce type de langage n’étant pas connu à nos jours, il est impossible de définir précisément l’origine de ce terme.

De nos jours, la définition du labyrinthe reste la même, sans grosses modifications, désignant une organisation complexe et tortueuse dont il est difficile d’en sortir. Le chemin d’un labyrinthe doit être difficile à suivre et bien entendu à saisir et retenir dans sa globalité.

 

Histoire

La plus vieille représentation connue à nos jours d’un labyrinthe date du Paléolithique. Elle a été retrouvée sur une tombe sibérienne, gravée sur de l’ivoire de Mammouth [5]. La représentation montrait un labyrinthe circulaire, composé de plusieurs dédales s’emboitant permettant ainsi de perdre presque totalement la personne piégée à l’intérieur.

La première création avérée d’un véritable labyrinthe tel que défini précédemment date de l’Égypte ancienne [6]. L’architecture de ce labyrinthe serait attribuée à Hérodote [7], architecte Grec engagé par le pharaon Amenemhat, qui aurait eu pour commande de construire un palais comportant un dédale de plus de 3 000 couloirs et ceci sur plusieurs niveaux. Le labyrinthe étant si monumental, il viendrait se joindre comme étant la 8e merveille du monde s’il avait pu être retrouvé.

Enfin, les utilisations les plus connues et les plus célèbres de labyrinthes nous viennent de la Grèce antique, notamment au travers de la mythologie. Le célèbre labyrinthe du Minotaure [8] construit par Dédale [9] aurait pour but d’enfermer à tout jamais le Minotaure en son sein. Son architecture serait donc une architecture close, dont il est impossible d’en ressortir une fois entrée. Cela reste un paradoxe, car si un labyrinthe comporte une entrée, il comporte automatiquement une sortie. D’après la mythologie, seules trois personnes auraient réussi à en sortir : Icare, Thésée et Dédale lui-même.

Comme évoqué précédemment, nous connaissant également le Tartare [10], célèbre prison des Dieux déchus s’étant opposés aux Dieux de l’Olympe. L’Illiade d’Homère [11] conte ce lieu comme étant enterré profondément au centre des Enfers afin d’empêcher les Dieux punis pour leur attaque contre les Dieux  de s’en échapper. Il aurait été construit, d’après les récits, par le concepteur des armes de Zeus, Hadès et Poséidon nommé Héphaïstos [12]. Afin de garantir une sécurité maximale, le Tartare serait construit de l’intérieur vers l’extérieur, sur trois dimensions permettant le déplacement de ses murs, rendant ainsi l’accès à la sortie quasi impossible.

Bien plus récemment, nous pouvons évoquer le premier opus du film « Le Labyrinthe » [13] où un groupe d’adolescents, dont un membre est rajouté tous les mois, vivent au centre d’un labyrinthe et doivent s’en échapper. Le labyrinthe composé sur un plan en deux dimensions possède des modifications qui s’effectuent la nuit, le rendant ainsi pratiquement intraçable.

Vous l’aurez donc compris, la création et l’utilisation de labyrinthes se fait depuis plusieurs milliers d’années et ses possibilités de conceptions sont sans limites. Cependant, la conception d’un labyrinthe complet et complexe peut être une lourde tâche pour une personne devant effectuer ce travail. C’est pourquoi l’idée d’automatiser cette tâche est une option plus qu’intéressante pour la création de labyrinthes. Cette solution est d’autant plus intéressante, car un labyrinthe peut être représenté sous forme d’arbre mathématique, ce qui rend l’application d’un algorithme simplifié pour la réalisation automatique d’un labyrinthe.

 

 

Labyrinthes et Mathématiques

Traduction d’un labyrinthe en modèle mathématique

Mais comment représenter un labyrinthe, élément physique comportement des couloirs et des murs en modèle mathématique compréhensible et traduisible en langage informatique ? Et bien il s’avère que cela est plus simple que ce qu’il n’y parait !

Visualiser un labyrinthe sous forme de modèle mathématique requiert une simple logique : un labyrinthe comporte logiquement une entrée et une sortie. De plus, nous savons qu’un labyrinthe peut être schématisé sous forme de matrice, qui comporterait des coordonnées permettant d’identifier chaque case singulièrement. Nous avons donc les éléments nous permettant de modéliser un labyrinthe en modèle mathématique.

Prenons un exemple :

symbolisation de chemins dans un labyrinthe

Nous pouvons constater sur la figure n° 1 [13], la schématisation des différentes possibilités de chemins dans un labyrinthe de taille 4*5. Chaque case est donc associée à une coordonnée qui sera lue premièrement en colonne et ensuite en ligne. Si nous prenons la case correspondant à l’entrée du labyrinthe, nous allons donc avoir comme coordonnées (0 pour la colonne, 4 pour la ligne).

En suivant cette logique, nous allons pouvoir « cartographier » l’ensemble du labyrinthe et ainsi obtenir toutes les possibilités de chemins de celui-ci ainsi que toutes les coordonnées des cellules. En procédant case par case et en avançant au fur et à mesure dans le labyrinthe, nous sommes arrivés au résultat suivant :

Modélisation sous forme d’arbre des chemins d’un labyrinthe

Analysons le résultat [14] : nous retrouvons bien notre entrée de labyrinthe en coordonnées (0,4) et nous pouvons également constater que nous avons chacune des ramifications et fins de chemins possibles pour le labyrinthe. Logiquement, nous devons donc avoir la sortie du labyrinthe, ce qui est le cas en coordonnées (5,4).

 

Déduction d’une logique informatique d’après l’arbre

Ainsi, une fois notre arbre effectué, il est aisé de trouver une logique de conception d’algorithme permettant de recréer ce type de chemin lors de l’exécution de celui-ci. Voyons plus en détail cette logique.

Nous pouvons constater que les différentes branches qui constituent notre arbre, en comparaison avec notre labyrinthe, prennent fin uniquement lorsqu’elles n’ont plus de cases voisines disponibles autour d’elles. Plus précisément, tant qu’une case adjacente à la case actuelle est disponible, nous allons continuer à aller dans la direction de cette case jusqu’à ne plus trouver de case adjacente disponible.

En utilisant cette méthode, nous pouvons établir un algorithme qui permettra de parcourir toutes les cases d’une matrice et ainsi d’y établir un chemin au fur et à mesure de sa progression. Une fois que l’exécution de l’algorithme sera terminée, nous aurons donc un labyrinthe entièrement créé et complet. Ce labyrinthe sans singulières particularités sera dit « parfait ».

 

 

Labyrinthes et Algorithme

Conception de l’algorithme

Du fait d’avoir étudié le modèle mathématique établi à partir d’un labyrinthe, nous avons donc pu dégager une logique informatique de conception d’un algorithme permettant de concevoir un labyrinthe dit « parfait ».

Avant de continuer, il nous faut définir ce qu’est un labyrinthe « parfait » pour bien comprendre le futur fonctionnement de l’algorithme « Growing Tree ». Un labyrinthe « parfait » est un labyrinthe dont chacune des cellules est reliée entre elles et ceux de manière unique. Voici ci-dessous deux exemples de labyrinthes.

Labyrinthe "Parfait"
Labyrinthe "imparfait"

 

 

 

 

 

 

 

Notre algorithme va donc en premier lieu créer le contexte d’application de notre méthode qui va être tout simplement une matrice. La taille de la matrice importe peu, plus la matrice sera grande, plus le traitement sera long, mais cela reste de l’ordre de quelques centièmes de secondes.

Une fois notre matrice crée, notre algorithme va sélectionner une case au hasard dans la matrice et en sauvegarder la coordonnée dans ce qui est appelé une pile mémoire.

La pile mémoire est, en informatique, le stockage d’adresses de cases mémoires contenant des informations à la manière d’un entassement d’informations. La première information collectée sera la base de la pile, et toutes les prochaines informations qui seront collectées seront empilées les unes à la suite des autres sur la donnée précédente présente dans la pile.

Une fois donc que la coordonnée de la première case, qui est donc notre case de départ d’application de notre algorithme, est sauvegardée dans notre pile mémoire, l’algorithme va rechercher autour de cette case si une seconde case adjacente est disponible. Si une telle case est disponible, l’algorithme va alors empiler la coordonnée de cette case par-dessus la coordonnée existante dans notre pile mémoire et sans écraser la précédente.

L’algorithme va ainsi continuer à empiler les coordonnées dans notre pile mémoire tant que des cases adjacentes à la case actuelle seront disponibles. Nous pouvons donc constater que l’algorithme est en train de recréer l’arbre mathématique détaillé et étudié dans le précédent chapitre.

Au fur et à mesure de son exécution, l’algorithme va recréer des chemins en empilant des coordonnées. À chaque fois qu’il va atteindre le bout d’un chemin, c’est-à-dire lorsqu’il ne trouvera plus de case adjacente à celle dans laquelle il se trouve actuellement, l’algorithme dépilera alors les différentes données précédemment empilées dans notre pile mémoire. Pour chacune des coordonnées dépilées, il va regarder si une autre case adjacente à celle de laquelle il vient existe. Si une telle case existe, l’algorithme reprendra alors son exploration de la matrice et son stockage de coordonnées dans la pile mémoire jusqu’à atteindre à nouveau la fin du chemin. Si, au contraire, une telle case n’existe pas, il continuera de dépiler les coordonnées une à une et de tester si un chemin alternatif existe.

L’algorithme continuera d’effectuer ces deux traitements de recherche et d’empilage, ou de dépilage et de test de chemin alternatif jusqu’à ce que la pile soit totalement dépilée et qu’il ne reste plus aucune coordonnée à l’intérieur.

Une fois la pile totalement dépilée, notre labyrinthe sera donc terminé et conçu, et comportera bien une entrée, une sortie, différents chemins et intersections permettant de perdre la personne censée le traverser et de nombreuses impasses rendent la résolution du labyrinthe bien plus complexe. Le labyrinthe crée sera alors caractérisé comme « parfait », car toutes les cellules composants la matrice ont bien été reliées les unes aux autres de manière unique.

 

Illustrations de l’algorithme

Comme tout le monde le sait, une image vaut mieux qu’un grand discours, c’est pourquoi nous allons illustrer le fonctionnement de l’algorithme en images.

 

Déroulement dynamique :

Ci-dessous se trouve le déroulement dynamique de l’exécution de notre algorithme [15]. Il s’agit d’un GIF animé de la création d’un labyrinthe parfait sur une matrice 5*5.

 

GIF animé de l’algorithme

 

Déroulement statique :

Ci-dessous se trouve la même représentation graphique que précédemment de la conception du labyrinthe, mais en image pour maximiser la compatibilité des supports de la représentation.

 

Déroulement étape par étape de notre algorithme

 

À la visualisation de cette animation [16] ou des différentes images, nous comprenons donc clairement le fonctionnement de notre algorithme et de sa façon de procéder au fur et à mesure de son exécution pour déterminer et créer les différents chemins dans notre matrice de base.

Nous pouvons également constater que le labyrinthe créé à la fin de l’exécution de l’algorithme est effectivement un labyrinthe dit « parfait » comme prévu précédemment lors de la conception de notre algorithme.

 

 

Algorithme et implémentation

Écriture de l’algorithme

Maintenant que nous connaissons le fonctionnement global de l’algorithme, il va falloir écrire celui-ci afin d’ensuite l’implémenter. Le fonctionnement de l’algorithme étant peu complexe dans sa compréhension et son fonctionnement, il ne devrait pas être trop compliqué d’écrire l’algorithme de création du labyrinthe parfait. Voici donc l’algorithme de la partie d’exploration et de création du labyrinthe à travers d’une matrice :

 

Algorithme décrivant le processus de l'algorithme "Growing Tree"

 

Voici donc l’ossature principale et globale de la création d’un labyrinthe. Bien entendu, l’algorithme détaillé comporte bien plus de lignes et est légèrement plus complexe puisqu’il comprend la création de la matrice, les différentes sauvegardes utilisées tout au long de l’algorithme comme la taille de la matrice pour le labyrinthe ou encore les différentes variables utilisées.

 

Implémentation de l’algorithme

Pour étudier plus facilement cet algorithme, nous allons voir un code fonctionnel en JavaScript, permettant la création d’un labyrinthe dans une page HTML. Le but de ce code n’est pas d’afficher en temps réel la création du labyrinthe comme dans l’exemple en photo ci-dessus, mais de vous montrer un labyrinthe complet, entièrement créé via notre algorithme.

Nous allons donc, par étapes, décoder notre code en JavaScript afin de comprendre entièrement ce qu’il fait de A – Z dans la création d’un labyrinthe.

 

Étape 1 : Déclaration des différentes variables

 

 

Étant donné que nous nous trouvons dans un contexte Web, il nous faut pouvoir afficher le résultat de la création de notre labyrinthe sur cette fameuse page. La solution la plus adéquate à mettre en œuvre est d’utiliser un canevas. Un canevas est une zone de « dessin » utilisable directement d’après un code JavaScript. Et ce qui tombe bien c’est que notre labyrinthe est justement créé dynamiquement en JavaScript.

Nous allons donc retrouver différentes fonctions présentes dans notre code nous permettant de dessiner et d’utiliser ce canevas.

 

Étape 2 : établir les fonctions pour utiliser le canevas

Il nous faut donc, avant de créer le labyrinthe, écrire toutes les fonctions permettant d’utiliser le canevas HTML car, comme le labyrinthe sera affiché dans celui-ci, certaines de ces fonctions vont être appelées dans le programme de création de notre labyrinthe. Voici donc les différentes fonctions nécessaires pour l’utilisation de notre canevas :

 

 

 

Une fois que nous avons écrit nos deux fonctions nous permettant d’utiliser entièrement notre canevas et ainsi pouvoir dessiner notre labyrinthe sur notre page web, nous allons pouvoir nous attaquer à la fonction qui va permettre de créer le labyrinthe en lui-même.

 

Étape 3 : création du labyrinthe

Voici donc la fameuse fonction contenant notre algorithme qui nous permettra de créer notre labyrinthe. Le code étant bien commenté, vous devriez aisément comprendre et déceler les différentes parties de l’algorithme établi ci-dessous.

 

 

Nous avons donc la quasi-totalité de notre code ici. Il ne nous reste plus qu’à écrire la dernière fonction qui va faire fonctionner l’ensemble de notre code. Fonction que nous appellerons à la fin de notre code et qui génèrera notre labyrinthe.

 

Étape 4 : fonction permettant d’appeler les différentes parties du code

Voici donc notre fonction générale qui nous permettra d’appeler l’ensemble de nos fonctions et ainsi créer le contexte pour le canevas, créer le labyrinthe, retourner le résultat de la création de notre labyrinthe et le faire dessiner dans le canevas avant de l’afficher. Voici donc cette fonction :

 

 

 

Étape 5 : appel de la fonction d’initialisation pour créer le labyrinthe

Une fois notre fonction générale écrite, il n’y a plus qu’à l’appeler dans notre page HTML et le labyrinthe apparaitra dans le canevas.

 

 

 

Aller plus loin

Algorithme de résolution du labyrinthe

Bien évidemment, s’il existe un algorithme permettant de créer un labyrinthe, il existe également un algorithme permettant de le résoudre. De nombreux codes sources se trouvent sur le net permettant de différentes manières.

Ce type d’algorithme fonctionne sur une base de recherche récursive [17]. Il fonctionne quasiment à l’identique que notre algorithme de création du labyrinthe sauf qu’au lieu de créer, il va chercher. Il va tester au fur et à mesure de son avancement s’il y’a des cases vides autour de lui. Si oui, il va s’engager dans un chemin et continuer ainsi de suite jusqu’à, soit trouver la sortie, soit buter sur un mur, c’est-à-dire qu’aucune case vide ne sera à portée. Il va donc repartir en arrière jusqu’à retrouver une case vide et pouvoir continuer son exploration. Et voilà ! Si tout se passe bien notre algorithme devrait sans trop de difficulté trouver la sortie de notre labyrinthe « parfait ».

 

 

D’autres labyrinthes obtenus à partir d’algorithmes

Nous avons donc, tout au long de ce papier, étudié, compris et appris comment créer un labyrinthe dit « parfait » grâce aux mathématiques et à l’algorithmie. Cependant, il existe une très grande variété de labyrinthes possibles à la création. Certains de ces labyrinthes se créent avec le même algorithme que celui étudié précédemment : la méthode reste la même, mais la façon de rechercher les cases est différente. Ou encore le choix de départ peut influencer sa méthode de création, mais il restera quand même un labyrinthe « parfait ».

En revanche, d’autres labyrinthes bien plus complexes requièrent des algorithmes et des méthodes de créations plus alambiqués. Avant de conclure ce papier, voici certains de ces labyrinthes [18] dont seules leurs représentations montrent à quel point leurs complexités de création peuvent être élevées.

 

Labyrinthe géométrique et symétrique

 

Labyrinthe des sortilèges du château de Ribeauvillé en Alsace

 

Labyrinthe géométrique complexe contenant des complexités supplémentaires aux extrémités

 

 

Bibliographie

[1] – Source Wikipédia : https://fr.wikipedia.org/wiki/Pyramide_de_Kh%C3%A9ops . Dernier accès à l’article le 03/11/2017.

[2] – Source Wikipédia : https://fr.wikipedia.org/wiki/Tartare_(mythologie) . Dernier accès à l’article le 03/11/2017.

[3] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe . Dernier accès à l’article le 03/11/2017.

[4] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe . Dernier accès à l’article le 03/11/2017.

[5] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe. Derniers accès à l’article le 03/11/2017.

[6] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe . Dernier accès à l’article le 03/11/2017.

[7] – Source Wikipédia : https://fr.wikipedia.org/wiki/H%C3%A9rodote . Dernier accès à l’article le 03/11/2017.

[8] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe . Dernier accès à l’article le 03/11/2017.

[9] – Source Wikipédia : https://fr.wikipedia.org/wiki/D%C3%A9dale . Dernier accès à l’article le 03/11/2017.

[10] – Source Wikipédia : https://fr.wikipedia.org/wiki/Iliade . Dernier accès à l’article le 03/11/2017.

[11] – Source Wikipédia : https://fr.wikipedia.org/wiki/H%C3%A9pha%C3%AFstos . Dernier accès à article le 03/11/2017.

[12] – Source Wikipédia : https://fr.wikipedia.org/wiki/Le_Labyrinthe_(film,_2014) . Dernier accès à l’article le 03/11/2017.

[13] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe . Dernier accès à l’article le 03/11/2017.

[14] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe . Dernier accès à l’article le 03/11/2017.

[15] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe . Dernier accès l’article le 03/11/2017.

[16] – Source Wikipédia : https://fr.wikipedia.org/wiki/Labyrinthe . Dernier accès à l’article le 03/11/2017.

[17] – Montage photo effectué par Nicolas Roux via le GIF récupéré de Wikipédia à la source : https://fr.wikipedia.org/wiki/Labyrinthe .

[18] – Source Wikiversity : https://fr.wikiversity.org/wiki/R%C3%A9cursivit%C3%A9_dans_l%27algorithmique_et_la_programmation/Algorithmes_r%C3%A9cursifs . Dernier accès à l’article le 03/11/217.

[19] – Source : Google Image avec termes de recherche : labyrinthe 3D. Labyrinthes complexes. Labyrinthe multi dimensions.

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *