什么是用于存储RPG游戏物品的优秀Java数据结构?

Pau*_*ine 8 java data-structures

我正在用Java构建一个RPG地下城游戏,我一直在创建一个数据结构.

我有很多东西可以复制以填充地牢.例如,有一个面包Thing对象,一个剑Thing对象,一个连锁邮件Thing对象,以及怪物Thing(s)等.我想将它们存储在一个中央库中,然后能够使用某些东西检索一个对象查询.我想使用以下字段存储它们:

int minLevel
int maxLevel
double probability
int[] types
Run Code Online (Sandbox Code Playgroud)

因此,生锈的剑将具有minLevel1,a maxLevel3,probability罕见(3%),和[type.SWORD,type.WEAPON,type.ITEM,TYPE.EQUIP].一个更好的剑将有minLevel2,maxLevel10,稀有性(1%).

然后我想type.SWORD从图书馆中检索一个随机的并说我在3级.我应该根据他们的概率获得一把生锈的剑,而不是更好的剑.如果我type.SWORD从库请求级别10中检索到一个,我只会找回更好的剑.

我希望这是有道理的.

编辑 在初始化阶段,将创建所有基本对象.像可用的武器,盔甲,食物,药水,魔杖,所有基本可能的东西,在游戏中有一个独特的图形瓷砖.然后,当我想在某个地方放置一个物体时,我只是制作一个可用物品的副本,稍微调整它的属性,并将其插入世界.实际的项目都是根Thing类的子类,例如类Creature,Item,Equip(扩展Item),Weapon(扩展装备),Armor(扩展装备),Food(扩展Item)等等.但我想要标记它们在Library数据库中有所不同,我想使用额外的标签,例如type.RARE,type.ARTIFACT,type.CURSED,所以我想要除了类之外的额外标签.

游戏使用LIBGDX在Android和Applet上可用.我使用免费的Rltile套装,它有数以千计的好瓷砖.我将使用Pubnub或Google App Engine来提供多人游戏支持.

and*_*oke 5

我能想到三个答案:

  1. 用自定义方法编写自己的Library东西来存储这些东西Map.所以你可能有一个Map<Type,List<Object>>按类型存储事物列表,然后是一个采用类型的方法,从地图中检索列表,并按概率选择一些东西(这很容易做到 - 你只需要一些概率,生成一个随机数在0和总和之间,然后遍历列表,从随机值减去项目的概率,直到它为负 - 你返回使其为负[*]的项目.例如,您也可以逐级过滤列表.

    如果你有不同的东西的真实组合,并且不希望基于类型,那么另一个选项(更慢,但更灵活)是将所有内容放在列表中,然后根据您的需要进行筛选.一个很好的方式做到这一点是番石榴-看 Iterables.filterPredicatehttps://code.google.com/p/guava-libraries/.你可以提供一个接受谓词的接口,并从过滤后留下的内容中返回一个随机选择.谓词很容易用匿名类构建"内联" - 请参阅https://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Functions_and_Predicates上的示例

  2. 把这一切都放在数据库中.也许我太过于企业化,游戏人们永远不会这样做,但在我看来,像sqlite或H2这样的小型嵌入式数据库对于这一点来说是完美的.然后你可以选择带有SQL查询的东西(这已经是一个很长的答案,所以我不会在这里给出更多细节).

  3. 改变你的设计.你所描述的并不是很好.而不是有类型,你的东西可以实现接口.所以Weapon接口会有一个 getMinLevel()方法,例如.然后,使用这样的设计,使用带有ORM(休眠)的数据库.

你正在做的是有点雄心勃勃,我怀疑更多的是学习而不是其他任何东西(没有批评意图 - 这就是我学习东西的方式,通过制作东西,所以只是假设你像我一样).所以选择你觉得最舒服的.

[*]这假设你总是想要归还一些东西.如果概率是标准化的并且您希望能够不返回任何内容,请从0-1(或0-100,如果使用百分比)中选择初始值.并且,如果在运行列表时没有任何值变为负值,则不返回任何内容.