我使用ArrayList作为我的“库存”。 我无法找到一种方法来添加同一项目的多个而不占用“库存”中的一个点。例如:我在我的库存中添加药水。现在我添加另一种药水,但这次不是在库存中加入另一种药水,而是应该显示我有:药水x 2,而只占用ArrayList中的一个点。我想出了一些解决方案,但我觉得它们好像是不好的做法。我尝试过的一个解决方案是将一个AMOUNT变量添加到项目本身并增加它。帮我找一个更好的解决方案?
编辑:好的,请忽略以上内容。我已经得到了相当不错的答案,但让我感到惊讶的是,几乎没有关于角色扮演游戏库存系统的教程。我做了很多谷歌搜索,找不到任何好的例子/教程/源代码。如果有人能指出一些好的例子/教程/源代码(无论什么语言,但更好的java,甚至是c / c ++),我将不胜感激,谢谢。哦,还有关于这个主题的任何书籍。答案 0 :(得分:22)
解决此问题的常用方法(使用标准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
类中。
答案 1 :(得分:6)
与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());
或者您可以使用按次数记录倍数的集合。
e.g。一个Bag
Bag bag = new HashBag() or TreeBag();
bag.add(new Sword());
bag.add(new Potion(), 5);
int count = bag.getCount(new Potion());
答案 2 :(得分:5)
您可能最好创建一个名为InventorySlot
的类,其中包含数量和内容字段。这也为您提供了添加其他属性的灵活性,例如库存槽可以包含的内容,如果您决定仅创建“魔药”或类似的东西。
或者,在很多MMO中使用StackCount
和布尔IsStackable
或者MaxStack
属性,这也是一种非常有效的技术。
答案 3 :(得分:2)
或类InventoryField,其中包含项目和金额的整数。
public class InventoryField{
int count;
Item item;
}
public class Inventory extends ArrayList<InventoryField>{
...
}
答案 4 :(得分:-2)
以下
怎么样?
public class Item{
int count;
String name;
}
然后有一个代表库存的清单
public class Player {
List<Item> inventory = new ArrayLis<Item>();
}