2017-04-24 5 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)から引き出されます。

例えば、私はランダムなポケモンの統計情報を引き出し、コラッタのために、次しまっ:

健康:14

攻撃:3

スピード:2

私の暗黙の場合ロジックが正しいと、Rattataは健康を保つことができず、それを低速にすることはできませんでした。

私がまだ完全に理解していないので、問題が "静的"変数の使用内にあるかのように感じます。私のgetRandomPokemon()メソッドを実行しているときに、それらの値の最後の既知の最小値と最大値を取得するかもしれません。このケースではピジーズのものだった。

battle(starter, wildPokemon.getRandomPokemon()); 

私は混沌とした例をお詫びしますが、これは私が最もよく学ぶ方法です。ありがとうございました!


UPDATE:ヘルプ皆のため

感謝。変数を静的変数から非静的変数に変更し、コードを一般的にクリーンアップすることで問題を解決できました。 パブリッククラスポケモン{

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

は、私はまた、独自のメソッドを保持し、コードをクリーンアップするために戦い、それ自身のクラスを作りました。 全体的に、私はポケモンクラスの変数を静的にすると、すべてのポケモンに同じ統計を与えることを学びました。静的変数を理解するのにはかなりの労力がかかりましたが、最終的にはそれを得ました。

ありがとうございました!

+0

あなたのバグを理解するにはここで十分ではありません。コンストラクタで 'Pokemon.health = health'などは' this.health = health'でなければなりません。(静的メンバーの場合は)ヘルス変数は非静的メンバー変数でなければなりません。 – Justin

+0

申し訳ありませんが、IntelliJの提案の1つを取りました。私はこれを持っていた。name = nameでも、同じように動作していたようです。 – Sean

+0

はい、あなたは(明らかに)あなたの 'Pokemon'クラスで静的変数を使用しているからです。それをしないでください。 [静的対インスタンス変数を読む](https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html)(これは「これ」と同じではありません)。 – markspace

答えて

1

あなたはそうです。あなたの静的変数です。

静的変数はフルストップ(ポケモンにつき1回ではなく)で1回だけ存在します。したがって、あなたのポケモンのすべては、最後のもの、この場合のピッゲイの値を取っています。

変数は静的であってはいけません。

関連する問題