Projet Zuul de conception orientée objet en Java d'un jeu d'aventure
Forum des exercices du projet Zuul
Exercice 7.48
Add characters to the game. Characters are similar to items, but they can talk. They speak some text when you first meet them, and they may give you some help if you give them the right item.
Attention ! Il est probable que le concept de
personnage évolue vers une certaine autonomie dans les exercices
suivants, donc il sera de moins en moins proche d'un Item.
Ne pas oublier de lire les échanges ci-dessous pour mieux comprendre la bonne manière de réaliser cet exercice.
Un étudiant a écrit :
Bonjour,
Je dois créer la classe Character, et permettre aux character de parler au personnage quand il rentre dans la même pièce que les character.
J'ai
pensé stocker l'emplacement du character dans le character lui même,
mais du coup je ne sais pas comment faire pour qu'une autre classe (le
personnage, ou le game engine) puisse dire au character de parler à ce
moment là. Pouvez vous m'aider à trouver comment faire, ou m'indiquer si
je m'y prend mal, s'il vous plait?
Cordialement.
Plusieurs solutions sont possibles.
Il paraît normal que chaque personnage sache dans quelle pièce il est.
Par contre, on peut aussi bien imaginer que le GameEngine connaisse la liste de tous les personnages (et éventuellement leur demande dans quelle pièce ils sont) ou bien que chaque Room connaisse la liste (éventuellement vide) des personnages qui s'y trouvent.
En tous cas, lorsqu'on rentre dans une pièce, la liste des personnages présents doit s'afficher.
Ceux-ci peuvent parler de leur propre initiative ou bien attendre qu'une commande talk soit tapée.
Les Characters ne sont-ils pas des sortes de Players?
D'ailleurs, ne sont-ils pas même des Player?
Tout ce qu'un PNJ peut faire, un player peut le faire, non?
Ainsi, pourquoi ne pas faire directement une classe Character(représentant les personnages non joueurs), dont hériterait la classe Player?
L'étudiant a répondu :
J'ai donc fait une classe abstraite Abstractcharacter.
Etant donné qu'Abstractcharacter est non instanciable (abstraite), est-on forcé de créer deux attributs de types: liste de Player et list de PNJ ou est-ce qu'il est possible de créer une liste combinant les deux?
Tout ce qui peut être mis en commun entre Player et PNJ doit l'être dans AbstractCharacter.
Un étudiant a écrit :
Toutefois, comment savoir à quel Pnj on va donner un objet lorsque l'on appelle la commande DonnerCommand() ?
Faut-il modifier le parser de façon à récupérer un troisième mot? Mais cette solution semble un peu laborieuse, car il faudrait alors modifier toutes les commandes.
On ne peut pas imposer qu'il n'y ait qu'un seul personnage par pièce.
Cela provoque effectivement pas mal de changements de prévoir 3 mots dans une commande, mais ce n'est pas inaccessible (il ne faudrait pas modifier TOUTES les classes de commande).
Une solution moins élégante est de faire le don en 2 temps (donc 2 commandes), par exemple : give pencil puis to Jack, mais il faudra gérer le cas ou le joueur tape to sans avoir tapé give, ou bien accepter les 2 sens, et réinitialiser la situation à chaque déplacement..
La commande 'donner' n'est pas obligatoire.
Pour votre dernière question, les sous-classes sont toujours un moyen élégant de résoudre ce genre de problème. Par contre, ce serait trop lourd, si la seule différence de réaction du personnage tenait dans le message qu'il délivre.
Bonjour,
Je rencontre un problème: pour créer une classe AbstractCharacter dont hériteraient Player et Character, j'ai
besoin de déplacer ma classe Player de son paquetage pkg_game vers
pkg_elements.pkg_characters.
Mon problème survient lorsque je déplace la classe Player. Tant qu'elle est dans pkg_game (contenant également GameEngine et Parser), le jeu fonctionne très bien. Mais dès que je déplace la classe Player dans pkg_elements.pkg_characters, le jeu ne fonctionne plus: lorsque je le lance et entre une commande aller ou prendre, par exemple, cette erreur survient:
Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: pkg_game.GameEngine.getPlayer()Lpkg_game/Player;
J'ai pourtant bien ajouté dans les classes en ayant besoin, la ligne import pkg_elements.pkg_characters.Player;
L'erreur
survient aux lignes appelant des méthodes de la classe Player, mais je
ne comprends pas pourquoi puisque ces méthodes sont bel et bien dans
Player, et que je n'ai jamais eu ce souci auparavant, y compris à
l'exercice 7.47.1 où la quasi-totalité des classes change pourtant de
paquetage. Que faire pour corriger l'erreur?
Suite à un pb technique, je viens seulement d'être prévenu de votre message.
A mon avis, il suffit de faire Rebuild package dans chaque paquetage, y compris éventuellement plusieurs fois sur le même paquetage jusqu'à ce qu'il n'y ait plus d'erreurs de compilation.
Si le pb n'est toujours pas résolu, mettez votre jeu sur votre compte esiee et venez me voir en 5356.
Un étudiant a écrit :
Je travaille actuellement sur l'exercice 7.48, et après avoir créé une classe Character, je tente de placer ce dernier dans le createRooms à l'instar des items et des sorties.
both class pkg_Corps.Character in pkg_Corps and class java.lang.Character in java.lang match"
Dois-je pour cela renommer ma classe Character en par exemple Npc?
Un étudiant a écrit :
1) Étant donné que l'énoncé emploie le verbe 'may', nous ne retirerons pas de points si on ne peut pas donner d'objets aux PNJ.
2) Si vous prévoyez cette possibilité, vous pouvez choisir la solution simple (sans inventaire) ou plus élaborée (avec inventaire).
3)
En ce qui concerne l'aide, la solution la plus simple est bien un
message, mais s'il possède un inventaire, un PNJ pourrait donner un
objet au joueur, ou effectuer toute autre action que vous pouvez
imaginer.
Un étudiant a écrit :
1)
Je suis en train d’essayer de faire l’exercice 7.48 afin
d’ajouter à mon jeu les différents personnages. Je me demandais s’il
était obligatoire de créer une classe AbstracCharacter (comme il n’y a
que les méthodes relatives aux Items qui sera dans les deux classes
Character et Player).
2)
Aussi, concernant les dialogues, je me demandais comment
les implémenter et avec quel type de méthode. En effet, je ne veux pas
que certains personnages répètent à chaque rencontre leurs phrases
d’introduction, je voudrai qu’ils disent une certaine phrase en fonction
de si le joueur les rencontre pour une première fois ou une 5e fois,
les phrases ne seront pas les mêmes.
1)
Ce n'est pas "obligatoire". Par contre, si de plus en plus d'attributs deviennent communs entre
Player et Character,
cela indiquera qu'il vaut mieux qu'elles héritent toutes deux d'une classe AbstractCharacter.
2)
S'il y a plusieurs phrases, il suffit de les mettre dans un tableau, et
d'avoir un compteur qui s'incrémente à chaque fois qu'on en utilise une.
Réseaux sociaux