【发布时间】:2017-04-28 01:41:38
【问题描述】:
所以我正在使用一些随机发生器来为我的口袋妖怪生成统计数据。我的口袋妖怪构造函数是:
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());
对于这个混乱的例子,我深表歉意,但我发现这是我最好的学习方式。谢谢!
更新:
感谢大家的帮助。我设法通过将我的变量从静态更改为非静态来解决这个问题,并且通常只是清理代码。 公共类口袋妖怪{
public static int starterHealth;
String name;
public int health;
public int attack;
public int speed;
public boolean status;
我还将 Battle 创建为自己的类来保存自己的方法并清理代码。 总的来说,我了解到,如果我将 Pokemon 类中的变量设为静态,它会为所有 Pokemon 提供相同的统计信息。理解静态变量需要做很多工作,但我终于明白了。
谢谢大家!
【问题讨论】:
-
这里不足以理解您的错误。如果我是对的,在构造函数中,
Pokemon.health = health等应该是this.health = health并且(如果它们是静态成员)健康变量应该是非静态成员变量。 -
抱歉,我采纳了 IntelliJ 的建议之一。我有它作为 this.name = name,但显然它以相同的方式工作。
-
是的,这是因为您(很明显)在
Pokemon类中使用了静态变量。不要那样做。 Read up on static vs. instance variables.(不,它与this不一样)。