2017-06-10 16 views
0

これは私が書いた2つのクラスのコードです。ここでの問題は静的を使用するタイプとして草、火、水を表すクラスフィールドを定義する方法がわかりません。 スーパー関数を正しい方法で使用したかどうかはわかりません。どうすれば親のコンストラクタを正しく呼び出すことができますか? "knockedOut boolean"を定義し直して型としてFireを使用できるようにする必要はありませんか? 質問が混乱する可能性がありますが、私はそれをよりよく説明するのかわからない:(申し訳ありませんクラスのフィールドを定義し、親のコンストラクタを呼び出す

public abstract class Pokemon { 
private String name; 
private String type; 
private int attack; 
private int health; 
private boolean knockedOut; 
static private String Grass; 
static private String Water; 
static private String Fire; 
public Pokemon (String n, String t, int a, int h) { 
    name = n;//state 
    type = t;//state 
    attack = a;//state 
    health = h;//state 
    knockedOut = false; 
} 

public abstract int takeDamage(Pokemon enemy); 

public String toString() { 
    return "}"; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getType() { 
    return type; 
} 

public void setType(String type) { 
    this.type = type; 
} 

public int getAttack() { 
    return attack; 
} 

public void setAttack(int attack) { 
    this.attack = attack; 
} 

public int getHealth() { 
    return health; 
} 

public void setHealth(int health) { 
    this.health = health; 
} 

public boolean isKnockedOut() { 
    return knockedOut; 
} 

public void setKnockedOut(boolean knockedOut) { 
    this.knockedOut = knockedOut; 
} 


} 

public abstract class Charizard extends Pokemon { 
private static String Fire; 
private int attackFire; 
private int healthFire; 
private static String Water; 
private static String Grass; 
public Charizard(int a, int h) { 
    super("Charizard", Fire, a, h); 
    attackFire = a; 
    healthFire = h; 


} 
public int takeDamage(Pokemon enemy){ 
    int enemyAttack = enemy.getAttack(); 
    if(enemy.getType().equals(Water)){ 
     enemy.setHealth(enemy.getHealth()-attackFire/2); 
     healthFire = healthFire-enemy.getAttack()*2; 
     if(enemy.getHealth()<=0){ 
      enemy.setKnockedOut(true); 
     } 
    } 
    else if(enemy.getType().equals(Fire)){ 
     enemy.setHealth(enemy.getHealth()-attackFire/2); 
     healthFire = healthFire-enemy.getAttack()*2; 
     if(enemy.getHealth()<=0){ 
      enemy.setKnockedOut(true); 
     } 
    } 
    else if(enemy.getType().equals(Grass)){ 
     enemy.setHealth(enemy.getHealth()-attackFire/2); 
     healthFire = healthFire-enemy.getAttack()/2; 
     if(enemy.getHealth()<=0){ 
      enemy.setKnockedOut(true); 
     } 
     if(healthFire <=0){ 
      Charizard.set = true; 
     } 
    } 
    return enemyAttack; 
} 

}

答えて

0

あなたはこのようなあなたの異なったタイプを宣言したい:

static public final String GRASS= "Grass"; 
static public final String WATER = "Water"; 
static public final String FIRE = "Fire"; 

(I」フィールド名がstatic,publicfinalのすべての大文字である必要があります。

これらのフィールドを宣言することによって、Pokemonのタイプをテストする必要がある他のクラス(Pokemon、たとえばCharizardなど)を使用できます。 finalと宣言することにより、publicであっても誰もそれらを変更することはできません。彼らに初期値を与えることによって、あなたはそれはあなたがしているように見える、彼らは実際にPokemonの異なる種類を区別するための便利なだけでなく、あなたがknockedOutについてはp.getType().equals(Pokemon.FIRE)

のようなものを実行初めて起こる避けられないNullPointerExceptionを避ける作りますそれを正しい方法で扱います。フィールドknockedOutPokemonでプライベートですが、他のクラスがアクセスするために使用できるパブリックゲッターおよびセッターメソッドを提供しています。

関連する問題