Java - 随机向下移动类层次结构

时间:2015-12-21 22:35:39

标签: java hierarchy

我目前正在处理"项目丢弃"系统,在杀死敌人时随机生成物品(及其属性)。我当前的系统是类的层次结构, Item 是根超级类。每个类都具有所有子类共有的特定属性。

理想情况下,在删除项目时,程序将随机选择项目的一个属性,并相应地向下移动层次树。例如,过程如下:

Class | 随机选择的属性确定树中的路径:

项目| ItemType - > 可以装备| EquipType - > 武器| 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();
    }
}

类型是一个枚举,决定层次结构中的下一个级别。有了这个系统,我不知道如何让程序确定下一个级别,然后继续它。

我遇到的问题是,为了实现这一点,我已经意识到,我必须从层次结构的底部开始工作。有没有办法让我从上到下工作,这意味着我可以从一个基本的 Item 类开始,然后在程序上向下工作(使用我创建的方法随机选择属性)。

如果没有,我是否应该以特定的方式实施此系统?

4 个答案:

答案 0 :(得分:1)

您可以从枚举类中获取所有枚举的列表 - 顺序是声明它们的顺序,因此如果按层次顺序声明它们,则可以根据需要遍历列表。相关的oracle doc就在这里:

https://docs.oracle.com/javase/tutorial/reflect/special/enumMembers.html

答案 1 :(得分:1)

如果你想从上到下工作,特别是如果子类选择取决于构造超类时所做的选择,那么支持组合优于继承可能要好得多。因此,如果对于Item您有Type个特定信息,您可以使Type包含您可能想要的所有属性,包括对此(概念)层次结构中后续对象的引用。

当然,在任何时候,你都可以在ItemType之外创建一个小的类层次结构,只要你知道在创建对象之前它应该是特定的子类。是。否则,合成将是以您描述的方式创建项目的唯一方式。

答案 2 :(得分:1)

您可以在每个类中使用静态方法来确定“下一个转换”(将“项目”包视为树。

所以

// 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...)

然后您可以使用反射来实例化最后一个类。

这可能是一个坏主意。但它会“走”成一个结构良好的类树

答案 3 :(得分:1)

如果我了解你的目标,并尝试重新制定:

  • 你有一个顶级类型:项目

  • 通过添加一些属性(可装备,然后是武器等),您拥有(或现在创建,或者可能更多?)Item的子类

  • 从顶部(项目),你想随机选择一个子类(可以?是/否?如果是=>装备类型等等。

我建议:

  • 不要破坏子类的概念:父母不需要提前知道他的孩子

  • 然后拿一个类(第一个:项目,依此类推),通过反射搜索子类

  • 在子项之间进行选择:此时您必须定义如何在子项之间进行分类:任何新变量或以前缀开头的任何变量。例如,您可以定义final static int category_weapon = 1; (或真,假,......)

  • 然后迭代,你从顶部开始,得到孩子,得到这些静态变量和值,并在这些孩子之间随意选择,然后再做一次

另一种表征方式:使用界面(武器,装备,......):好处是你可以应用预定义的方法(武器,......)

更便宜:不要使用任何变量,只需使用子类的名称来选择下一个。

一种很好的选择方式:准确定义您对这些对象的所作所为。

希望它有所帮助。