J'utilise une arrayliste comme mon "inventaire". J'ai des difficultés à comprendre un moyen d'ajouter des multiples du même article sans prendre une place dans "l'inventaire". Par exemple: j'ajoute une potion à mon inventaire. Maintenant, j'ajoute une autre potion mais cette fois au lieu d'ajouter une autre potion à l'inventaire, il devrait plutôt montrer que j'ai: Potions X 2, tout en prenant une seule place dans le tableau. J'ai mangé quelques solutions mais je me sens comme si elles sont mauvaises pratiques. Une solution que j'ai essayée était d'ajouter une variable de quantité à l'article lui-même et d'incrémenter cela. Aidez-moi à trouver une bien meilleure solution? P>
Edit: OK s'il vous plaît ignorer ce qui précède. J'ai eu de très bonnes réponses pour cela, mais ce qui m'a surpris était qu'il n'y avait presque aucun didacticiel sur le rôle de jouant des systèmes d'inventaire du jeu. J'ai fait beaucoup de recherche Google et ne peut pas trouver de bons exemples / tutoriels / code source. Si quelqu'un pouvait me signaler à de bons exemples / tutoriels / code source (peu importe quelle langue, mais préférable Java, voire C / C ++), je l'apprécierais, merci. Oh, et des livres sur le sujet. P>
5 Réponses :
Le moyen habituel de résoudre ce problème (à l'aide de l'API standard) consiste à utiliser une carte Pour à ajoutez quelque chose fort> à l'inventaire que vous faites p> à supprimer quelque chose strong> de l'inventaire que vous pouvez par exemple faire p> code> qui plante un élément au nombre de tels éléments de l'inventaire.
obtenez code>: p>
if (!inventory.containsKey(item))
throw new InventoryException("Can't remove something you don't have");
inventory.put(item, inventory.get(item) - 1);
if (inventory.get(item) == 0)
inventory.remove(item);
Je ne suis pas sûr de cette idée; Dépend de la manière dont l'inventaire représenté bien sûr, mais cela signifie que vous ne pouvez avoir qu'une pile de chaque type d'élément. S'il y a une notion d'inventaire 'Slots', cela ne fonctionnera pas.
Aha, vrai. Ensuite, on ajouterait probablement une liste intermédiaire code> pour les piles. Mais la structure de données commence à être compliquée, alors je ferais probablement une classe quelque part ici.
+1: J'écrirais le nombre d'ajout comme int Ajouter = ...;; Integer Nombre = inventaire.get (article); if (comptez == null) inventaire.put (article, ajouter); sinon inventaire.put (élément, nombre + ajouter); code>
Semblable à la solution d'Aioobe, vous pouvez utiliser TOBJECTINHASHMAP .
Bag bag = new HashBag() or TreeBag(); bag.add(new Sword()); bag.add(new Potion(), 5); int count = bag.getCount(new Potion());
Je ne connais pas une classe de multiples. Quelles sont certaines utilisations pour ces?
A ajouté un exemple. Vous devez envelopper la liste si vous souhaitez mettre à jour le nombre ou trouver la quantité facilement.
Vous ferez probablement mieux de créer une classe appelée alternativement, un inventainyslot code>, avec un champ Quantité et Contenu. Cela vous donne également la flexibilité d'ajouter d'autres propriétés, telles que ce que le logement d'inventaire peut contenir, si vous décidez de créer un sac «Potions» ou quelque chose comme ça. P>
StackCount code> et un booléen
ISSTACKABLE code> ou peut-être
maxstack code> La propriété est utilisée dans une autre mmo, c'est une technique parfaitement valide aussi. p>
Que diriez-vous de ce qui suit
public class Player { List<Item> inventory = new ArrayLis<Item>(); }
L'OP a dit qu'il avait déjà essayé d'avoir une variable de quantité dans l'article.
ou un inventaire de classe avec un élément et un entier pour la quantité.
public class InventoryField{ int count; Item item; } public class Inventory extends ArrayList<InventoryField>{ ... }
Découvrez ce joli jeu open-source epiar.net
C'est une question intéressante. La meilleure structure de données à utiliser va dépendre de nombreuses questions de conception: comme est le nombre d'articles possibles petits et finis ou très grands, existe-t-il une capacité ou une capacité de poids ou de poids, est-elle triée automatiquement ou par le Le joueur, quel type de requêtes le reste du code de jeu doit-il faire, etc ...