我目前正在处理"项目丢弃"系统,在杀死敌人时随机生成物品(及其属性)。我当前的系统是类的层次结构, 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 类开始,然后在程序上向下工作(使用我创建的方法随机选择属性)。
如果没有,我是否应该以特定的方式实施此系统?
答案 0 :(得分:1)
您可以从枚举类中获取所有枚举的列表 - 顺序是声明它们的顺序,因此如果按层次顺序声明它们,则可以根据需要遍历列表。相关的oracle doc就在这里:
https://docs.oracle.com/javase/tutorial/reflect/special/enumMembers.html
答案 1 :(得分:1)
如果你想从上到下工作,特别是如果子类选择取决于构造超类时所做的选择,那么支持组合优于继承可能要好得多。因此,如果对于Item
您有Type
个特定信息,您可以使Type
包含您可能想要的所有属性,包括对此(概念)层次结构中后续对象的引用。
当然,在任何时候,你都可以在Item
,Type
之外创建一个小的类层次结构,只要你知道在创建对象之前它应该是特定的子类。是。否则,合成将是以您描述的方式创建项目的唯一方式。
答案 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; (或真,假,......)
然后迭代,你从顶部开始,得到孩子,得到这些静态变量和值,并在这些孩子之间随意选择,然后再做一次
另一种表征方式:使用界面(武器,装备,......):好处是你可以应用预定义的方法(武器,......)
更便宜:不要使用任何变量,只需使用子类的名称来选择下一个。
一种很好的选择方式:准确定义您对这些对象的所作所为。
希望它有所帮助。