TER 2010 Réalisation d'un plugin pour la gestion d'équipes et de tournois pour Warbot Encadrant : Jacques FERBER FABRE Basile OLIVIERI Thomas 1/23 BELAMGHARI Aadnan Table des Matières Introduction 1. Warbot 1. Présentation 2. Motivation de notre sujet 2. Aspect technique 1. Outils et langages 2. Existant 3. Interface graphique 1. Aspect général 2. Équipe 3. Agents 4. Tournois ? Génération de code XML 1. XML et Warbot 2. Structure de données 3. Présentation de JDOM 4. Formalisme Conclusion 2/23 Documentation 1.Webographie 2. Existant Introduction Dans le cadre de la première année du Master d'Informatique de la Faculté des Sciences de Montpellier, nous avons été amenés à réaliser un TER. Le sujet que nous avons choisis consistait à implémenter un ajout (« plugin» en anglais) au programme de simulation de combat « Warbot », sujet encadré par M. Ferber. Ce plugin devait permettre de gérer simplement les différentes équipes de robots et d'en créer de nouvelles. Il devait également permettre de créer des tournois, qui sont en fait des enchaînements de cartes. Le but étant de pouvoir tester simplement une Intelligence Artificielle dans de nombreuses situations différentes (monde plus ou moins vaste, une carte avec beaucoup de nourriture, un carte avec beaucoup d'obstacles, une carte avec de nombreux robots, une sans certains types de robots, etc...). On pourrait ainsi comparer deux Intelligences Artificielles différentes sur plusieurs types de terrains. Une autre spécificité du programme était qu'il devait être ouvert à une éventuelle évolution du logiciel « Warbot », tant en termes d'ajout de nouveaux types de robots, que d'ajout de nouvelles propriétés pour les robots. Enfin, il fallait que cet ajout puisse communiquer avec le programme « Warbot » sans que ce dernier ne subisse de modifications. Pour cela, notre plugin devait intégrer les informations renseignées par l'utilisateur à travers l'interface, et générer les fichiers XML correspondants. Ces fichiers n'auraient alors plus qu'à être lus de manière automatique au lancement de « Warbot ». Au niveau de la répartition des tâches, après la première réunion avec l'encadrant de projet M. Ferber, nous avons choisi de commencer par étudier le 3/23 projet existant avant de vraiment diviser les tâches à effectuer. La motivation initiale ne dura pas et bien que Basile FABRE tenta à plusieurs reprises de redonner au groupe sa dynamique, il dût travailler seul pendant la durée du semestre. Le groupe se remis a fonctionner à plein effectif lorsque la date d'échéance fût trop proche pour être ignorée plus longtemps, mais malheureusement beaucoup de temps s'était alors écoulé, ne permettant pas à l'équipe de répondre complètement au sujet. Warbot 1.Présentation Notre projet consiste en la réalisation d'un plugin pour le logiciel « Warbot ». Warbot est un jeu mettant en scène deux équipes de robots qui s'affrontent dans un univers en 2D. Chaque équipe a pour but de détruire la base de l'adversaire. L'une des particularités de Warbot réside dans le fait que c'est un jeu pour développeurs : le joueur va programmer l'intelligence de ses robots, mais il n'aura par la suite aucun autre contrôle sur le jeu. Il ne pourra plus interagir avec ses robots une fois la partie lancée, et il ne peut en aucun cas modifier les caractéristiques physiques du robot. Seule la supériorité dans l'intelligence artificielle pourra assurer la victoire. 4/23 Warbot 2. Motivation de notre projet Comme expliqué plus avant dans le rapport, notre projet consistait à réaliser un plugin pour Warbot afin d'offrir au joueur une interface au travers de laquelle il serait aisé de créer une équipe et des tournois. 5/23 De nos jours, la procédure est bien plus complexe. Il faut que le joueur retrouve le fichier appelé « Warbot05.fml », situté dans ./MadKit-4.2.0 / lib / formalisms. Ce fichier, écrit en XML, contient toutes les équipes déjà présentes, ainsi que les différents objets du monde (mur, nourriture, etc...). Le joueur doit alors copier une équipe déjà existante (en modifiant certains paramètres) afin d'ajouter son équipe à la liste. Il doit également créer un dossier avec le nom de son équipe dans . / MadKit-4.2.0 / plugins / warbot04 / src / warbot / avec à l'intérieur les sources Java contenant le code de l'Intelligence Artificielle de ses robots. Cette procédure est bien trop lourde pour être compatible avec une utilisation conviviale du logiciel, et nuit grandement à sa popularité. L'objectif de notre projet est clair : remplacer cette épreuve purement technique par une simple étape au travers d'une interface agréable, sinon efficace. Aspect Technique 1.Outils et langages Pour ce projet, le langage utilisé fût Java, développé par Sun Microsystems. C'est un langage orienté objet qui offre une bonne portabilité sur les différents systèmes d'exploitations pour les programmes. On est ainsi assuré d'avoir le même 6/23 rendu final quelle que soit la machine qui l'exécutera. Le langage est assez proche de C++, mais il a simplifié certains aspects de la programmation, comme par exemple les pointeurs, ou l'héritage multiple remplacé par l'implémentation d'interfaces. En Java, hormis les types primitifs, tout est objet. L'intérêt d'utiliser ce langage est d'une part la relative simplicité d'utilisation par le programmeur, et d'autre part l'existence de librairies et de bibliothèques riches en fonctions et procédures disponibles pour le programmeur. Par exemple, la très fournie bibliothèque graphique « Swing » permet de créer simplement des interfaces graphiques riches. En terme d'outils, la recherche et la documentation furent effectués avec le navigateur Web Mozilla Firefox. Le code fût écrit avec Eclipse ou Kate (éditeur de texte adapté à la programmation, et ensuite compilé avec un simple terminal.) selon les affinités de chacun. Aspect Technique 2. Existant 7/23 En 2005, une autre équipe d'étudiants avait eu le même sujet. Le résultat n'ayant pas été concluant (l'application était bien trop complexe et lourde par rapport aux fonctions demandées), M. Ferber nous a réassigné ce sujet cette année, et nous a fournis une copie de cet existant, afin de nous en inspirer. Le programme avait été réalisé par Nicolas MARESCAUX, Laurent MAJCHER, Hélène MOURET et Ludivine CREPIN. Les instructions étaient clairement de ne pas chercher à débugger ni à améliorer ce programme, mais de s'en inspirer pour en créer un entièrement nouveau. 8/23 Aspect Technique 3. Composition de l'application Le programme a été décomposé en 5 packages afin d'harmoniser son organisation : agents data gui teams tournaments A. Package Agents Ce package contient les classes nécessaires à la gestion des agents, c.a.d. À la création, à l'édition et à la suppression. Pour éviter une redondance dans le code, les classes AgentCreator, AgentEditor et AgentDeletor héritent toutes de la superclasse AgentFrame. B. Package Data Ce package n'est a priori pas vraiment utile mais si l'on songe aux améliorations pouvant être apportées, nous avons jugé bon de prévoir une telle éventualité. A l'heure actuelle seule la classe Agent y est présente. Son utilité étant explicite nous ne la développerons pas ici. Il est utile de préciser que cette classe définit est à même de définir chacun des types d'agents présents dans Warbot. C. Package Gui Ici se trouve regroupés les classes qui gèrent l'affichage général de l'application. MainWindow et PopUp crées les fenêtres, ImagePreviewPanel nous permet d'afficher une miniature de l'image sélectionnée lorsqu'on navigue parmi les 9/23 dossiers pour trouver une icône, et enfin Launcher qui contient exclusivement le main() pour démarrer l'application. D. Package Teams Comme son nom l'indique, ce package contient toutes les classes nécessaires à la gestion des équipes. Comme pour les classes régissant les Agents, on a une superclasse TeamFrame qui est héritée par TeamCreator, TeamEditor, et TeamDeletor. On a en plus une classe AgentInfoPanel qui nous permet d'afficher la liste des Agents d'une équipe avec plus d'aisance. E. Package Tournaments Helas non implémenté à ce jour... 10/23 Interface graphique 1. Aspect général Le programme se présente sous la forme d'une fenêtre avec un simple message d'accueil et une image de fond. Un menu en haut a gauche permet de réaliser diverses actions : Agents : Créer un nouveau type d'agents Teams : Créer une nouvelle équipe Éditer une équipe existante Supprimer une équipe existante Help : Le manuel de l'application A propos Tournaments : Lancer un tournoi existant Créer un nouveau tournoi Éditer un tournoi existant Supprimer un tournoi 11/23 Interface graphique 2. Équipe Dans le menu « Teams », l'utilisateur a le choix entre créer une nouvelle équipe, modifier une équipe existante, ou en supprimer une. Voici en premier l'interface de création de l'équipe : elle offre le choix à l'utilisateur de choisir le nom de son équipe, quels robots il veut dans cette équipe, le nom de chaque type de robot, et l'icône qui lui sera associé. 12/23 Lorsque l'utilisateur clique sur « Edit », une fenêtre va lui permettre de configurer l'agent en question, en choisissant son nom, son type parmi la liste des différents agents disponibles, et enfin son icône. Lorsque l'utilisateur clique sur « Choose an icon », un navigateur apparaît pour chercher une icône pour le robot. Ce navigateur inclus une non indispensable mais ô combien pratique aperçu de l'image. La fen êtr e d'é diti on est trè s pro 13/23 che de celle de création, à la différence que l'utilisateur va sélectionner une des équipes parmi celles existantes grâce à un menu déroulant. On peut dynamiquement ajouter ou retirer des agents de l'équipe, et éditer ces agents. L'équipe concerné sera mise à jour dans le fichier XML. Enfin, le menu de suppression d'équipes est une petite fenêtre qui vous permet de sélectionner le nom de l'équipe via un menu déroulant parmi celles présentes dans le fichier XML. 14/23 Interface graphique 3. Agent En allant dans le menu Agent de la barre des menus, l'utilisateur a la possibilité de créer ses propres types de robots en redéfinissant ses composantes. La suppression d'agents se fait de la même manière que pour les équipes, à l'aide d'un menu déroulant. 15/23 Interface graphique 4. Tournois La partie « Tournois » n'a pas été implémentée. 16/23 Génération de code XML 1. XML et Warbot XML est un langage de balisage très populaire dans le milieu de l'informatique pour l'échange d'informations entre les autres langages. Supporté par le World Wide Web Consortium (W3C), il bénéficie de l'avantage que la plupart des autres langages de programmation ont des fonctions pré-construites pour convertir des informations en XML, et inversement. Ainsi, dans un soucis de compatibilité et de facilité d'utilisation, une partie des informations nécessaires au fonctionnement de « Warbot » sont stockées dans des fichiers XML. Les plugins ou rajouts à Warbot, qu'ils soient écrits en Java, en Python, ou n'importe quel autre langage ont aussi leurs informations dans des fichiers XML. Nous avons donc naturellement choisis de stocker notre équipes et nos agents dans des fichiers XML. A chaque interaction entre un fichier XML et l'interface de application, il y a lecture de l'un, et écriture dans l'autre. La conversion se fait grâce à l'API (Interface de Programmation Applicative) JDOM disponible gratuitement sur Internet. 17/23 2. Structure de données La structure d'un agent Warbot en XML est définie par 5 paramètres principaux: son nom son type sa taille (radius) son énergie son rayon de détection des ennemis Ces caractéristiques se traduisent en XML par : <node-desc name="Home" class="warbot.kernel.Home" category="dumb"> <property name="detectingrange">200</property> <property name="energy">12000</property> <property name="radius">20</property> </node-desc> La structure d'une équipe est définie par des agents qui lui appartiennent. Chaque agent aura comme caractéristiques : son nom son icônes sa taille (radius) son équipe son énergie son rayon de détection des ennemis son type de « cerveau » (utilisé pour la programmation de l'IA) Ces caractéristiques se traduisent en XML par : <node-desc name="DocExpl" class="warbot.kernel.Explorer" category="DocJLB"> <icon url="images/warbot/docJLB/DocExpl.gif"/> <property name="radius">12</property> <property name="team">DocJLB</property> <property name="detectingrange">130</property> <property name="energy">1000</property> <property name="brainClass">warbot.demo.docJLB.DocExplorer</property> 18/23 <graphic-element class="warbot.kernel.GBasicBody"> <property name="imageaddress">images/warbot/docJLB/DocExpl.gif</property> <property name="labelLocation">4</property> </graphic-element> </node-desc> Génération de code XML 3.Présentation de JDOM Nous avons utilisé l'API JDom (www.jdom.org) qui permet en quelques lignes de codes de créer et d'éditer des documents XML à partir de Java. L'exemple de code qui suit permet de récupérer les données d'un fichier XML pour les traiter, et enfin actualiser le fichier XML avec les nouvelles données : // Ouverture du fichier XML File XMLFile = new File(pathDuFichierXML) ; SAXBuilder builder = new SAXBuilder(true) ; Document doc = builder.build(XMLFile) ; Element root = doc.getRootElement() ; 19/23 //TRAVAIL sur les données dans Java // ... // Mise a jour du fichier XML XMLOutputter serializer = new XMLOutputter(Format.getPrettyFormat()) ; serializer.output(doc, new FileOutputStream(pathDuFichierXML )) ; Un autre exemple permet quant à lui de créer des balises, et ainsi former une hiérarchie telle qu'on peut la trouver au sein du standard XML: Code Java : Element action = new Element("action") ; action.setAttribute("description","userMessage") ; Element java_method = new Element ("java-method") ; java_method.setAttribute("name", "showUserMessage") ; action.addContent(java_method) ; root.addContent(action) ; Résultat en XML : <action description="userMessage"> <java-method name="showUserMessage"/> </action>*/ Les méthodes les plus compliquées à implémenter furent les méthodes de recherches dans les fichiers XML. Voici par exemple la méthode qui permet de créer la liste de toutes les équipes, afin de remplir le menu déroulant du menu de suppresion d'équipes // On cree un array « team » ArrayList<String> teams = new ArrayList<String>(); boolean exists = (new File(MainWindow.teamsFormalism)).exists(); if (exists) { // on ouvre le fichier XML et on le lit File XMLFile = new File(MainWindow.teamsFormalism); SAXBuilder builder = new SAXBuilder(true); Document doc = builder.build(XMLFile); 20/23 Element root = doc.getRootElement(); // On récupere toutes les équipes Element nodeTypes = root.getChild("node-types"); List<Element> nodeDescs = (List<Element>)nodeTypes.getChildren("node-desc"); for (int i = 0; i < nodeDescs.size(); i++) { // pour chaque équipe Element currentDesc = nodeDescs.get(i); List<Element> properties = currentDesc.getChildren("property") ; for (int j = 0; j < properties.size(); j++) { // on cherche le nom de l'équipe if(properties.get(j).getAttributeValue("name").equals("team")) { if (!teams.contains(properties.get(j).getValue())) { // on l'ajoute à l'array « team » teams.add(properties.get(j).getValue()) ; } } } } } 4. Formalisme Les équipes sont enregistrées dans le fichier Warbot10.fml et les agents dans robots.fml. Ces deux fichiers XML répondent aux critères définis par le formalisme « sedit-formalism.dtd ». Conclusion erreur apporté à nous apporté au programme 21/23 Du point de vue de l'équipe, le projet nous a apporté différentes choses. Tout d'abord, nous avons appris l'importance de l'implication de soi dès le début d'un projet : dans le milieu de l'entreprise, nous n'aurons jamais, contrairement à l'Université, le luxe de pouvoir attendre le dernier moment pour s'impliquer sur un travail. Sur un autre plan Enfin, grâce à notre programme, il permettra à toute utilisateur de pouvoir créer une équipe, voir de nouveau agents à l'aide d'une interface graphique, et plus en manipulant des fichiers source XML. Nous considérons que c'est un atout majeur à Warbot pour se faire connaître et apprécier du public, même restreint à la promotion de l'Université de Montpellier. Documentation 1. Webographie 22/23 Pour trouver des réponses à nos questions, la principale source d'informations fût la JavaDoc en ligne fournie par Sun : http://java.sun.com/j2se/1.4.2/docs/api/ En ce qui concerne XML et donc l'API JDom, nous avons consulté la documentation officielle (http://www.jdom.org/downloads/docs.html) qui s'est avérée suffisante. Il nous est arrivé quelque fois de devoir rechercher sur Internet des informations plus spécifiques. Nous n'avons pas noter chaque source, mais ce furent généralement des forums traitant du domaine de l'informatique. Le moteur de recherche utilisé fût Google. 2. Existant Nous nous sommes inspirés du projet que nous a remis M. Ferber, projet réalisé en 2005 par un autre groupe d'étudiant : Nicolas MARESCAUX, Laurent MAJCHER, Hélène MOURET, Ludivine CREPIN. 23/23