Система инвентаризации игр для Android

Я использую ArrayList как «инвентарь». У меня возникли проблемы с поиском способа добавления кратных одного и того же элемента, не занимая места в «инвентаре». Например: я добавляю зелье в свой инвентарь. Теперь я добавляю ДРУГОЕ зелье, но на этот раз вместо добавления ДРУГОГО зелья в инвентарь, вместо этого должен показать, что у меня есть: зелья x 2, а только занимают одно место в ArrayList. Я придумал несколько решений, но мне кажется, что они плохие практики. Одно из моих решений – добавить переменную AMOUNT к самому элементу и увеличить его. Помогите мне найти гораздо лучшее решение?

EDIT: Хорошо, пожалуйста, проигнорируйте вышеизложенное. Я получил довольно хорошие ответы, но меня удивило то, что почти не было учебников по системам инвентаризации ролевых игр. Я сделал много поиска в Google и не могу найти никаких хороших примеров / учебников / исходного кода. Если бы кто-нибудь мог указать мне на некоторые хорошие примеры / учебники / исходный код (неважно, какой язык, но предпочтительный java или даже c / c ++), я был бы признателен, спасибо. О, и любые книги по теме.

Solutions Collecting From Web of "Система инвентаризации игр для Android"

Обычный способ решить эту проблему (используя стандартный API) – использовать Map<Item, Integer> который сопоставляет элемент с количеством таких элементов в инвентаре.

Чтобы получить «сумму» для определенного элемента, вы просто вызываете get :

 inventory.get(item) 

Чтобы добавить что-то в инвентарь, который вы делаете

 if (!inventory.containsKey(item)) inventory.put(item, 0); inventory.put(item, inventory.get(item) + 1); 

Чтобы удалить что-то из инвентаря, вы можете, например, сделать

 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); 

Это может стать беспорядочным, если вы это сделаете во многих местах, поэтому я бы рекомендовал вам инкапсулировать эти методы в класс Inventory .

Удачи!

Подобно решению aioobe, вы можете использовать TObjectIntHashMap .

 TObjectIntHashMap<Item> bag = new TObjectIntHashMap<Item>(); // to add `toAdd` bag.adjustOrPutValue(item, toAdd, toAdd); // to get the count. int count = bag.get(item); // to remove some int count = bag.get(item); if (count < toRemove) throw new IllegalStateException(); bag.adjustValue(item, -toRemove); // to removeAll int count = bag.remove(item); 

Вы можете создать класс с несколькими значениями.

 class MultipleOf<T> { int count; final T t; } List bag = new ArrayList(); bag.add(new Sword()); bag.add(new MultipleOf(5, new Potion()); 

Или вы можете использовать коллекцию, которая записывает кратность по счету.

Например, сумка

 Bag bag = new HashBag() or TreeBag(); bag.add(new Sword()); bag.add(new Potion(), 5); int count = bag.getCount(new Potion()); 

Вероятно, вам лучше создать класс под названием InventorySlot с полем количества и содержимого. Это также дает вам возможность добавлять другие свойства, например, что может содержать слот инвентаря, если вы решите создать мешок с «зельями» или что-то в этом роде.

В качестве альтернативы, StackCount и логическое IsStackable , или, возможно, свойство MaxStack используются в довольно нескольких MMO, это совершенно правильная техника.

Или класс InventoryField с элементом и целым числом для суммы.

 public class InventoryField{ int count; Item item; } public class Inventory extends ArrayList<InventoryField>{ ... } 

Как насчет следующего

public class Item{ int count; String name; }
public class Item{ int count; String name; } 

Затем введите список, представляющий инвентарь

public class Player { List<Item> inventory = new ArrayLis<Item>(); }
public class Player { List<Item> inventory = new ArrayLis<Item>(); }