我正在为一个locap LARP系统开发一个角色扮演角色查看器/管理程序。这些角色可以获得类似树状结构的技能。这里有很多技巧,而且每个角色都有很多技能。
我知道我可以导入Java swing库来访问一棵树,但我觉得这可能会使我陷入困境,因为需要做的就是访问一个类似树的数据库,而角色只需要知道他们可以访问这些技能的一个子集。
我不确定树设计模式是否是最好的选择(例如,为每个字符已知的技能实例化一棵树,并根据需要添加/删除部分),还是“做一些聪明的事情”,并使用每个字符的列表来查看数据库(外部树)的哪些部分(技能)是“拥有的”。
我的技能大致上是这样的:
Course catogory -> Weapon Type -> Actual Weapon -> Proficiency-->Special Skill,它很深。更进一步说,我们不需要知道每个层次上的是什么,只有孩子们,直到你击中叶子,并向上一片。
我的数据库实际上已经存在于LARP网站上,所以如果我不需要复制它,那就太好了。这是一个样本
Weapons and Shields Warrior Priest Scout Mage
1H Weapon Proficiency 3 6 6 9
1H Weapon Specialisation 6 12 12 18
1H Weapon Expertise 12 24 24 36
1H Weapon Mastery 24 48 48 72 后来:
Magic Warrior Priest Scout Mage
Learn Spell 9 x (l + 1) 9 x (l + 1) 6 x (l + 1) 3 x (l + 1)
l = spell level,
...
Create Talisman 9 + l 9 + l 6 + l 3 + l
l = level, 发布于 2012-07-13 14:39:31
在普通(关系)数据库中使用树是很困难的。如果存储得当,每个技能只引用其父技能,并且试图找到孩子和兄弟姐妹需要花费很长时间,即使是使用一个小表。这在一定程度上可以通过数据库的非规范化(添加列来为每个技能提供完整的祖先)来解决,但是您必须知道树中的最大级别数,并将其硬连接到DB设计中。
考虑到人类必须发明你的数据,不可能有太多的数据,所以我会把它放在你自己的树结构中。每个节点都会引用它的父节点,并有一个其子节点的列表,这样您就可以根据需要绕着它转。您只需要一个简单的技能类,包含父类、子列表、名称和相关数据,因此它的操作和使用非常简单。
使用地图(java.util.HashMap可能是最好的,因为您将知道树的大小)来定位每个条目。将每个技能对象按名称放入其中,按键,最有可能是按名称。因此,如果你想知道“长剑”,你可以在地图上找到它的名字,现在你有了所有的信息,加上它的父母和它的所有孩子。
(有一件事情并不那么简单:在读取DB时,您可能会得到不在树(和Map)中的父级的名称。你得马上创造出来。这意味着当从DB读取新技能时,它可能已经在树中了。因此,您不需要添加它,您只需填写信息和家长。(如果父母不在树中,则必须动态创建它。)
试着只显示父列表和其子列表。将所有内容都显示为简单的表也可能有效。但是,一旦你开始在显示中折叠树的部分,它就变得棘手。做一个好的树/大纲/资源管理器/表/列表比这里的其他工作要多得多。
几年前我确实使用了swing库JTree。如果你必须将整棵树显示为一棵树,这可能是你最好的选择。不幸的是,我需要使它成为表的一部分,事实证明跳过JTree并直接展开和折叠JTable中的行更容易。这是一个巨大的努力。因此,例如,不要让任何人说服您将成本添加到每一行,在每个行中,所有成本都在他们自己的列中对齐。
发布于 2012-07-13 12:36:29
用于树状数据结构的规范设计模式是访客。从根节点(或当前节点)开始,按顺序访问每个节点(预顺序、后置顺序、所需的任何顺序),在每个节点执行所需的任务。
从您的描述中还不清楚,但我的印象是,返回显示当前节点的所有主要子节点(即当前节点的所有子节点而不是其后代)的信息所需的信息的访问者将工作。这假设你的技能被分解成越来越精细的类别(战斗,->,武器,->,近战,->,边缘武器,->短刃,->匕首)。玩家可以钻到任何类别,看看他们的能力是什么。你也可以折叠那些只有一个孩子的类别(例如,如果一个人只有一种技能,就直接去做,不要让他们选择一串单一的链接)。
https://softwareengineering.stackexchange.com/questions/156659
复制相似问题