Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

MazeML

Par Cacophrene

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne Zozor # Posté le 22/12/2008 à 20:01:55
Hiii Haaan !
Avatar
Groupe : Mascotte

Illustration

Bonjour à tous !

C'est les vacances, autant en profiter. Comme ce concours n'est pas noté, et qu'il propose un sujet intéressant, il est assez tentant de s'y pencher... d'ailleurs c'est ce que j'ai fait. :p

En plus, il y a généralement peu de codes écrits en OCaml... donc cette contribution pourra servir d'exemple à ceux qui veulent s'y mettre. Elle permet d'ailleurs d'illustrer l'utilisation de LablGTK, ainsi que d'autres choses plus ou moins importantes :

  • Découpage du code en modules;
  • Dessin et double buffering;
  • Et bien sûr la partie algorithmique elle-même !

Bon, assez de paroles ! Venons-en aux faits. ^^

Introduction



J'ai choisi de n'implémenter qu'une partie des fonctionnalités présentées sur la page principale du concours et, en toute franchise, je n'ai pas l'intention d'en faire plus (c'est pour moi un « projet-jouet » pour m'amuser, auquel je ne peux pas consacrer tout le temps que je voudrais). Concrètement, voici ce que fait ce programme :

  • Créer des labyrinthes parfaits de 4x4 à 240x390 cases.
  • Afficher la solution des labyrinthes créés.
  • Construire pas à pas un labyrinthe.
  • Enregistrer et charger des labyrinthes.
  • Exporter des labyrinthes sous forme d'image (PNG, JPEG ou BMP).


Caractéristiques du programme



Nom


Ce programme s'appelle MazeML, nom composé du mot anglais maze, qui signifie labyrinthe, et du suffixe ML, pour rappeler qu'il a été écrit en OCaml.

Licence


MazeML est distribué sous les termes de la licence GNU GPL v3. Une copie est incluse dans l'archive contenant les sources.

Labyrinthes


MazeML permet de dessiner des labyrinthes de 4x4 à 240x390 cases. Ces limites sont imposées par la taille réduite de la zone de dessin (fixe... on peut envisager de la rendre redimensionnable, et permettre ainsi de tracer de plus gros labyrinthes, mais je ne le ferai pas).

Remarque : depuis la version 1.8, l'option --without-gui permet de créer et d'exporter de gros labyrinthes (testé jusqu'à 700x700 cases) au format PNG. Il s'agit surtout d'une fonctionnalité pour le fun car l'export au format PNG est très lent et GtkDrawable n'est pas l'outil le plus approprié pour des dessins de cette envergure. De toutes façons, le programme échoue dès 800x800 avec un bel Out of memory. ^^

Algorithme


MazeML crée des labyrinthes grâce à l'algorithme d'exploration exhaustive. Les informations de backtracking sont stockées au fur et à mesure de la progression. Il est alors possible d'écrire une fonction récursive terminale, ce qui évite les débordements de pile pour de gros labyrinthes.

Remarque : Il existe bien entendu de nombreux autres algorithmes plus ou moins efficaces pour créer des labyrinthes (avec un biais plus ou moins prononcé). Il est sans doute intéressant d'en implémenter plusieurs et de les comparer, mais je ne le ferai pas.

Résolution du labyrinthe


L'algorithme d'exploration exhaustive crée des labyrinthes parfaits. Il n'existe donc qu'un seul chemin pour aller de la case de départ à la case d'arrivée (où qu'elles soient placées). Par conséquent, on peut exploiter astucieusement les données de backtracking pour calculer la solution en même temps que la création du labyrinthe, sans utiliser d'algorithme dédié.

Affichage des labyrinthes


MazeML affiche les labyrinthes avec les outils de base que sont GtkDrawable et GtkPixmap (pas d'OpenGL ou de bibliothèque spécialisée). Il s'agit d'une certaine façon d'utiliser des fonctions comparables à celles du module Graphics de la bibliothèque standard d'OCaml. Voici un exemple de tracé :

Image utilisateur

Implémentation


Les labyrinthes sont représentés par des tableaux de type Bigarray à une dimension, composés d'entiers non signés codés sur 8 bits. Chaque case du labyrinthe est ainsi codée par un octet. Plus précisément :

  • Les 4 bits de poids fort représentent les portes N (nord), W (ouest), E (est) et S (sud). Ils stockent les informations de backtracking, c'est-à-dire la porte à franchir pour revenir en arrière.
  • Les 4 bits de poids faible représentent aussi les portes N, W, E et S. Ils représentent les portes ouvertes d'une case donnée.

Remarque : Les données de backtracking sont effacées dès qu'elles ont été utilisées, sauf si elles font partie du chemin qui relie la case de départ (arbitrairement placée en haut à gauche) à la case d'arrivée (arbitrairement placée en bas à droite).

Découpage en modules


MazeML est organisé en plusieurs modules relativement indépendants les uns des autres. Ce sont :

Nom du module Contenu
UI Widgets de l'interface
Maze Algorithme d'exploration exhaustive
Drawing Tracés et fonctions d'export
Dialog Dialogue avec l'utilisateur
MazeML Callback et point d'entrée


Benchmark



L'implémentation proposée ici a été testée, sans affichage, bien au-delà des limites de MazeML, sur des labyrinthes jusqu'à 15000 cases de côté. Comme il est souvent délicat de tirer une information fiable d'un benchmark, je donne les temps de calcul moyens (10 mesures par taille de labyrinthe) obtenus sur deux machines très différentes (un PC portable assez ancien et un PC de bureau récent) pour 11 tailles de labyrinthes.

Edit: La version 1.9 introduit une nouvelle optimisation (retrait de la conversion de la liste des directions en tableau) qui a permis de gagner quelques secondes sur les gros labyrinthes (jusqu'à 20 secondes pour le 15000 x 15000 avec le PC Acer Aspire). L'effet est quasi imperceptible pour les petits labyrinthes (ceux que MazeML est capable d'afficher).

Taille du labyrinthe Nombre de cases Acer Aspire 2012 (1.5 GHz) Dell Inspiron 530 (Core 2 Duo 2.83 GHz)
1000 x 1000 1e+06 0.3 s 0.1 s
2000 x 2000 4e+06 1.4 s 0.4 s
3000 x 3000 9e+06 3.2 s 0.9 s
4000 x 4000 1.6e+07 5.5 s 1.6 s
5000 x 5000 2.5e+07 8.6 s 2.5 s
6000 x 6000 3.6e+07 12.5 s 3.7 s
7000 x 7000 4.9e+07 17 s 5.0 s
8000 x 8000 6.4e+07 22.3 s 6.6 s
9000 x 9000 8.1e+07 28 s 8.3 s
10 000 x 10 000 1e+08 34.6 s 10.3 s
15 000 x 15 000 2.25e+08 78 s 23.2 s


Pour reproduire ces résultats sur votre machine, il suffit de compiler séparément le module Maze . Pour cela, ajoutez le point d'entrée suivant dans maze.ml :

Code : OCaml
1
2
3
4
5
6
let _ =
  let t0 = Unix.gettimeofday () in
  let maze = make ~rows:1000 ~cols:1000 in
  let t1 = Unix.gettimeofday () in
  Printf.printf "ROWS %d COLS %d MAZE %g TIME %.3f s\n%!"
    maze.rows maze.cols (float maze.last +. 1.0) (t1 -. t0)


puis compilez et exécutez en utilisant la commande suivante :

Code : Console
cacophrene$ ocamlopt -nodynlink -inline 1000000 bigarray.cmxa maze.ml -o maze
cacophrene$ ./maze


Manipulation en ligne de commande



MazeML est en partie configurable en ligne de commande (vous pouvez obtenir la liste complète des options reconnues grâce à -help). Voici les principales options reconnues :
-rows n : Nombre de lignes.
-cols n : Nombre de colonnes.
-wall #RRGGBB : Couleur des murs du labyrinthe.
-cell #RRGGBB : Couleur des cases de la solution.

Édition de labyrinthes



C'est un point qui m'intéresse parce qu'il permet d'illustrer l'efficacité des fonctions de type Bigarray.Array1.map_file . MazeML les exploite bien entendu. Il enregistre et charge des labyrinthes stockés dans un simple fichier texte (jeu de caractères ISO-8859-15). Celui-ci se présente sous la forme :

Code : Autre
1
2
3
4
5
6
ROWS 0000 COLS 0000\n
(contenu du tableau)
(contenu du tableau)
(contenu du tableau)
...
(contenu du tableau)

De façon très générale, pour un labyrinthe de n lignes et c colonnes, la taille du fichier est de nc + 20 octets (ces 20 octets servent pour ROWS et COLS comme indiqué plus haut).

Export



MazeML propose d'exporter les labyrinthes au format PNG (avec transparence) ou JPEG. L'export s'effectue avec ou sans la solution du labyrinthe, selon ce qui est affiché à l'écran. Remarque : La couleur rendue transparente peut être modifiée en ligne de commande.

Construction pas à pas



La version 1.7 de MazeML introduit une nouvelle fonctionnalité : la construction pas à pas des labyrinthes. Pour tester cette fonction, vous devez lancer le logiciel avec l'option -interactive. Vous pouvez régler la vitesse des animations avec l'option -rate nn désigne le nombre de millisecondes qui sépare deux tracés. Voici une illustration de cette fonctionnalité :

Image utilisateur

Remarque : Cette fonctionnalité n'est pas disponible pour les labyrinthes chargés à partir d'un fichier, car les informations de backtracking nécessaires à l'animation sont perdues lors de l'enregistrement.

Historique des versions



Version 1.0 Première version proposée sur le SdZ.
Version 1.1 Optimisation selon les résultats du profiling (gprof).
Version 1.2 Simplification de la mise en mémoire de la solution.
Version 1.3 Meilleur affichage du chemin solution (tracé continu).
Version 1.4 Abandon des modifications de 1.3, utilisation de Bigarray .
Version 1.5 Export au format PNG (avec transparence) ou JPEG.
Version 1.6 Tracé continu du chemin solution (restauration de 1.3).
Version 1.7 MazeML peut désormais construire pas à pas un labyrinthe.
Version 1.8 Export de gros labyrinthes avec --without-gui.
Version 1.9 Nouvelle optimisation du module Maze (visible sur benchmark).

Liens



Sources et exécutables


MazeML 1.9 sources OCaml
MazeML 1.9 code natif GNU/Linux
MazeML 1.7 bytecode Windows

Quelques labyrinthes obtenus avec --without-gui


Labyrinthe 300x300
Labyrinthe 400x400
Labyrinthe 500x500
Labyrinthe 600x600
Labyrinthe 700x700
Publicité # Posté le 22/12/2008 à 20:01:55

Hors ligne Cacophrene # Posté le 01/01/2009 à 19:54:37
Il est vraiment TeX-TuX
Avatar
Flux RSS

Ville : Le cannet
Pays : France métropolitaine
Études : Université de Nice Sophia Antipolis

Bonjour à tous !

À quelques petites choses près (des détails dans le code, et un peu de documentation à ajouter), ce que je voulais faire dans le temps que je peux consacrer à ce concours est fait.

MazeML est un programme publié sous les termes de la licence GNU GPL version 3 (une copie est incluse dans les sources). Il est conçu pour :

  • Créer des labyrinthes parfaits.
  • Afficher leur solution.
  • Sauvegarder des labyrinthes.
  • Charger des labyrinthes.
  • Exporter des labyrinthes (PNG, JPEG, BMP).
  • Construire pas à pas des labyrinthes.
  • Être rapide et efficace (interface sobre, aller à l'essentiel, etc.).


Ambition affichée : faire un programme en OCaml puisque ce concours le permet, qu'on n'a pas trop l'occasion d'en voir (même s'il en existe de fameux), et que des sujets sont régulièrement postés sur les forums du SdZ à propos de ce langage fonctionnel.

Voilà tout ! Permettez-moi de vous souhaiter à tous une bonne année 2009.

Cordialement,
Cacophrène
 
Hors ligne IATGOF # Posté le 02/01/2009 à 01:51:10
Avatar

Études : Epitech Bordeaux

Est-ce que quelqu'un peux compiler pour windows (si le projet est portable)? N'ayant pas de linux sous la main et ne sachant pas compiler du OCaml, je ne peux pas tester.
Dommage, les screens donnent vraiment envie, ça a l'air d'être du beau boulot :)
Édité le 02/01/2009 à 01:53:25 par IATGOF
Hors ligne Cacophrene # Posté le 02/01/2009 à 08:16:30
Il est vraiment TeX-TuX
Avatar
Flux RSS

Ville : Le cannet
Pays : France métropolitaine
Études : Université de Nice Sophia Antipolis

Salut !

Code natif : Ce projet ne devrait pas poser de problème à la compilation sous Windows. Hélas, je n'utilise pas ce système d'exploitation, je ne peux donc pas le faire moi-même :( D'ailleurs, si quelqu'un veut bien m'aider à combler cette lacune, je lui serai très reconnaissant.

Bytecode : Je vais créer un lien vers le programme compilé en bytecode. Pour tester, il suffit donc d'installer OCaml (voir ici) puis lancer :

Code : Console
cacophrene$ ocamlrun MazeML-1.7.byte


Les options restent les mêmes que dans la fiche de description. En revanche, les performances obtenues ne seront en rien comparables avec ce qui est annoncé.

Edit : Une version bytecode est désormais proposée en téléchargement. Suivre les indications données dans ce message pour tester sous Windows... en attendant mieux.


Cordialement,
Cacophrène
Édité le 02/01/2009 à 08:27:02 par Cacophrene
 
Hors ligne Zopieux # Posté le 04/01/2009 à 12:17:48
Mhg n pryhv dhv zr yvg
Avatar
Groupe : Interdiction d'écriture

Sûrement l'un des projets les plus prometteurs que j'ai pu voir.

Bonne continuation, tu as réalisé là quelque chose de fort.
 
Hors ligne Cacophrene # Posté le 04/01/2009 à 14:45:20
Il est vraiment TeX-TuX
Avatar
Flux RSS

Ville : Le cannet
Pays : France métropolitaine
Études : Université de Nice Sophia Antipolis

Salut !

Merci pour ce message encourageant. :)

Hélas je ne crois pas que ce projet évolue encore dans les jours à venir. Les vacances se terminent et, avec elles, une bonne partie du temps disponible pour le continuer. :o

Je sais bien que la fin du concours n'est pas pour tout de suite (il reste un peu moins d'un mois), mais je ne pense pas pouvoir faire autre chose que réécrire/commenter ponctuellement certains points du code source.

Je considère donc la version 1.8 comme version finale. Le tout dernier ajout (--without-gui) est juste là pour le fun. Aucune nouvelle fonctionnalité n'est prévue (pas d'OpenGL, pas de possibilité de jouer, pas de labyrinthes circulaires, etc.), et tel quel, il fournit un exemple un peu plus « grandeur nature » pour le tutoriel sur LablGTK que ce qu'on peut y trouver. :p

Cordialement,
Cacophrène
 
Hors ligne IATGOF # Posté le 05/01/2009 à 16:12:56
Avatar

Études : Epitech Bordeaux

Salut, j'ai finalement testé sous Ubuntu (flemme d'installer Ocaml sous Windows) et à vrai dire je suis impressionné par ce boulot.
En effet, la vitesse d'exécution est remarquable et l'interface est particulièrement plaisante. Bref, j'adore :) (dommage cependant que personne ne puis compiler sous windows :( )

Franchement, je te dit bravo pour ton travail ;)
Hors ligne Cacophrene # Posté le 05/01/2009 à 19:43:14
Il est vraiment TeX-TuX
Avatar
Flux RSS

Ville : Le cannet
Pays : France métropolitaine
Études : Université de Nice Sophia Antipolis

Salut !

Merci pour ton commentaire, IATGOF. :)

J'essaie toujours de trouver quelqu'un qui a Windows et OCaml, mais c'est hélas difficile à trouver (Windows n'est pas le meilleur système pour coder en OCaml). Pour bien faire, il faudrait que je songe à réinstaller un Windows en dual boot... mais bon, comment dire... :p

Sinon, comme je bidouille un peu avec LablGL ces temps-ci, il y aura peut-être une ultime mise à jour qui remplacera GdkDrawable par de l'OpenGL, mais je ne promets rien.

Pour les performances, on doit pouvoir aller encore plus vite en se tournant vers l'algorithme d'Eller, qui crée le labyrinthe ligne par ligne. En contrepartie cependant, la solution n'est plus obtenue « gratuitement » et il faut implémenter quelque chose exprès (et ce n'est pas prévu ^^ ).

Vala vala.

Cordialement,
Cacophrène
 
Hors ligne SirJulio # Posté le 05/01/2009 à 20:23:40
Avatar
Groupe : Anciens

Coucou,

tout d'abord bravo pour ton programme, c'est bien fait (je ne comprends pas grand chose au code, mais on sent que c'est maitrisé).

Pour Eller, tu peux essayer de faire une resolution quasi-simultanée, (j'avais exploré l'idée, mais vu ma structure ca ne convenait pas) en suivant le set de l'entrée au fur et à mesure de la resolution jusqu'à l'avant derniere ligne (apres de tout facon la derniere lie le tout). Tu auras une solution à trou, que tu peux completer facilement avec des wall-followers localisés (tu isoles les deux bouts (meme set non contigues) et tu agrandis au besoin). En jouant sur le biais qu'introduit naturellement Eller (qui fait que plus le vecteur entrée-sortie est perpendiculaire au sens de la génération, moins tu auras de trou (statistiquement)), ca donnerait un truc pas mal, mais la on rentre dans l'overkill complet (mais c'est rigolo quand meme ! =p).

NB : je ne sais meme pas si ce type de resolution est possible.
Hors ligne Cacophrene # Posté le 05/01/2009 à 20:44:55
Il est vraiment TeX-TuX
Avatar
Flux RSS

Ville : Le cannet
Pays : France métropolitaine
Études : Université de Nice Sophia Antipolis

Salut !

Effectivement ce sont des idées intéressantes qui méritent d'être explorées. De mon côté j'ai choisi l'exploration exhaustive car c'était un des deux algorithmes décrits dans les liens de la page principale du concours... sans même chercher ailleurs. Et j'ai découvert l'existence de l'algorithme d'Eller grâce à MazeD :p

Ceci dit je n'ai vraiment pas le temps de me pencher sur tout ça. Peut-être plus tard, en dehors de ce concours... Pour l'heure je ne touche plus au programme, car l'efficacité de l'implémentation avec Bigarray me satisfait.

Le code lui-même est encore un peu « sale » par endroits (surtout dans Drawing), et il faut ajouter quelques commentaires. Sauf peut-être l'utilisation d'OpenGL, comme dit plus haut, rien de neuf n'est prévu.

Cordialement,
Cacophrène
 
Hors ligne Squ@bad' # Posté le 05/01/2009 à 21:04:33
Rock and roll !
Avatar

Études : Ecole Centrale de Marseille

Hello :)
D'après ce que je vois, et en comparant aux autres projets (le mien compris), je trouve ton programme très intéressant, performant, bien construit et esthétique !
Bravo et bon courage pour la suite ;)
 
Hors ligne bluestorm # Posté le 09/01/2009 à 22:57:01
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Bon, j'ai jeté un coup d'oeil rapide, mais je suis assez impressionné.

Pour commencer, problème de packaging : ton .zip décompresse tout dans le répertoire courant, et ça c'est mal. Il faut mettre un dossier !

Ensuite, petit soucis à la compilation :
- tu utilises Array1.unsafe_get qui est ocaml 3.11, je suis encore en 3.10. Il suffit de renommer pour que ça passe, mais sachant que la 3.11 est encore assez peu implantée (elle n'est pas encore dans GODI à ma connaissance, même si ça va arriver sous peu), si tu perds pas trop en perfs (j'en sais rien) tu devrais les virer. Il y a peut-être moyen de faire de la compilation conditionnelle avec camlp4.
- le myocamlbuild met des flags natifs direct (-inline, etc), donc le "ocamlbuild mazeML.byte" se chie dessus. Je les ai virés pour compiler mais il doit y avoir une solution plus propre (je connais mal ocamlbuild). Il n'y a pas moyen d'utiliser un simple _tags, sinon ?

Pour le code j'ai regardé très, très rapidement, lablgtk je connais pas donc plein d'objet un peu chiant à vue de nez (forcément coder une UI c'est pas le truc le plus passionnant du monde). Le code de mazeML fait très pro (genre le .mli et tout). Après, l'inlining à la main pour gagner en perfs c'est pas trop mon style, mais visiblement c'est l'état d'esprit général et ça reste plutôt propre alors pourquoi pas :D

Une suggestion à la con (mais vraiment con) pour l'UI : actuellement quand on a demandé à voir la solution, et qu'on change la taille du labyrinthe, il redraw en remontrant la solution (logique). L'user pourrait avoir envie de regarder la solution, agrandir le labyrinthe et re-dessiner sans voir la solution, pour la chercher avant de l'afficher. Actuellement il doit faire "voir" puis "masquer" avant de re-générer pour ça, ce qui n'est pas forcément très pratique. Pourquoi pas une checkbox "cacher la solution au redraw" ?
(Après il faut voir, si le compromis complexité/fonctionnalité de l'interface est intéressant, c'est pas sûr)

J'étais content d'un projet pour montrer que OCaml c'est le bien, et celui-ci a la classe.
 
Hors ligne Cacophrene # Posté le 10/01/2009 à 09:06:00
Il est vraiment TeX-TuX
Avatar
Flux RSS

Ville : Le cannet
Pays : France métropolitaine
Études : Université de Nice Sophia Antipolis

Salut !

Citation : bluestorm
Pour commencer, problème de packaging : ton .zip décompresse tout dans le répertoire courant, et ça c'est mal. Il faut mettre un dossier !

Je n'observe pas ce comportement de mon côté :( . Sous Ubuntu, l'entrée « Extraire ici » du menu contextuel me crée un répertoire MazeML-1.8 et extrait les fichiers dedans (et non dans le répertoire courant). Je suis désolé de voir que ça ne marche pas partout... Suffit-il que j'ajoute un répertoire principal à la racine pour résoudre le problème ?

Edit: J'ai ajouté un répertoire parent. Il ne devrait donc plus y avoir de problème, quel que soit le logiciel utilisé pour décompresser l'archive.

Citation : bluestorm
tu utilises Array1.unsafe_get qui est ocaml 3.11, je suis encore en 3.10.

Effectivement c'est une nouvelle fonctionnalité dans 3.11, et il y a une erreur dans mon fichier INSTALL qui devrait demander 3.11 ou ultérieur (et non 3.10.2). Je vais corriger ça. Sur le plan des perfs, je doute que les fonctions unsafe aient un impact très net sur la plage de valeurs possibles dans MazeML (maximum 240 x 390). Mais pour de gros labyrinthes comme ceux qui ont permis de faire le benchmark, ça doit être un peu différent. Au besoin je retire ces deux lignes de code.

Edit: Je viens de créer la version 1.9. J'y précise comment remplacer les fonctions unsafe par leur équivalent safe pour compiler avec 3.10. J'ai également optimisé la fonction Maze.GoTo.rand pour un résultat assez net sur de gros labyrinthes (hors de la plage de valeurs de MazeML). Quant aux fonctions unsafe, elles font tout juste gagner une seconde pour 7000 x 7000. Donc aucun souci si on les enlève...

Citation : bluestorm
le myocamlbuild met des flags natifs direct (-inline, etc), donc le "ocamlbuild mazeML.byte" se chie dessus. Je les ai virés pour compiler mais il doit y avoir une solution plus propre (je connais mal ocamlbuild). Il n'y a pas moyen d'utiliser un simple _tags, sinon ?

Arf, c'est parce que je n'ai jamais utilisé le bytecode pour ce programme ^^ . On doit pouvoir corriger tout ça et autoriser les deux versions, mais il faut que je consulte un peu la doc, car j'ai tendance à faire des copier/coller pour ces choses-là... :)

Citation : bluestorm
Une suggestion à la con (mais vraiment con) pour l'UI : actuellement quand on a demandé à voir la solution, et qu'on change la taille du labyrinthe, il redraw en remontrant la solution (logique). L'user pourrait avoir envie de regarder la solution, agrandir le labyrinthe et re-dessiner sans voir la solution, pour la chercher avant de l'afficher. Actuellement il doit faire "voir" puis "masquer" avant de re-générer pour ça, ce qui n'est pas forcément très pratique. Pourquoi pas une checkbox "cacher la solution au redraw" ?

Ou alors faire sauter le toggle_button à chaque mise à jour pour que la solution ne soit affichée que si l'utilisateur le veut vraiment (en cliquant sur le bouton, donc). Qu'en penses-tu ?

Edit: Je vais probablement faire une petite mise à jour qui tiendra compte de la plupart des suggestions demain (peut-être pas pour ocamlbuild... parce que je n'ai pas encore lu la doc :-° ).

Cordialement,
Cacophrène
Édité le 11/01/2009 à 14:16:29 par Cacophrene
 
Hors ligne Cacophrene # Posté le 11/01/2009 à 20:30:20
Il est vraiment TeX-TuX
Avatar
Flux RSS

Ville : Le cannet
Pays : France métropolitaine
Études : Université de Nice Sophia Antipolis

Bonjour à tous !

Je considère la version 1.9 comme la version finale de MazeML. Plus aucune mise à jour d'importance n'est prévue (seulement des corrections mineures, des ajouts de commentaires, des corrections de fautes d'orthographe, etc.).

Edit: MazeML est maintenant sur SourceForge (MazeML@SF.net)

Cordialement,
Cacophrène
Édité le 01/09/2009 à 20:28:48 par Cacophrene
 

Retour au forum "Générateurs de labyrinthes" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx