随机向下移动类层次结构

3
我目前正在开发一个“物品掉落”系统,当杀死敌人时,物品(及其属性)会随机生成。我现有的系统是一个类层次结构,其中 Item 是根超类。每个类都有特定的属性,适用于所有子类。
理想情况下,在掉落物品时,程序将随机选择物品的一种属性,并相应地沿着层次结构树向下移动。例如,过程如下:
类 | 随机选择的属性确定路径在树中: Item | ItemType -> Equipable | EquipType -> Weapon | WeaponType -> 等等。
示例代码:
abstract class Item 
{   
    private Type itemType;
    private String itemName;
    private int itemLevel;
    private Rarity itemRarity;
    private boolean questItem;
    private int itemPrice;

    public Item(String name)
    {
        itemType = Type.randomize();
        itemName = name;
        itemLevel = randomizeLevel(pLvl, eLvl);
        itemRarity = Rarity.randomize(bonus, pLvl, eLvl, iLvl);
        questItem = false;
        itemPrice = determinePrice();
    }
}

Type是一个枚举类型,用于决定层次结构中的下一个级别。使用这个系统,我不知道如何让程序确定下一个级别,然后进行操作。

我遇到的问题是,我意识到为了使此系统正常工作,我必须从层次结构的底部开始向上工作。是否有一种方式可以从上往下工作,也就是说,我可以从基本的Item类开始,并按程序方式逐步向下工作(使用我创建的方法来随机选择属性)。

如果没有,那么我应该如何实现这个系统?


你为什么认为你必须从层级底部开始工作? - David K
当然可以。有什么问题吗? - djechlin
@DavidK 我遇到的问题是,决定层次结构中下一个级别的属性是在类本身的构造函数中确定的。因此,现在我不知道如何在确定下一个路径后向下移动层次结构。我会更新问题。 - G Boggs
选择随机子类的代码可以在调用要创建的对象的构造函数之前执行。当您随机选择一个类时,然后构造它。至少有两个答案是基于此的。 - David K
4个回答

1

我明白这个可以有用,但你能详细说明一下我在我的情况下该如何使用它吗? - G Boggs
@GBoggs 这个调用会按照层级顺序返回整个层级结构。因此,您可以在列表中找到您的项目。想向上移动?从该索引向上移动列表。想向下移动?选择列表中更远的某个项目。这样,您就可以实现保持层级关系的随机化。 - pvg

1
如果您想从上到下逐步构建类,特别是如果子类选择取决于构建超类时所做的选择,则最好优先使用组合而不是继承。因此,如果对于“Item”,您具有“Type”特定信息,则可以使“Type”包含您可能想要的所有属性,包括对此(概念性)层次结构下的后续对象的引用。
当然,在任何时候,您都可以将“Item”、“Type”等小的类层次结构创建为对象之前应该知道的特定子类。否则,组合将是以您描述的方式创建项目的唯一方法。

1
你可以在每个类中设置一个静态方法,以确定“下一个转换”(将“items”包视为树形结构)。
因此,
// untested code

String nextClass = "Item";

// define a helper method

Class x = getClass(nextClass);

while( x.hasMore() == true )
{
    nextClass = x.getNextClass();
    x = getClass(nextClass);

} 
// reflection here on Class 'x' (whatever that is...)

然后您可以使用反射来实例化最后一个类。
这可能是个不好的主意。但它会“遍历”一棵良好形成的类树。

1
如果我理解您的目标,并尝试重新表述:
- 您有一个顶级类型:Item - 您通过添加一些属性(例如Equipable,然后是Weapon等)创建子类(现在或以后可能会创建) - 从顶部(Item),您想要随机选择一个子类(是否Equipable?是/否?如果是=>装备类型等)
我建议:
- 不要打破子类的概念:父类不需要提前知道它的子类 - 然后通过反射获取类(首先是item等),搜索子类 - 在子类之间进行选择:此时必须定义如何对子类进行分类:使用任何新变量或以前缀开头的任何变量。例如,您可以定义final static int category_weapon=1;(或true,false等) - 然后迭代,从顶部开始,获取子项,获取这些静态变量和值,并在这些子项之间随机选择,并重复此过程
另一种刻画方式:使用接口(武器,可装备等):好处是您可以应用预定义的方法(例如武器...)
更便宜:不要使用任何变量,只需使用子类的名称来选择下一个。
选择的好方法:准确地定义您将如何处理这些对象。
希望能有所帮助。

你的意思是我只需要编写一个方法,随机选择第一个属性(类型),然后使用 switch 语句沿着继承层次结构向下移动并随机选择下一个属性,以此类推直到到达底层节点,然后创建该对象?这是一种高效的方法还是唯一的方法? - G Boggs
1
这并不是最有效的方法,因为它涉及到反射(但你的程序可以执行一次,并缓存信息),而且这也不是唯一的方法。其主要优点在于类之间的独立性:当你在武器下创建匕首或刀子时,就完成了!你不必维护两个平行结构(有一天,这将不再一致)。 - guillaume girod-vitouchkina
两件事。1)你所说的类之间的独立是什么意思?2)你所说的创建匕首或刀下面是什么意思? - G Boggs
假设您的应用程序使用武器。下个月,您想通过一个新的子类“刀”来优化它。然后,只需选择子类:没有更多的随机选择。下个月,另一个武器子类:“匕首”:同理。 - guillaume girod-vitouchkina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接