2017-04-24 89 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的值。

很简单,你的变量不应该是静态的。