2017-10-12 367 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(); 
相關問題