【问题标题】:How To Get A Random Item From A Class In Java?如何从 Java 中的类中获取随机项?
【发布时间】:2016-11-12 07:31:10
【问题描述】:

我刚刚开始学习 Java,而且我还很新。

我正在尝试用 Java 创建一个非常简单的基于文本的 RPG 游戏。

我创建了一个名为“enemy”的类。此类包含某些变量,例如表示敌人名称的字符串、表示敌人生命值、伤害的整数等。通过这个“敌人”类,我创建了特定的敌人。例如,使用“enemy”类,我将创建一个僵尸敌人并为上述变量分配某些值。

我想做的就是随机遭遇敌人。例如,假设我有一个僵尸敌人、巨型蜘蛛敌人和一个刺客敌人,每个敌人的值都分配给“敌人”类中的变量,我想进行随机战斗。僵尸出现的概率为 45%,蜘蛛出现的概率为 25%,刺客的出现概率为 30%。

我怎样才能做到这一点或类似的事情?有教程吗?

对不起,如果我没有多大意义......

【问题讨论】:

  • 代码是程序员的通用语言,你知道的。胜于雄辩
  • 到目前为止您尝试了哪些方法,您在哪里卡住了?如上所述,在这种情况下,代码是必须的。

标签: java class random


【解决方案1】:

这将是实现这一点的一般格式(如以统一概率选择敌人):

Enemy[] enemies = new Enemies[10];
//fill in your array with a bunch of enemies
//...
//ahh, time for a battle encounter!
int randIndex = new Random().nextInt(enemies.length);
Enemy encounterEnemy = enemies[randIndex];
//now you can use encounterEnemy for the simulated battle

注意:随机元素选择取自here

针对不同的敌人选择概率

这个想法是在 0-1 的范围内创建一个随机的double,然后根据其中的不同范围,选择/创建一个敌人。在这种情况下,数组就没有意义了。

double randVal = Math.random();
Enemy encounterEnemy;
if (randVal < 0.25){
    encounterEnemy = createZombie();
}else{
    encounterEnemy = createGiantSpider();
}

在这种情况下,有 25% 的概率会遇到僵尸,有 75% 的概率会遇到巨型蜘蛛。

【讨论】:

  • 这不满足能够选择性地选择每个结果的概率的要求。在你的情况下,所有敌人被选中的可能性都相同
  • 好一点,但仍然不足以完全通用。你只支持固定数量的敌人变种。任意数量的敌人怎么样?
  • @Dici 你提供了一个更好的通用解决方案。为了简单起见,我想避免创建方法等。
  • 如果我想让不同的敌人有不同的特定属性怎么办?例如,僵尸有 50 生命值,掉落 10 金币,而蜘蛛有 30 生命值,5 金币。我想我要问的是,如何将一些变量分配给数组中的项目? BTW,谢谢楼上的回答! :)
  • @gurgy11 如果我想让不同的敌人拥有不同的特定属性怎么办? 僵尸的整个创建过程,包括它的属性,都应该在createZombie 中处理。 GiantSpider 等也是如此。
【解决方案2】:

如果您将Enemy 实例放在一个列表中,并且有一个单独的排序列表来存储概率,您可以执行以下操作来随机选择一个:

// in real code you would have to build this list and check it is sorted in reverse order
// and that the total sum is 100
List<Double> probabilities = Arrays.asList(45, 30, 25);
List<Enemy> enemies = Arrays.asList(new Zombie(), new Spider(), new Assassin());

public static Enemy randomEnemy(List<Enemy> enemies, List<Double> probabilities) {
    double d = Math.random();
    double threshold = 0;

    for (int i = 0; i < probabilities.size(); i++) {
        threshold += probabilities.get(i) / 100;
        if (d < threshold) return enemies.get(i);
    }
    throw new IllegalArgumentException("Probabilities don't add up to 1. Total: " + threshold);
}

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2017-01-03
    • 2011-06-30
    • 1970-01-01
    • 2019-03-09
    • 2015-05-22
    • 2015-12-02
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多