2017-10-12 363 views
-2

我想创建一个randomizer方法,它会随机选择一个新的怪物对象添加到我的java游戏。问题是有很多不同的怪物对象,我想避免在方法中创建多个唯一的if()语句。在java中生成一个新的随机对象最有效的方法是什么?

我目前有10个怪物子类的抽象怪物超类。

我首先想到的是创建一个字符串数组,然后将它们转换为对象,没有工作:

monsterInPlay=monsterRandomizer(); 

public Monster monsterRandomizer(){ 
    Random rand = new Random(); 
    String [] elements = {"bird","zombie","shark",etc...) 
    String newMonster = elements[rand.nextInt(9)]; 
    return new ((Monster)newMonster()); 
} 

我想使这一设想需要一个单独的方法。所以我目前只有10个单独的if()语句,我讨厌的外观:

public Monster monsterRandomizer(){ 
    Random rand = new Random(); 
    int i = rand.nextInt(9); 

    if (i==0){ 
     return new Shark(); 
    } 
    if (i==1){ 
     return new Zomibie(); 
    } 
    if (i==2){ 
     return new Bird(); 
    } 

    // and so on.... 

我是相对较新的Java,所以任何帮助表示赞赏。如果可能的话,我想避免在代码中放入10个不同的if()语句。

+0

我(和我相信大多数人)不知道你想要什么。也许你想将某个'元素'传递给某个类的构造函数?也许你应该只显示你的“10条语句”代码 – Bohemian

+0

你想要转换成什么样的对象?用if语句显示你的代码,我们可以帮助... –

+0

我想你想用ramdom()创建objet?就像将所有可能的对象放到列表中一样,并且使用列表元素创建对象?如果你想这样的事情,所有的元素应该有相同的父类,并使用父类myobjet =新elementOfListe –

回答

0

这两种方法都是正确的,第一个是快,但问题是,你回来双括号中的“新”变量,并将其种姓怪物对象,它是完全荒谬的。关键字new总是在类名之前使用,而不是像new Monster()这样的实例,这会为您提供Monster类型的“新”实例。

而是返回一个新的怪物对象和字符串传递给构造函数,然后处理字符串中的构造函数来定制你的怪物。

的方法,你在Monster.java

public Monster(String preset){ 
    if (preset.equals("bird"){ 
     //height = .. 
     //damage = .. 
    } else if (preset.equals("zombie"){ 
     // ... 
    } // else if ... 
} 

代码

public Monster monsterRandomizer(){ 
    Random rand = new Random(); 
    String [] elements = {"bird","zombie","shark",etc...) 
    String newMonster = elements[rand.nextInt(9)]; 
    return new Monster(newMonster); 
} 

的constuctor如果你想使用第二个使用else if原因它会让作业电脑更容易,一旦条件得到验证,就不必检查每一个其他if。它在这里没有什么不同,但对于以后来说这是一个很好的做法。

0

你举的例子,如果用所谓的工厂方法模式,因此是绝对有效的IFS。

您也可以使用这样的事情:

public static void main(String[] args) { 
    Random rand = new Random(); 
    int i = rand.nextInt(Monster.values().length); 
    System.out.println(Monster.values()[i]); 
} 

enum Monster { 
    SHARK, 
    ZOMBIE, 
    BIRD; 
} 
0

怎么是这样的:

List<Supplier<Monster>> constructors = Arrays.asList(Shark::new, Zombie::new, Bird::new); 
int randomIndex = new Random().nextInt(constructors.size()); 
return constructors.get(randomIndex).get(); 
相关问题