2017-04-24 92 views
0

所以我使用一些隨機器爲我的口袋妖怪生成統計信息。我的寵物小精靈的構造是:使用具有靜態變量的隨機化吸氣劑

public Pokemon(String name, int health, int attack, int speed, boolean status) { 

    this.name = name; 
    Pokemon.health = health; 
    Pokemon.attack = attack; 
    Pokemon.speed = speed; 
    Pokemon.status = status; 
} 

private static int randomHealth(int min, int max) { 
    int range = (max - min) + 1; 
    return (int)(Math.random() * range) + min; 
} 
private static int randomAttack(int min, int max) { 
    int range = (max - min) + 1; 
    return (int)(Math.random() * range) + min; 
} 
private static int randomSpeed(int min, int max) { 
    int range = (max - min) + 1; 
    return (int)(Math.random() * range) + min; 
} 

我的隨機化:

private Random rand = new Random(); 
private List<Pokemon> pokemon; 


WildPokemon(){ 
    pokemon = new ArrayList(); 

    Pokemon rattata = new Pokemon("Rattata",randomHealth(15,20),randomAttack(2,5),randomSpeed(3,6), true); 
    pokemonZone1.add(rattata); 
    Pokemon pidgey = new Pokemon("Pidgey",randomHealth(10,17),randomAttack(3,4),randomSpeed(2,5), true); 
    pokemonZone1.add(pidgey); 

吸氣:

Pokemon getRandomPokemon() { 
    int n = rand.nextInt(pokemon.size()); 
    return pokemon.get(n); 
} 

不過,我所面臨的問題是,當隨機口袋妖怪選自這個列表與我的戰鬥方法(爲了簡潔省略)一起,爲隨機口袋妖怪生成的統計數據總是從最近構建的口袋妖怪(在這種情況下爲Pidgey)中提取。

舉例來說,我只是拉着統計信息隨機寵物小精靈,並得到了Rattata如下:

健康:14

攻擊:3

速度:2

如果我的暗示邏輯是正確的,Rattata不會有健康或速度那麼低。

我感覺好像問題在於使用「靜態」變量,因爲我還沒有完全理解它們。這可能是在運行我的getRandomPokemon()方法時,它會爲這些值抽取最後已知的最小值和最大值。在這種情況下是Pidgey的。

battle(starter, wildPokemon.getRandomPokemon()); 

我爲混沌的例子道歉,但我發現這是我學習最好的方式。謝謝!


UPDATE:

感謝大家的幫助。我設法通過將我的變量從靜態變爲非靜態來解決問題,並且通常只是清理代碼。 公共類口袋妖怪{

public static int starterHealth; 
String name; 
public int health; 
public int attack; 
public int speed; 
public boolean status; 

我還做了戰鬥它自己的類來保存自己的方法和清理的代碼。總體而言,我瞭解到,如果我將口袋妖怪類中的變量設爲靜態,它會爲所有口袋妖怪提供相同的統計信息。理解靜態變量花了很多工作,但我最終得到了它。

謝謝大家!

+0

這裏沒有足夠的能夠理解你的bug。如果我是對的,在構造函數中,'Pokemon.health = health'等應該是'this.health = health',並且(如果這些是靜態成員),health變量應該是非靜態成員變量。 – Justin

+0

對不起,我接受了一個IntelliJ的建議。我是這樣的。name = name,但顯然它的工作方式是相同的。 – Sean

+0

是的,這是因爲你(很明顯)在你的'Pokemon'類中使用靜態變量。不要這樣做。 [閱讀靜態與實例變量。](https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html)(並且不,它與'this'不一樣)。 – markspace

回答

1

你說得對。這是你的靜態變量。

一個靜態變量只存在一次句點(每個神奇寶貝不是一次)。因此,在這種情況下,所有神奇寶貝都會採用最後一個Pidgey的值。

很簡單,你的變量不應該是靜態的。