我试图创建一个随机化方法,随机选择一个新的Monster对象添加到我的java游戏中。问题是有太多不同的Monster对象,我想避免在方法中创建多个唯一的if()语句。
我目前有一个抽象的怪物超类,有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 :(得分:0)
这两种方法都是正确的,第一种方法更快但问题是你要用双括号返回一个“新”变量并将其加速到一个完全荒谬的怪物对象。关键字new
始终在类名称之前使用,而不是像new Monster()
这样的实例,这将为您提供Monster类型的“新”实例。
而是返回一个新的Monster Object并将该字符串传递给构造函数,然后在构造函数中处理String以自定义您的Monster。
代码中的方法
public Monster monsterRandomizer(){
Random rand = new Random();
String [] elements = {"bird","zombie","shark",etc...)
String newMonster = elements[rand.nextInt(9)];
return new Monster(newMonster);
}
Monster.java中的构造函数
public Monster(String preset){
if (preset.equals("bird"){
//height = ..
//damage = ..
} else if (preset.equals("zombie"){
// ...
} // else if ...
}
如果你想使用第二个使用else if
因为它会让计算机的工作变得更容易,一旦条件得到验证,就不必每隔一个if
检查一次。它在这里没有什么区别,但以后这是一个很好的做法。
答案 1 :(得分:0)
使用ifs的示例,如果调用Factory方法模式,那么它绝对有效。
您也可以使用以下内容:
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;
}
答案 2 :(得分: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();