Android游戏RPG库存系统

时间:2011-07-30 06:43:53

标签: java android arraylist

我使用ArrayList作为我的“库存”。 我无法找到一种方法来添加同一项目的多个而不占用“库存”中的一个点。例如:我在我的库存中添加药水。现在我添加另一种药水,但这次不是在库存中加入另一种药水,而是应该显示我有:药水x 2,而只占用ArrayList中的一个点。我想出了一些解决方案,但我觉得它们好像是不好的做法。我尝试过的一个解决方案是将一个AMOUNT变量添加到项目本身并增加它。帮我找一个更好的解决方案?

编辑:好的,请忽略以上内容。我已经得到了相当不错的答案,但让我感到惊讶的是,几乎没有关于角色扮演游戏库存系统的教程。我做了很多谷歌搜索,找不到任何好的例子/教程/源代码。如果有人能指出一些好的例子/教程/源代码(无论什么语言,但更好的java,甚至是c / c ++),我将不胜感激,谢谢。哦,还有关于这个主题的任何书籍。

5 个答案:

答案 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>();

}