2012-04-01 101 views
7

我正在用Java构建一个RPG地牢游戏,并且我一直在创建一个数据结构。什么是一个好的Java数据结构来存储RPG游戏物品?

我有很多事物可以复制到地牢里。例如,有面包Thing物体,剑Thing物体,连锁邮件Thing物体,怪物Thing(s)等。我想将它们存储在中央图书馆,然后能够使用某些查询。我想用下面的字段来存储他们:

int minLevel 
int maxLevel 
double probability 
int[] types 

所以生了锈的剑将有1 minLevel,稀有性(3%),以及[type.SWORD,type.WEAPON,type.ITEM,TYPE.EQUIP]的3 maxLevel,一个probability。更好的剑会有minLevel 2,maxLevel 10,稀有(1%)。

然后我想从库中检索一个随机type.SWORD并说我在3级。根据他们的概率,我应该比更好的剑更频繁地生锈的剑。如果我从请求10级的图书馆中检索到type.SWORD,我只能找回更好的剑。

我希望这是有道理的。

编辑 在初始阶段,所有的基本对象都将被创建。像可用的武器,盔甲,食品,药水,魔杖,所有可能的东西,在游戏中都有独特的图形拼图。然后,当我想在某个地方放置一个物体时,我只是制作一件可用物品的副本,稍微调整一下它的统计数据,然后在世界上放下它。实际物品都是根类物品的所有子类,例如类生物,物品,装备(延伸物品),武器(延伸装备),装甲(延长装备),食物(延伸物品)等。但是我想标记他们在库数据库中不同,我想使用额外的标签,如type.RARE,type.ARTIFACT,type.CURSED,所以我想要额外的标签,除了类。

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

+0

的ArrayList - http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html – Coffee 2012-04-01 01:09:30

+0

将你的世界有一个数据库在创作时出现的固定物品?或者当物体被需要时从空中创建物体? – sarnold 2012-04-01 01:12:42

+0

所以每个东西都有一组嵌套类型?即剑,武器,物品,装备? – 2012-04-01 02:19:04

回答

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. 改变你的设计。你所描述的不是很OO。你的东西可以实现接口,而不是类型。因此,例如,接口将具有一个方法 getMinLevel()。然后,像这样的设计,使用ORM(休眠)的 数据库。

你做什么样的雄心勃勃,我怀疑更多的是比什么都学(没有批评意 - 这就是我如何学习的东西,通过使事情,所以只是假设你像我一样) 。所以选择你感觉最舒服的地方。

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

2

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

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

  1. 从0选择一个随机数达到ArrayList
  2. 的大小从图书馆获取该索引的对象
  3. 如果该对象不符合您指定的任何标准(例如“是一种类型.WORD或type.MACE?”)返回开始
  4. 如果对象超出最小或最大级别,请返回开始
  5. 如果目标ct的稀有度小于100%,从0-100%创建一个随机数。如果随机数超出对象的稀有度,则循环回去开始。大多数对象应该有10-100%的稀有度,如果你想要非常普通的对象,那么你可以将它们多次添加到库中。

此过程将产生一个满足标准迟早(如果存在)的对象,并且将根据稀有百分比来实现。

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

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

P.S.我在多年前创建的名为Tyrant的roguelike游戏中实现了一个类似的图书馆系统。来源就在这里,如果你interersted:

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

+2

你回答我的问题Mikera很好。你的暴君游戏多年来一直是我的灵感。这是一个用Java编写的真棒,复杂的游戏,我只是喜欢它。我的RPG游戏也使用了rltile-set,但是我正在为Android和Applet编写,并且将会是多人游戏,我真的不想再看你的源代码,否则我只会偷你的代码并且ideas.I确实希望这个游戏是100%我自己的代码。我注意到你最近在你的代码库中将这个名字改成了tyrant-old,你有任何制作暴君2的计划吗?那太棒了! – 2012-04-01 19:54:45

+0

很高兴它对你有用!为了记录,我真的不介意你窃取代码和想法 - 毕竟这是开源的精神!我很可能会在暴君2(可能会在Clojure重写)。取决于我得到几个免费的月份,但! – mikera 2012-04-02 02:56:07

相关问题