You are here -> Home » leo2urlevan's journals » Laby - projet de labyrinthe open-source en "C with Classes"

Laby - projet de labyrinthe open-source en "C with Classes"

Le 8/01/2010 à 23h08 by leo2urlevan, See the Journals, 2 commentaries

Bonjour à tous membres de Logram,

Dans le cadre d'une matière scolaire, un ami et moi avons dû développer un projet en suivant des règles très précises. Nous avons choisi de créer un bête jeu de labyrinthe ; le plus intéressant n'est pas tant le jeu lui-même mais tout le processus de conception et de documentation qui l'accompagne, faisant de ce simple petit programme un réel projet.

Nous avons en effet utilisé plusieurs outils de gestion de projet ; pour ma part, c'était la première fois que j'utilisais tous ces petits programmes qui aident à travailler en commun.

Deuxième niveau : facile...

  • Tout d'abord, un système de gestion de versions. Le terme paraît bien compliqué, mais si vous êtes sur ce site, vous avez sûrement entendu parler de SVN, qui en est. Le principe est que plusieurs codeurs puissent travailler en parallèle sans se déranger : ils utilisent alors un serveur distant sur lequel ils envoient leur code, et peuvent le récupérer par la suite. En fonction du gestionnaire, il y a éventuellement un contrôle des conflits, c'est-à-dire des modifications d'un même fichier, par plusieurs utilisateurs, dans le même intervalle de temps ; ce contrôle gère en général tout seul ces modifications, et le fait bien.

  • Notre serveur SVN est hébergé par GoogleCode (gratuit à condition que le logiciel soit libre) à cette adresse. Pour récupérer la dernière version du code, assurez-vous d'avoir Subversion et tapez dans une console : svn co http://lif7db.googlecode.com/svn/trunk

  • Ensuite, nous avons utilisé un débogueur, gdb. Sans entrer dans les détails ici, c'est un programme terriblement pratique qui vous permet de repérer l'état des variables à un moment donné, et surtout de repérer où se font les fermetures inopinées de programme (erreurs de segmentation notamment, un des pires ennemis du programmeur).

  • Nous avons également dû utilisé valgrind, un profileur, c'est à dire un programme qui nous permet d'analyser les performances de notre code et de repérer les fuites mémoires. Ce genre de programmes est très intéressant, à condition que vous n'utilisiez pas d'API : nous avons remarqué qu'aussi bien pour la librairie d'affichage NCurses que pour la librairie SDL, des fuites mémoires se font à l'issue de programmes minimaux présentés dans les documentations de ces librairies. En outre, on n'a pas réellement pu se rendre compte des réelles fuites mémoires, mais on a feinté en utilisant un système perso à coups d'affichage à chaque allocation et désallocation. Bref, un détail :ninja: .

  • En termes de conception, nous avons dû créer un cahier des charges complet, un diagramme des modules (créé à l'aide d'UMBrello), et devions documenter précisément chaque fonction pour avoir une documentation Doxygen complète. Tout cela est présent dans le répertoire trunk du svn, pour les curieux. Un des impératifs de la consigne était le suivant : le programme doit fonctionner avec des interfaces différentes. Pour cela, il fallait que toute l'algorithmie de gestion de niveaux, de déplacement, etc... soit le plus possible indépendante de l'interface graphique. En conclusion, cela donne deux interfaces, dont les algorithmes sont les mêmes, et qui utilisent des fonctions de haut niveau.

  • Notre enseignement d'informatique se faisant en C et non en C++, il était demandé de concevoir le programme en "C with classes" (on ne nous a pas dit le nom, mais on nous a bien forcé à créer un module par structure, ainsi qu'accesseurs, mutateurs...). On s'est donc forcé à n'utiliser que les outils du C ; c'est à ce moment-là qu'on se rend compte que le C++ est quand même très pratique (ne serait-ce que pour les strings :p ).

  • Pour compiler le projet, il a fallu apprendre également à écrire des Makefile tout prêts. Une fois le contenu récupéré sur le serveur SVN, tapez dans votre terminal : make

Parmi les dépendances, pour la version graphique vous avez besoin de libsdl1.2-dev et libsdl-ttf2.0-dev. Pour la version console, vous avez besoin de libncurses-dev. Toutes les informations complémentaires pour la compilation sont dans le fichier LisezMoi.

  • Pour ce qui est du jeu, c'est un labyrinthe tout ce qu'il y a de plus basique : vous déplacez un personnage de l'entrée à la sortie, en faisant face à des ennemis, de plus en plus nombreux et de plus en plus coriaces. Aucune IA n'a été programmée (pour trouver un algorithme de déplacement convergent sur le joueur, il fallait utiliser Djikstra et à priori des graphes, plutôt complexe à implémenter soi-même). Vous pouvez sauvegarder, charger, recommencer une partie. Tous les détails sont dans le LisezMoi une fois de plus.

  • Voilà où j'en suis actuellement. Le programme doit être rendu ce lundi après-midi, et je suis à la recherche de bugs. Si vous en trouvez, prévenez-moi ici même ! Merci et bon test. Le programme est appelé à bouger d'ici la fin du weekend, donc n'hésitez pas à refaire souvent des svn update.

... Niveau 4 : un peu plus dur !

Bon test !

NB: je viens de remarquer un beau texte "A pour l'Aide"... Ne prenez pas en compte ce texte, toutes les instructions sont dans le LisezMoi, ce texte sera enlevé à la prochaine mise à jour demain :euh:

Commentaries

Author Message
kido
# le 9/01/2010 à 10h59
l'unique
Avatar
Group : Member

Salut, J'ai testé ton projet: tout d'abord il faut aussi la librairie sdl-image pour compiler ton projet donc il faut rajouter les paquets libsdl-image1.2 et libsdl-image1.2-dev puis après la compilation passe nickel pour le mode SDL. Pour le mode texte voilà ce que me sort ma console: kido@Wave:~/laby/trunk/src$ make INTERFACE=TXT gcc Terrain.o main.o Position.o Entite.o ListeEnnemis.o Niveau.o Jeu.o Campagne.o Debug.o InterfaceTXT.o -Wall -W -pedantic -lncurses -o laby main.o: In function 'main': main.c:(.text+0x178): undefined reference to 'SDL_lancer' collect2: ld returned 1 exit status make: *** [all] Erreur 1 (dsl pour la mise en forme c'est markdown qui m'en empeche :unsure: )

J'ai lancé le programme SDL: premier constat le début est très long à charger, on peut appyer sur toutes les touches qu'on veut pendant un bon moment il fait rien, ca serait pas mal de mettre un écran avec marqué "chargement" par dessus ou quelque chose du genre. ;)

Après 2eme constat en bas c'est marqué "appyer sur A pour l'aide" mais j'ai beau appuyer sur A autant de fois que je le veut, rien ne se passe o_O Sinon à part les graphisme il y'a pas grand chose à redire :)

Maintenant passons au reste, ça fait longtemps que j'ai plus touché à la SDL donc désolé je regarderai pas le code en détail mais pour l'avoir survolé je le trouve très bien fait. J'ai tout de même vu quelque chose d'assez "choquant" c'est le fichier "src/niveaux/nombre-niveaux" il contiend le nombre 5, j'ai bien compris pourquoi mais ça me parait tout de même un peu bizarre, si c'aurait été moi j'aurai listé les fichiers .lvl dans le dossier puis j'aurais d'abord chargé le niveau 1, si il existe, et si il n'existe pas je vais charger le niveau 2, si il existe, et si il n'existe pas le 3 etc... jusqu'à ce que j'arrive au nombre de fichier .lvl contenu dans le dossier.

Bilan: je pense que c'est du bon boulot, mais c'est sur que je suis loin d'être assez bon pour pouvoir te conseiller dans quoi que ce soit je laisse donc libre parole aux autres membres bien plus qualifié que moi ;)

OpenSUSE powa!

leo2urlevan
# le 10/01/2010 à 16h46

Group : Member

Bonjour, merci de ton commentaire.

Normalement, on ne devrait pas avoir besoin de libsdl-image, je vais régler ça, merci de l'avoir notifié.

Pour l'erreur de compilation, merci de le faire remarquer ; en fait c'est normal il faut d'abord effectuer un nettoyage des fichiers objets avant de recompiler avec la nouvelle interface make clean make INTERFACE=NCURSES J'ai rajouté la remarque dans le LisezMoi, ça va partir dans le SVN tout à l'heure.

Pour ce qui est de la lenteur au démarrage, c'est très étrange... Chez moi ça démarre direct, je suppose que tu as une petite configuration ? Ce serait pas mal d'avoir d'autres retours pour comparer, mais y a pas beaucoup de monde apparemment...

Pour le coup du "Appuyez sur A"... Fallait lire mon texte jusqu'à la fin :p c'est la dernière remarque que je fais, dans un NB à la fin. Cet affichage sera supprimé.

Pour le chargement du nombre de niveaux, c'est une forme plus propre à mon avis de faire comme ça, mais moins élégante, il est vrai. Sinon, pour ce qui est du code SDL, il n'y en a que dans InterfaceSDL, tous les autres modules sont indépendants de l'interface graphique (tout le principe de la conception ! si tu as le temps de lire un peu ce que j'avais écrit au dessus).

Merci du test en tous cas. A plus