Android游戏RPG库存系统

我正在使用一个ArrayList作为我的“库存”。 我很难找出一种方法来添加同一项目的倍数,而不占用“库存”中的一个位置。 例如:我在我的清单中加了一剂药水。 现在我添加另一个药水,但是这次不是给清单添加另一个药水,而是显示我有:魔药x 2,而在ArrayList中只占用一个点。 我提出了一些解决scheme,但我觉得好像是不好的做法。 我尝试的一个解决scheme是添加一个AMOUNTvariables到项目本身并增加。 帮我找一个更好的解决scheme?

编辑:好吧,请忽略以上。 我已经得到了相当好的答案,但是让我感到吃惊的是几乎没有关于angular色扮演游戏库存系统的教程。 我做了很多谷歌search,找不到任何好的例子/教程/源代码。 如果有人能指点我一些很好的例子/教程/源代码(无所谓语言,但更好的Java,甚至C / C ++),我将不胜感激,谢谢。 噢,还有关于题材的任何书籍。

Solutions Collecting From Web of "Android游戏RPG库存系统"

解决这个问题的常用方法(使用标准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); 

如果你在很多地方这样做会变得麻烦,所以我build议你把这些方法封装在一个Inventory类中。

祝你好运!

类似于aioobe的解决scheme,您可以使用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); 

您可以创build一个倍数类。

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

或者你可以使用一个按数字logging倍数的集合。

例如一个袋子

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

您可能最好创build一个名为InventorySlot的类,其中包含数量和内容字段。 这也给了你添加其他属性的灵活性,比如你可以决定创build一个“魔药袋”或者类似的东西。

或者,一个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>(); }