我正在用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来提供多人游戏支持。
答案 0 :(得分:5)
我能想到三个答案:
编写您自己的Library
,使用自定义方法将这些内容存储在Map
中。
所以你可能有Map<Type,List<Object>>
按类型存储事物列表
然后是一个获取类型的方法,从地图中检索列表,然后选择
概率的东西(这很容易做到 - 你只是提高了概率,
生成0和总和之间的随机数,然后遍历列表,
从随机值中减去项目的概率,直到它为负数 - 你
返回使其为负[*]的项目。您也可以先过滤列表
等级,例如。
如果你真的混合了不同的东西,并且不希望以类型为基础,
然后另一个选项(更慢,但更灵活)是将所有内容放在列表中
然后根据您的需要进行过滤。一个很好的方法是用番石榴 - 看
Iterables.filter
和Predicate
位于https://code.google.com/p/guava-libraries/。
你可以提供一个接受谓词并返回随机的接口
从过滤后留下的任何东西中选择。谓词很容易构建
使用匿名类“内联” - 请参阅示例
https://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Functions_and_Predicates
将所有这些都粘贴在数据库中。也许我太过于企业化,而人们会玩游戏 从来没有这样做,但在我看来,像sqlite或者一样的小型嵌入式数据库 H2对此非常完美。然后,您可以选择SQL查询(这个 已经是一个很长的答案,所以我不会在这里提供更多细节。)
改变你的设计。你所描述的并不是很好。而不是有类型,
你的东西可以实现接口。所以Weapon
接口会有一个
例如,getMinLevel()
方法。然后,使用这样的设计,使用a
数据库与ORM(休眠)。
你正在做的事情有点雄心勃勃,我怀疑更多的是学习而不是其他任何东西(没有批评意图 - 这就是我学习东西的方式,通过制作东西,所以只是假设你像我一样)。所以选择你觉得最舒服的。
[*]这假设你总是想要归还一些东西。如果概率是标准化的并且您希望能够不返回任何内容,请从0-1(或0-100,如果使用百分比)中选择初始值。并且,如果在列表中运行时没有任何值变为负值,则不返回任何内容。
答案 1 :(得分:2)
最简单的方法是将所有对象放在一个大型的arraylist中,并使用重复采样来选择一个对象。
选择随机项的过程非常简单:
此程序将产生一个迟早符合标准的对象(如果存在),并且将根据稀有百分比这样做。
一个小技巧是,如果不存在这样的对象,它将无限循环。假设图17中的库中没有武器,例如?为了解决这个问题,我建议在每100次尝试后加宽minLevel和maxLevel以确保最终找到一个。确保您始终拥有每种类型的1级对象。
为了安全起见,您可能还需要在100,000次尝试后进行救助(但请记住抛出异常 - 如果您要求库中不存在的东西,这是一个问题!)。
P.S。我在多年前创建的一个叫做暴君的roguelike游戏中实现了类似的图书馆系统。如果你是间歇性的话,来源就在这里:
https://github.com/mikera/tyrant/blob/master/src/main/java/mikera/engine/Lib.java