如何在 Java 中有效地存储 Roll Playing Item 属性?

How to efficiently store Roll Playing Item properties in Java?

如何在 Java 中高效存储 RPG 物品属性?

我正在设计一个基于文本的角色扮演游戏,例如在抢劫箱子时随机生成物品。 目前我将我的项目数据存储在一个文本文件中。当必须生成随机项目时,扫描仪会读取文件、收集值、考虑概率,然后相应地创建新对象。 下面是 'Consumable' class 的一些项目的示例。

值相应列出:

名称、概率、项目添加到项目池的级别、重量、价值、+健康、+伤害、效果

文本文件示例:

Twinkie 10 1 1 10 10 10 0
Banana 10 1 1 5 5 0 0
Potato 20 1 1 5 5 0 0
Protein_Shake 5 5 1 30 10 10 1
Beer 5 5 1 5 10 10 1

如果效果值等于 0,则会创建一个新的默认消耗品,效果为 'null'。 如果 Effect 值为 1,则函数使用 switch(name) 语句查找属于该项目的效果,然后 在 'Consumable constructor'.

中将效果作为参数传递

我敢肯定,这是处理这类事情的一种非常散漫和低效的方式。有人对如何处理这个有建议吗?我想做对。 我是否应该创建一个 ConsumablePool class 来立即创建所有项目或将项目信息存储在其他地方?

有几种方法可以优化您当前的任务,似乎是:

Consumable nextItem = getRandomConsumable(List<Consumable> candidates);

或许你还必须根据目前的等级来选择:

Consumable nextItem = getRandomConsumable(int level, List<Consumable> candidates);

目前,您声明每次调用 getRandomConsumable() 时都会从磁盘文件生成候选人列表(您似乎已经编写了这段代码)。你的直觉是正确的。这个操作的'cost'比较高。与从对象的内存缓存中读取相比,从磁盘读取会导致性能不佳。假设磁盘文件在游戏过程中没有改变,您的应用程序应该创建一次候选列表(在启动时),并在每次必须选择下一个项目时使用此列表。

在候选是基于级别的情况下,可以做进一步的优化。考虑按级别划分候选人,例如:

List<Consumable> candidates = createCacheFromDisk(); // Run at startup
Map<Integer, List<Consumable>> itemsByLevelMap = candidates .stream().collect(Collectors.groupingBy(Consumable::getLevel));

这将进一步按级别将候选人列表细分为列表,允许

List<Consumable> level1Items = itemsByLevelMap.get(1);

这种通用的缓存方法将大大提高应用程序的性能;从已经存在的列表中选择一个随机项目 generated/cached 比每次(从磁盘)生成一个新列表要好得多。