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

时间:2012-04-01 00:59:18

标签: java data-structures

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

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

int minLevel
int maxLevel
double probability
int[] types

生锈的剑的minLevel为1,maxLevel为3,probability为罕见(3%),[type.SWORD,type.WEAPON,type.ITEM,TYPE.EQUIP]。一把更好的剑会有minLevel 2,maxLevel 10,稀有(1%)。

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

我希望这是有道理的。

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

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

2 个答案:

答案 0 :(得分:5)

我能想到三个答案:

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

    如果你真的混合了不同的东西,并且不希望以类型为基础, 然后另一个选项(更慢,但更灵活)是将所有内容放在列表中 然后根据您的需要进行过滤。一个很好的方法是用番石榴 - 看 Iterables.filterPredicate位于https://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()方法。然后,使用这样的设计,使用a 数据库与ORM(休眠)。

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

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

答案 1 :(得分:2)

最简单的方法是将所有对象放在一个大型的arraylist中,并使用重复采样来选择一个对象。

选择随机项的过程非常简单:

  1. 从0到最大为ArrayList
  2. 的大小选择一个随机数
  3. 从库中获取该索引的对象
  4. 如果对象无法满足您指定的任何条件(例如“是一个类型.SWORD或type.MACE?”),请返回开始
  5. 如果对象超出最低或最高级别,请返回开始
  6. 如果对象的稀有度低于100%,请创建0-100%的随机数。如果随机数超过了对象的稀有度,则循环返回开始。大多数对象应该具有10-100%的稀有度,如果你想要非常常见的对象,那么你可以多次将它们添加到库中。
  7. 此程序将产生一个迟早符合标准的对象(如果存在),并且将根据稀有百分比这样做。

    一个小技巧是,如果不存在这样的对象,它将无限循环。假设图17中的库中没有武器,例如?为了解决这个问题,我建议在每100次尝试后加宽minLevel和maxLevel以确保最终找到一个。确保您始终拥有每种类型的1级对象。

    为了安全起见,您可能还需要在100,000次尝试后进行救助(但请记住抛出异常 - 如果您要求库中不存在的东西,这是一个问题!)。

    P.S。我在多年前创建的一个叫做暴君的roguelike游戏中实现了类似的图书馆系统。如果你是间歇性的话,来源就在这里:

    https://github.com/mikera/tyrant/blob/master/src/main/java/mikera/engine/Lib.java