Projet Zuul de conception orientée objet en Java d'un jeu d'aventure
Forum des exercices du projet Zuul
Exercice 7.30
Implement an extension that allows a player to pick up one single item. This includes implementing two new commands : take and drop.
Attention :
Ne cherchez pas dans cet exercice à autoriser
plusieurs items portés par le joueur, ce sera le sujet de l'exercice
suivant, une fois que take et drop fonctionneront parfaitement.
Ne pas oublier de lire les échanges ci-dessous pour mieux comprendre la bonne manière de réaliser cet exercice.
J'ai réussi à implémenter take et drop à un détail près : lorsque je prends un objet, il reste tout disponible dans la pièce. Je ne vois pas comment enlever un objet d'une pièce (ajout d'une méthode similaire à setItem() mais pour enlever un objet ?). Pouvez-vous m'indiquer comment faire ? Merci.
Vous avez bien compris qu'il faut enlever l'Item de la Room.
Donc, il faut effectivement programmer une méthode removeItem qui, au lieu d'ajouter un Item à la HashMap comme dans addItem, enlèvera un Item de la HashMap.
Je vous rappelle que des ressources sont mises à votre disposition, dont un mini-cours esiee sur la HashMap.
Bonjour,
Il faut bien créer les procédures take et drop dans la classe Player ?
Du
coup je fais comment à chaque fois que je dois afficher juste une
phrase par aGui.println(), je ne vais pas à chaque fois créer une
méthode particulière dans la classe GameEngine juste pour afficher une
phrase particulière ...?
La réponse à votre 1ère question est simplement : oui.
Par contre, pour votre seconde question, je ne vois vraiment pas pourquoi il faudrait "créer une méthode particulière" pour chaque message puisque la méthode println peut afficher n'importe quel message.
De plus, je ne vois pas pourquoi créer même une seule méthode, puisque cette méthode existe déjà dans UserInterface.
Votre problème, je suppose, est tout simplement d'avoir accès à cette UserInterface, et donc de prévoir un attribut aGui dans Player, et surtout de l'initialiser correctement.
Non, le Player
n'a pas à s'occuper du "comment" ("Comment produit-on un affichage ?"),
mais doit s'occuper du "quoi" ("Que veut-il afficher ?"). Les appels à println() ne posent donc aucun problème (à partir du moment où vous avez rendu la GUI
accessible dans le Player).
Certains ont choisi de laisser les affichages dans GameEngine et leur Player se contente de produire une String à afficher. Cela ne fonctionne évidemment que si l'on a besoin que d'un seul affichage pour chaque commande ...
Relisez à cet égard ma dernière réponse à l'exercice 7.29 (dimanche 3 mai 2015, 18:49).
Un étudiant a écrit :
Je récupère donc une String, ma question est la suivante:
Je dois forcément la récupérer de ma HashMap mais je n'ai pas trouver comment l'utiliser en dehors du traitement de base effectuer dans les exercices antérieures
Si vous aviez à votre disposition une HashMap<String,Item> qui, à chaque nom d'item, associe l'Item correspondant,
il vous suffirait d'appeler la méthode qui retourne la valeur associée à une clé pour résoudre votre problème,
comme vous l'avez fait pour récupérer la Room qui est associée à chaque direction dans une pièce.
Bonjour,
Je suis bloquée avec ma méthode take().
J'ai créé dans Player une liste d'items, car certaines de mes pièces comportent plusieurs items et je peux ainsi les ajouter/enlever de la liste avec les méthodes removeList et putList.
J'ai écrit la méthode take suivante :
.../... code supprimé pour ne pas influencer les futurs lecteurs .../...Cela compile, mais quand je tape la commande take nomItem dans le jeu, le terminal s'ouvre encore et cette phrase apparaîtrait :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
et me ramène à cette partie du code :
Items vItem = aPlayer.getRoom().getItems().get(vNom);
Que puis-je faire pour y remédier ?
Merci.
Il faut décomposer la ligne de l'erreur pour savoir quel morceau vaut null, ou ajouter des System.out.println :
- aPlayer ?
- aPlayer.getRoom() ?
- aPlayer.getRoom().getItems() ?
Ensuite (comme pour résoudre toute NullPointerException), il faudra chercher à "prouver" que chaque morceau ne peut pas valoir null.
Quand, pour l'un des morceaux, vous ne trouverez pas l'instruction qui aurait dû le rendre non null, vous comprendrez ce qu'il faut ajouter.
Un étudiant a écrit :
Je bloque sur l’exo 7.30 je ne vois pas où placer take and drop.
Je l’ai mis dans le gameEngine
cependant pleins de personnes me disent qu’ils faut les placer dans player
par conséquent je suis un peu perdu.
Si vous pouvez m’éclairer là dessus.
Ce n'est pas une question si simple.
Les méthodes
addItem et removeItem
doivent être dans Player
(et dans Room !)
puisqu'elles manipulent directement la HashMap d'items.
Maintenant, les méthodes qui gèrent les commandes take
et drop ont bien sûr vocation à être
dans la classe GameEngine comme pour toutes les autres commandes.
Réseaux sociaux