Forum des exercices du projet Zuul

Exercice 7.31

  
 
Avatar anonfirstname2 anonlastname2
Exercice 7.31
par anonfirstname2 anonlastname2, mardi 3 avril 2018, 00:32
 

Améliorez votre programme pour permettre au Player de porter n'importe quel nombre d'items.

Attention !

  1. Un Item doit obligatoirement être placé dans la pièce initiale du jeu et doit pouvoir être pris par le joueur sans aucune condition préalable.
    Mais cet item peut très bien ne servir à rien dans votre scénario.
    Ceci devra pouvoir être testé dans toutes les versions qu'il vous sera demandé de rendre à partir de maintenant.

  2. La collection d'items que le Player porte ne doit évidemment pas pouvoir être manipulée depuis l'extérieur de la classe Player.

Ne pas oublier de lire les échanges ci-dessous pour mieux comprendre la bonne manière de réaliser cet exercice.

Avatar Nicolas BARTHELEMY
Re: Exercice 7.31 plusieurs Items (parfois identiques)
par Nicolas BARTHELEMY, mardi 26 novembre 2013, 18:37
 

Si on veut avoir plusieurs fois le même type d'objet (exemple : potion), à part changer les noms par potion1, potion2, potion3,... Comment peut-on faire ?

1. On pourrait passer de la gestion :   HashMap<String, Item>

A la gestion suivante :   HashMap<String, Object[]>

Object serait un tableau contenant l'Item dans la 1ère case et un Integer correspondant à la quantité de cet objet dans la seconde.

Mais cette gestion paraît compliquée et impliquerait de supprimer des objets qui sont en double et d'en dupliquer lorsque l'on veut les extraire de la liste d'objets.

2. Ou alors on pourrait remplacer la HashMap par une ArrayList qui contiendra tous les Items et pourra, elle, contenir des doublons. On aurait alors une fonction pour retourner le nombre d'occurrence d'un Item ainsi que les autres fonctions de base pour ajouter/retirer et cette dernière solution nous semble la meilleure.

Avatar Denis BUREAU
Re: Exercice 7.31 plusieurs Items (parfois identiques)
par Denis BUREAU, mardi 26 novembre 2013, 19:59
 

Ce qui est demandé dans cet exercice est de permettre d'avoir plusieurs items différents dans chaque pièce.

Si vous souhaitez pouvoir avoir plusieurs exemplaires d'un même Item, cela complique la gestion des items.

Une solution pourrait être de prévoir dans chaque pièce une deuxième HashMap de types <Item,Integer> pour associer à chaque Item le nombre d'exemplaires de cet Item. On pourrait même admettre que lorsque get renvoie null, cela signifie qu'il y a exactement un exemplaire de cet Item, ce qui permettrait de ne mettre quelque chose dans cette HashMap que lorsqu'il y a plusieurs exemplaires d'un même Item.

Une autre solution me semblant entraîner encore plus de modifications dans la gestion des items serait de remplacer l'actuelle HashMap<String,Item> par une HashMap<String,Items> où la classe Items contiendrait un attribut Item et un attribut int, ce qui obligerait à créer un objet Items pour chaque Item se trouvant dans une pièce.

Avatar Nicolas BARTHELEMY
Re: Exercice 7.31 plusieurs Items (parfois identiques)
par Nicolas BARTHELEMY, mercredi 27 novembre 2013, 11:33
 

Je vois. J'avais en effet pensé à plusieurs HashMap, et utiliser <Item, Integer>.

Mais qu'en est-il de l'utilisation d'une ArrayList, n'est ce pas juste plus simple et efficace ?

Avatar Denis BUREAU
Re: Exercice 7.31 plusieurs Items (parfois identiques)
par Denis BUREAU, mercredi 27 novembre 2013, 13:16
 

D'une façon générale pour cet exercice, la HashMap est préférable à l'ArrayList car dans ce dernier cas, retrouver l'Item associé à son nom (String) peut nécessiter de parcourir toute la liste, alors qu'il suffit d'un get avec la HashMap.

Pour la complication "plusieurs exemplaires d'un même Item", la solution ArrayList obligerait à créer autant d'Item qu'il y a d'exemplaires de cet Item, et à compter le nombre d'exemplaires à chaque fois qu'on voudrait afficher la description ...

Avatar William AFONSO
Re: Exercice 7.31 plusieurs Items (parfois identiques)
par William AFONSO, mercredi 7 mai 2014, 20:09
 

Bonjour, j'ai essayé de faire comme vous l'avez conseillé en créant une hashmap d'item et d'entiers. 

import java.util.HashMap;

private Hashmap<Item, int> items;

Ma classe d'item est bien orthographiée "Item". Pourtant, le compilateur m'affiche 'Cannot find symbol- class Hashmap. Je ne comprends pas pourquoi... pouvez-vous m'aider?

Avatar Jonathan MORELL
Re: Exercice 7.31 plusieurs Items (parfois identiques)
par Jonathan MORELL, mercredi 7 mai 2014, 20:45
 

HashMap ne fonctionne qu'avec des classes. Remplace int par Integer.

Avatar Denis BUREAU
Re: Exercice 7.31 plusieurs Items (parfois identiques)
par Denis BUREAU, mercredi 7 mai 2014, 21:11
 

Ce problème de type primitif existe effectivement, mais il ne peut être la cause de l'erreur indiquée !

Relisez le message d'erreur : c'est Hashmap que le compilateur ne trouve pas.

On pourrait croire qu'on a oublié de l'importer, mais ce n'est pas le cas.
La dernière solution est la coquille typographique ...

Avatar Denis BUREAU
Re: Exercice 7.31
par Denis BUREAU, samedi 31 mars 2018, 17:15
 

Un étudiant a écrit :

Bonjour, j’ai bien compris que cet exercice permet d’avoir plusieurs items différents dans chaque pièce.

Cependant, en lisant les questions/réponses sur le forum j’ai eu des doutes sur la résolution de l’exercice.

L’utilisation de la HashMap<Item,Integer> est utile que si l’on veut avoir un item en plusieurs exemplaire dans une pièce c’est bien cela ?

On peut donc utiliser une ArrayList  si l’on veut uniquement avoir des items différents dans une même pièce?

 


Avatar Denis BUREAU
Re: Exercice 7.31
par Denis BUREAU, samedi 31 mars 2018, 17:25
 

Attention à ne pas tout confondre :
- Qu'une pièce puisse comporter plusieurs items différents, ce qui a été traité à l'exercice 22.
- Que le joueur puisse porter plusieurs items différents, ce qui est demandé pour cet exercice.
- Qu'on puisse avoir plusieurs exemplaires d'un même item, ce qui n'est pas demandé mais avait été proposé par un étudiant.

Que ce soit pour une pièce ou pour le joueur, gérer les items dans une ArrayList nécessite de la parcourir entièrement pour retrouver un item d'après son nom, alors qu'un seule instruction suffit s'ils sont gérés dans une HashMap ...