我正在制作一款回合制 RPG 游戏,我的方法是按照所有“Actor”对象的攻击顺序对它们进行排序,这完全是随机的。但是,我想改进这种方法,以便每个 Actor 都拥有的“敏捷性”统计数据能够改善他们的滚动。我查看了 Collections 类和 Arrays 中的几种方法,但似乎没有找到任何符合我要求的方法。
现在,我正在考虑获取 1 到 100 之间的随机整数,并让敏捷分数提高几率。我为整数和 HashMap 尝试了单独的 ArrayLists...但是不行。
我现在的方法:
// getFriendlies(), getHostiles(), and attack_order are all ArrayLists
public void calculateAttackOrder() {
attack_order.addAll(getFriendlies());
attack_order.addAll(getHostiles());
Collections.shuffle(attack_order);
}
感谢您的帮助!
最佳答案
您的问题没有详细说明敏捷性如何影响您的攻击顺序的要求,但我认为您指的是以下两个之一:
- 如果一个单位的敏捷度高于另一个单位,它总是首先攻击。
- 如果一个单位的敏捷度高于另一个单位,它通常会先攻击。
如果其中第一个为真(敏捷度较高的单位总是先攻击),那么您正在寻找的是一种排列数组的方法,该数组受制于具有较高敏捷度的单位总是在较低敏捷度的单位之前结束的限制敏捷,但其他一切都是随机完成的。一种方法如下:
- 如果您有 N 个单元,请将数字 1 ... N 随机分配给单元。不要分配相同的号码两次。
- 按如下升序排列单位:
- 任何比另一个单位敏捷度高的单位排在第一位。
- 两个并列的单位中,随机数大的先到。
您可以证明,这种方法将安排单位,使具有特定敏捷性的所有单位相对于彼此随机排列,但始终排在较低敏捷性单位之前。这需要时间 O(n log n) 并且可以使用 Collections.sort
完成。 , Collections.shuffle
, 和一个适当的 Comparator
.
另一方面,如果您希望排序是随机的但受敏捷性影响,您可能需要考虑使用某种可以由某些参数控制的随机分布。例如,您可以为每个单位分配一个优先级,该优先级取自正态分布,其均值是敏捷性,标准差是某个相当大的数字(比如 20)。这意味着敏捷度较高的单位更有可能先于敏捷度较低的单位移动,尽管存在很大的随机性。这种方法的优势在于,通过调整基础分布及其参数(正态分布情况下的均值和方差),您可以微调敏捷性衡量因素的影响程度。
作为一个非常简单的方法的示例,您可以将单位速度建模为
priority = e(agility / 100) + random(1, 2)
在这里,您的敏捷性越高,您的优先级就越高。增加随机性会改变敏捷性的重要性。当然,这可能有点偏差,因为敏捷度的每次边际增加都具有更多意义,因此您可能希望将指数替换为 logistic function 之类的东西。 .
希望这对您有所帮助!
关于java - 一种半随机排序算法(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7341418/