Sollaud Timothée Girard Alexis Rapport de projet 20 avril 2012
Table des matières Introduction 3 1 Présentation du projet......................................... 3 2 Présentation de l environnement de développement......................... 3 2.1 Outil de gestion de version.................................. 3 2.2 Éditeur de code......................................... 3 2.3 Logiciel de débogage...................................... 3 2.4 Système de documentation automatique........................... 3 2.5 Système d édition de texte................................... 3 Développement 4 1 L orientation choisi........................................... 4 1.1 L organisation......................................... 4 1.2 Les interactions......................................... 5 1.3 La configuration........................................ 5 2 La chronologie du developpement................................... 6 3 Les difficultés rencontrées....................................... 6 Bilan 7 2
Introduction 1 Présentation du projet Dans le cadre de l unité d enseignement "environnement de développement et projet de programmation" de notre quatrième semestre de formation à la Licence d Informatique, il nous a été proposé de réaliser un programme simulant la vie de poissons. Celui-ci devait être réalisé en binôme et être écrit en C. Pour cela, nous disposions de différents outils (gestion de version, profiling de code, debbugging, documentation automatique de code) sur notre environnement de développement. 2 Présentation de l environnement de développement 2.1 Outil de gestion de version Le projet étant un travail de groupe, nous avons décidé d utiliser Subversion afin que chacun puisse disposer d une copie de travail chez lui. Nous avons choisi ce logiciel car il nous a été présenté durant le semestre et parce qu il en existe une version pour Windows : TortoiseSVN. 2.2 Éditeur de code L édition du code source de notre projet a été réalisée sous emacs. En effet, bien que nous ayons découvert éclipse durant le semestre, emacs nous a semblé être plus adapté au langage qui nous était imposé : le C. (Éclipse étant plutôt utilisé pour coder en java.) Au départ, nous avons également travaillé sous Visual Studio 2010 (une version MSDN étant mise à notre disposition) mais nous avons rapidement abandonné car, bien que très complet, cet outil ne prend pas en compte le standard c99. 2.3 Logiciel de débogage Pour nous aider dans le développement de notre programme, nous avons utilisé GDB. Cet outil sur lequel nous avons été formé est pratique et rapide d utilisation. De plus, c est l un des seuls disponibles sous emacs. Nous avons également eu l occasion d utiliser le débogueur intégré à Visual Studio 2010. 2.4 Système de documentation automatique Afin de réaliser une documentation claire et complète, nous avons utilisé Doxygen. Cet outil est très rapide à prendre en main et offre un résultat, très complet, disponible sous plusieurs formats (L A TEX, HTML,...). 2.5 Système d édition de texte Ce rapport a été réalisé sous Texmaker en L A TEX. 3
Développement 1 L orientation choisi 1.1 L organisation Les espèces Il y a trois espèces de poisson définies dans une énumération {Bar, Sar, Shark}. Chaque espèce définit des caractéristiques qui lui sont propres : le nombre de représentants et un booléen qui indique s il s agit d une espèce prédatrice (cas des Shark). D autres propriétés concernent ses représentants : la vitesse de déplacement, une fourchette de distance de vue, le chemin de l image du poisson en bonne santé, le chemin de l image du poisson mourant. Les poissons Les poissons sont caractérisés par leur espèce. Chaque poisson a un poids initial, une taille, une position, une direction (monter/descendre), une distance de vue (piochée dans l intervalle des possibles de son espèce), une vitesse (fonction de son espèce) et appartient à un banc. Afin de simplifier l ensemble et de nous permettre d utiliser des images de poisson "réalistes", nous avons fait le choix de faire constamment avancer les poissons de gauche à droite. Pour simplifier la gestion des bancs et des mouvements, nous avons placé chaque poisson dans un banc. Afin d apporter du réalisme à la simulation, chaque fois que le poisson se déplace, il perd 1 de poids. Lorsque son poids est critique, il est représenté en utilisant l image de son espèce mourante. Si son poids arrive a zero, le poisson meurt et disparaît. Toujours dans le but d accroître le réalisme, chaque poisson dispose d une distance de vue qui lui est propre. Celle-ci est déterminée selon le minima et le maxima de l espèce à laquelle il appartient. Pour simplifier la gestion des collisions, son champ de vision est représenté par une surface rectangulaire qui englobe sa moitié avant, afin de lui permettre de voir une partie des côtés. Les bancs Un banc comporte un leader, une liste de poissons membres et une direction.comme nous l avons vu précédemment, chaque poisson appartient à un banc. Ainsi, lorsqu un poisson voit un autre poisson de la même espèce, leurs bancs fusionnent. Les poissons se déplaçant toujours dans le même sens, il nous a paru logique de choisir pour leader le poisson le plus avancé (c est à dire le plus à droite). Le banc ainsi formé se réduit automatiquement dès lors que l un des membres n est plus en mesure de voir au moins un congénère appartenant au même banc, alors il forme son propre banc. Le mouvement du banc est déterminé aléatoirement. Il est identique pour chaque membre. Cependant, chaque poisson continu a gérer ses propres interactions. La nourriture La nourriture apparaît aléatoirement à intervalle de temps régulier. Elle possède une image pour sa représentation graphique, une position (fixe) et le bonus de poids qu elle apporte à celui qui la consomme. Elle peut être consommée que par les espèces non prédatrices. En effet, dans un soucis de réalisme, nos prédateurs ne s intéressent qu à des proies de plus grande taille. Les obstacles Les obstacles sont placés au chargement du programme et sont fixes. Ils sont caractérisés par l image qui les représente ainsi que leur position. Nous avons choisi de définir leur position en fonction de la taille de la fenêtre afin qu aucun obstacle ne puisse se trouver hors écran. 4
1.2 Les interactions Entre poissons Lorsque deux poissons de la même espèce se voient, ils forment un banc et se déplace alors de façon synchronisée. Lorsque un poisson d une espèce de proie voit un prédateur, il s éloigne jusqu à ne plus le voir. Lorsqu un poisson prédateur voit une proie, il s en approche. S il la touche, alors la proie est mangée et disparaît. Le prédateur se duplique et gagne 1/3 du poids de sa proie (Il manque 2/3 : on peut imaginer que le premier tiers a été perdu durant le combat et l autre tiers n est pas digéré.) En cas de collision entre deux poissons de la même espèce ou d espèces non prédatrices, les poissons sont placés l un derrière l autre. Entre poisson et nourriture Seul les espèces non prédatrices s intéressent à la nourriture. Lorsqu un poisson voit une nourriture, il se dirige vers elle. Lorsqu un poisson touche une nourriture : il la mange. Celle-ci disparaît et le poisson qui a mangé se duplique et gagne le bonus de poids qu elle apporte. Entre poisson et obstacle Lorsqu un poisson voit un obstacle, il l évite en se dirigeant au-dessus ou au-dessous, selon ce qui est le plus rapide. Lorsqu un poisson touche un obstacle, il est déplacé (au plus proche) juste au dessus ou juste au dessous de celui-ci. Les priorités Voici l ordre des priorités que nous avons établi en fonction de ce qui nous a semblé le plus réaliste : Éviter les obstacles. Éviter les prédateurs. Éviter les autres poissons/former des bancs. Aller vers la nourriture. 1.3 La configuration Afin de permettre à l utilisateur d adapter la simulation, nous avons mis a sa disposition un fichier de configuration (config.ini). Celui-ci permet de modifier : La longueur de la fenêtre : ScreenWidth, entier La hauteur de la fenêtre : ScreenHeight, entier L image d arrière plan : Background, chaîne de caractères Le nombre de poisson maximum : NbFish, entier Le nombre de prédateur maximum : NbMaxPred, entier Le poids de départ des poissons : WeightStartingFish, entier Le poids à partir duquel le poisson est considéré comme mourant : WeightDyingFish, entier Le nombre de nourriture maximum : NbFood, entier La fréquence d apparition de la nourriture (en seconde) : TimeFoodPop, décimal Le bonus de poids apporté par la nourriture : WeightFoodBonus, entier A l exécution, si le fichier config.ini n est pas trouvé, il est automatiquement créé avec des valeurs par défaut. 5
2 La chronologie du développement D un commun accord, nous avons commencé par traiter un simple poisson se déplaçant aléatoirement de la gauche vers la droite. Ensuite, nous avons fait en sorte que quand celui-ci atteint un bout de la fenêtre, il réapparaît du côté opposé. Nous avons rapidement intégré la notion d espèce pour caractériser le poisson. Ensuite nous nous sommes intéressés aux obstacles puis à la gestion des collisions poisson/obstacle. La nourriture a ensuite été intégrée ainsi que la gestion des collisions poisson/nourriture. D autres poissons et d autres espèces sont venues compléter le programme afin de gérer les collisions entre les poissons. Le fichier de configuration a été mis en place et les différents paramètres ont été appliqués au programme. La gestion des bancs a finalement été ajoutée. Enfin, de nombreux ajustements ont été appliqués sur l ensemble du programme et les commentaires nécessaire à la génération de la documentation ont été ajoutés. Nous avons également rédigé ce rapport. 3 Les difficultés rencontrées La première erreur que nous avons eu à résoudre fût la suppression correcte d un poisson dans le tableau de poisson. Afin de conserver un tableau dont toutes les cases contiennent un poisson existant, nous avons choisi d écraser la case correspondante au poisson à supprimer par le contenu de la dernière case occupée. Ainsi, le tableau reste intégralement rempli de poissons, ce qui évite d avoir à tester son contenu à chaque fois. Nous avons fait de même pour les bancs et la nourriture. Au niveau de la gestion des collisions, notre première idée a été de gérer les collisions en même temps que la vue. Mais, cela nous a finalement paru trop compliqué et ne semblait pas répondre correctement à la modularité du code demandée. Aussi, nous avons séparé le choix du mouvement du poisson selon sa vue de la gestion des collisions pures. La principale difficulté rencontrée a été lorsqu on a voulu mettre en place les valeurs limites provenant du fichier de configuration. En effet, notre tableau de poisson était au départ défini avec une taille fixe et nous avions utilisée la notation avec les crochets. Nous nous étions donc contenté de mettre la variable issue de la configuration dans ces crochets. Tout cela compilait et c est à l exécution que le résultat était très aléatoire : des poissons disparaissaient, des obstacles également, tout les poissons passaient d un coup en haut de l écran. Bien que nous savions que ce comportement étrange provenait de la définition du tableau, puisque auparavant tout fonctionnait normalement, nous n avons pas su résoudre ce problème seul et avons profité d une séance de TP pour vous mettre a contribution. Finalement, cela nous a permis de comprendre qu il y a en fait une différence pour l initialisation d un tableau déclaré avec des crochets par rapport à une déclaration avec astérisque. En fin de développement, après avoir implémenté la gestion des bancs, le logiciel se fermait violemment en renvoyant une erreur, qui pouvait être de plusieurs types (memory corruption, double free,...). Après de nombreuses relectures des fonctions liées aux bancs, nous avons repéré que le problème provenait d une simple accolade mal placée sur la fermeture d une boucle "for". L effet papillon prend alors tout son sens! 6
Bilan Nous avons beaucoup apprécié ce projet qui nous a permis de mettre en œuvre une grande partie de notre connaissance du langage C et de mobiliser des techniques d analyse et de développement sur un sujet concret et relativement ouvert. De plus, cette période a été pour nous l occasion de découvrir et d apprendre à manipuler de nombreux outils de développement tels que Subversion, emacs, gdb, visual studio 2010, doxygen et Texmaker. Outre l aspect technique, ce projet nous a donné l occasion de travailler en groupe et nous a donc appris à nous organiser et à gérer le temps qui nous était imparti. C est pour nous une réussite puisque nous sommes parvenu, dans les temps, au résultat escompté. 7