Modifications des diagrammes UML

publicité
BERTHO David
RIGAU Jean-Louis
LO02 - Java
Java
Jeu de la vie avec des trolls
Université de Technologie de Troyes
1
BERTHO David
RIGAU Jean-Louis
LO02 - Java
Introduction
Ce rapport présente la deuxième partie du projet de création d’un jeu de la vie qui met en
scène différents personnages qui interagissent. Il fait suite à la modélisation UML de ce
projet, et présente la partie de programmation Java, les modifications faites aux diagrammes
UML, ainsi que les difficultés et les points que nous n’avons pas pu terminer.
Modifications des diagrammes UML
Les diagrammes n’ont pas été fondamentalement modifiés, mais il y a eu de nombreuses
modifications, principalement des ajouts d’accesseurs. Nous avons aussi ajouté des variables
en rapport avec la gestion de la mort. Au début nous pensions balayer toutes les cases et
supprimer les morts mais lors des essais nous nous sommes rendus compte qu’il était possible
de se reproduire avec les morts, de les manger, et de faire n’importe quelle action avec eux.
Cela posait un léger problème de logique et d’éthique, que nous avons dû résoudre.
Classe case :
Méthodes ajoutées :
getGibierMort
ajouterGibierMort : incrémente le nombre de gibiers morts d’une case
getNaissances
ajouterNaissance : ajoute une naissance dans la liste des naissances de la case.
viderNaissances : vide la liste des naissances de la case.
toString : cette méthode permet de retourner la liste des « habitants » d’une case sous forme
de chaîne de caractères.
Classe JeuDeLaVie
Attributs ajoutés :
Longueur / largeur : taille du tableau
Nb_tours : nombre de tours de la partie, dans le cas où les tours passent tout seuls
Université de Technologie de Troyes
2
BERTHO David
RIGAU Jean-Louis
LO02 - Java
Méthodes ajoutées :
getPlateau
tableauPlein : permet de savoir si le tableau est plein. Cela permet par exemple d’éviter
d’ajouter des gibiers quand aucune case n’est libre
determineSexe : cette méthode compte le nombre de mâles et de femelles et détermine le sexe
des futures naissances, dans le but d’équilibrer la population.
Classe Personnage
Attributs ajoutés :
type
mort : contient l’état d’un personnage
Méthodes ajoutées :
getType
setMort / getMort
getcaseCourante
Classe Reproducteur
Attributs ajoutés :
ageMax
ageReproduction
mortDeFaim
nbTourAvtRepas
nbTourAvtReproduction
Méthodes ajoutées :
getSexe
getAge
getAgeReproduction
setDerniereRelation
setDernierRepas
setRepas
Université de Technologie de Troyes
3
BERTHO David
RIGAU Jean-Louis
LO02 - Java
Classe Humain
Méthodes ajoutées :
getPouvoir
toString
Classe Troll
Méthodes ajoutées
tuerTroll
toString
Classes Gibier et Sorcier
Méthode ajoutée :
toString
Université de Technologie de Troyes
4
BERTHO David
RIGAU Jean-Louis
LO02 - Java
Ajout de classes
Nous n’avions pas modélisé certaines fonctions du programme dans le diagramme initial.
Nous avons créé 2 nouvelles classes : InterfaceBD qui gère la base de données, et
FenetreJeuDeLaVie qui est l’interface graphique.
Interface graphique :
L’interface montre le tableau de jeu avec le contenu de chaque case. Chaque case est un
bouton sur lequel il est possible de cliquer pour avoir des informations détaillées dans le cadre
en haut à droite. La zone de texte affiche les événements de chaque tour. Il faut cliquer sur
Tour suivant pour faire passer les tours. Enfin les options de sauvegarde et de chargement de
partie sont dans le menu Fichier.
Université de Technologie de Troyes
5
BERTHO David
RIGAU Jean-Louis
LO02 - Java
Base de données :
--- Structure de la table `case`
-CREATE TABLE `case` (
`id_case` int(25) NOT NULL auto_increment,
`id_partie` int(25) NOT NULL default '0',
`arbre` int(1) NOT NULL default '0',
`x` int(2) NOT NULL default '0',
`y` int(2) NOT NULL default '0',
PRIMARY KEY (`id_case`)
) TYPE=MyISAM;
-- ---------------------------------------------------------- Structure de la table `partie`
-CREATE TABLE `partie` (
`id_partie` int(25) NOT NULL auto_increment,
`nom_partie` varchar(30) NOT NULL default '',
`nb_humain` int(5) NOT NULL default '0',
`nb_troll` int(5) NOT NULL default '0',
`nb_tour` int(5) NOT NULL default '0',
PRIMARY KEY (`id_partie`)
) TYPE=MyISAM;
-- ---------------------------------------------------------- Structure de la table `personnage`
-CREATE TABLE `personnage` (
`id_personnage` int(25) NOT NULL auto_increment,
`id_case` int(25) NOT NULL default '0',
`type` varchar(30) NOT NULL default '',
`sexe` int(1) default NULL,
`age` int(5) default NULL,
`derniere_relation` int(5) default NULL,
`dernier_repas` int(5) default NULL,
`repas` varchar(30) default NULL,
`pouvoir` int(2) default NULL,
`enchante` int(1) default NULL,
PRIMARY KEY (`id_personnage`)
) TYPE=MyISAM;
Université de Technologie de Troyes
6
BERTHO David
RIGAU Jean-Louis
LO02 - Java
Actions des personnages
Nous avons défini les priorités suivantes pour les actions des personnages.
Un troll va d’abord essayer de se reproduire (cette priorité a la reproduction a pour but de
permettre aux trolls de résister plus longtemps à la domination humaine). Ensuite il va essayer
de manger un fruit, puis un gibier. Puis, si il n’a pas faim, si le troll est enchanté, il va tuer un
troll voisin, sinon il va tuer un humain voisin. Enfin si aucun autre choix n’est possible, il se
déplacera.
Un humain n’a pas la même philosophie de la vie, il ne tentera de se reproduire que si les
conditions sont favorables. L’humain ne veut pas être dérangé !
Il va donc d’abord manger si il a faim, pour reprendre des forces (en essayant d’abord de
cueillir des fruits, car c’est moins fatiguant que chasser). Puis il assurera sa sécurité en
enchantant ou en tuant un troll. Enfin, une fois les environs sécurisés, il pourra se reproduire
tranquillement.
Déroulement d’un tour
Nous avons tout d’abord tenté de créer une liste des personnages du jeu, et de parcourir cette
liste pour faire passer le tour. Cette technique a posé un problème puisque la liste était triée
par type de personnage. Tous les humains faisaient leurs actions, puis les trolls, … Je jeu
n’était donc pas équilibré puisque les humains pouvaient tuer tous les trolls qu’ils pouvaient
en premier.
Nous avons donc programmé le déroulement d’un tour de la façon suivante.
Chaque case est contenue dans une liste, et contient une liste de la population. Le jeu fait un
balayage de toutes les cases et de toutes les populations.
Université de Technologie de Troyes
7
BERTHO David
RIGAU Jean-Louis
LO02 - Java
Problèmes rencontrés
Le principal problème a été la gestion du temps. Nous ne pouvions pas vraiment commencer
le rapport final sans avoir fini le programme. Et pendant la programmation (qui s’est avérée
plutôt longue), chaque résolution de problème apportait de nouvelles erreurs. Il a donc fallu
décider de s’arrêter même si toutes les fonctions n’étaient pas implémentées et qu’il restait
des bugs.
Un premier problème non résolu est l’équilibre des forces en présence. Les humains sont bien
plus forts que les trolls, qui se font systématiquement exterminer. Nous avons essayé de
résoudre ce problème en permettant aux trolls de se reproduire plus souvent, de jeûner plus
longtemps, mais cela ne faisait que repousser leur extinction. Nous avons alors accepté le fait
que les humains soient les plus forts.
Un autre problème est apparu lorsque nous avons fait des essais sur de nombreux tours (+ de
500 tours). Après avoir exterminé les trolls, les humains étant en paix, ils décident de se
reproduire à outrance. Mais malgré l’aspect aléatoire de la reproduction, les humains du haut
du tableau se reproduisaient exponentiellement. On avait alors un attroupement sur les 3 ou 4
rangées du haut, avec plusieurs dizaines d’humains par case au bout de 1000 tours. Nous
avons alors décidé de faire naître les personnages dans une case aléatoire au lieu de la case
des parents. Cette méthode n’est pas vraiment logique mais nous a permis d’avoir un tableau
équilibré.
Il y a aussi eu un problème dans le remplacement des gibiers morts. Si les personnages sont
en période de forte reproduction, la population totale peut augmenter sensiblement. Toutes les
cases sont alors occupées. Dans nos premières versions, ce cas de figure faisait planter le jeu
car il fallait ajouter les gibiers mais il n’y avait plus de case libre. Nous avons alors ajouté un
test qui vérifie ne place des gibiers que si il reste de la place pour eux. Cela permet aussi de
réguler la population : sans assez de nourriture, les personnages meurent de faim, et des places
se créent.
Nous avons également eu des problèmes lors de la programmation de l’interface avec la base
de données. Nous l’avons programmée pour qu’elle récupère les paramètres de connexions,
mais ça n’a pas marché. Nous n’avons pas réécrit cette classe en codant les paramètres en dur
car nous n’avions plus le temps de réfléchir aux requêtes, à la façon de récupérer les données
à sauvegarder, …
Université de Technologie de Troyes
8
BERTHO David
RIGAU Jean-Louis
LO02 - Java
De nombreux problèmes ont ensuite suivi lors de la programmation de l’interface graphique.
Tout d’abord le bouton lancement fait « planter » le programme. Nous avons pensé qu’il
aurait fallu utiliser des processus pour afficher le résultat et faire passer les tours en même
temps, mais nous n’avons pas pu trouver de solution par manque de temps. Nous avons donc
supprimé ce bouton.
Seule le mode manuel est donc accessible en graphique, le mode automatique étant accessible
en console en précisant le nombre de tours à effectuer.
Conclusion
Ce projet nous a permis de nous plonger plus en profondeur dans Java et la programmation
objet. Nous nous somme aperçu que Java est un langage qui offre de nombreuse possibilités,
et que des fonctions avancées comme la gestion des bases de données ou des interfaces
graphique sont relativement accessibles (après un léger effort de documentation).
Il a également mis en évidence l’intérêt de la modélisation UML. Touts les problèmes
auxquels nous avons pensé ne sont pas apparus pendant la programmation, et cela nous a fait
gagner un temps énorme. Faire face à certains problèmes que nous avons réglé plus tôt grâce à
la modélisation aurait impliqué de modifier en profondeur le code. Et il faut avouer qu’il est
plus simple de modifier le code en profondeur quand le code en question se limite à des
schémas.
Université de Technologie de Troyes
9
Téléchargement