2015-10-23 116 views
0

我開始開發我的第一個Java項目,這是一種基本的角色扮演遊戲。我想創建一個角色。抽象類的子類的Java構造函數

首先我要解釋一些事情:

  • Game類 - 獲取字符類輸入(如戰鬥機)。
  • Character - 擁有所有的字符數據。
  • CharacterClass - 抽象類,包含每個字符類的信息(如Fighter)。
  • Fighter(和其他類)擴展了抽象類CharacterClass,應設置所選字符類的初始統計信息(如Fighter)。

我想要做的是選擇Game字符類(讓我們假設我選擇Fighter),並通過displayStats得到所有的統計數據。當角色選擇一個班級時,Game應該調用類似於:Chracter ch = new Character(name, scan),然後ch.displayCharacter

我的問題是Fighter的構造函數並將此數據分配給Character的構造函數。

public class Game { 
public static void main(String[] args) { 

    System.out.println("Choose a character: "); 
    System.out.println("1. Fighter"); 
    System.out.println("2. Rogue"); 
    System.out.println("3. Mage"); 
    System.out.println("4. Cleric"); 


    Scanner sc = new Scanner(System.in); 
    int scan = sc.nextInt(); 
    System.out.println("Character Class: " + CharacterUtil.getCharacterClass(scan)); 

    System.out.println("Choose Name:"); 
    Scanner nameIn = new Scanner(System.in); 
    String name = nameIn.next(); 
    System.out.println("Name: " + name); 

} 
} 


public class Character { 

private String name; 
private String characterClass; 
private int level; 
private int hp; 
private int currentHp; 
private long xp; 
/*private int BAB; /*Base attack bonus*/ 

private int strength; 
private int constitution; 
private int dexterity; 
private int intelligence; 
private int wisdom; 
private int charisma; 

Character(String name, String chracterClass){ 

    this.name = name; 
    this.characterClass = chracterClass; 
    level = ; 
    hp = ; 
    currentHp = hp; 
    xp = 0; 
    strength = ; 
    constitution = ; 
    dexterity = ; 
    intelligence = ; 
    wisdom = ; 
    charisma = ; 


} 


void displayCharacter(){ 
    System.out.println("Name: " + name); 
    System.out.println("Level: " + level); 
    System.out.println("Class: " + characterClass); 
    System.out.println("HP: " + hp); 
    System.out.println("Attributes: "); 
    System.out.println("Strength: " + strength); 
    System.out.println("Constitution: " + constitution); 
    System.out.println("Dexterity: " + dexterity); 
    System.out.println("Intelligence: " + intelligence); 
    System.out.println("Wisdom: " + wisdom); 
    System.out.println("Charisma: " + strength); 
    System.out.println("XP: " + xp); 

} 

} 

abstract class CharacterClass { 

private int level; 
private int hp; 

private int strength; 
private int constitution; 
private int dexterity; 
private int intelligence; 
private int wisdom; 
private int charisma; 

CharacterClass(){ 

    level = 1; 
    hp = 10; 
    strength = 10; 
    constitution = 10; 
    dexterity = 10; 
    intelligence = 10; 
    wisdom = 10; 
    charisma = 10; 
} 

class Fighter extends CharacterClass { 

Fighter(){ 
    super.level = 1; 
    super.hp = 10; 
    super.strength = 16; 
    super.constitution = 14; 
    super.dexterity = 14; 
    super.intelligence = 10; 
    super.wisdom= 10; 
    super.charisma = 10; 
} 
} 
+1

你能給我們提供關於這個問題的更多細節嗎?我不明白你的意思是「我的問題是戰士的構造函數,並將這些數據分配給角色的構造函數。」 – RustyTheBoyRobot

回答

2

要麼使你的CharacterClass私人領域的保護,而不是私人,使他們能夠通過子類來訪問或實現getter/setter方法在抽象類和使用它們的子類構造函數。另外super.field並不代表任何東西:你是一個instanciating一個對象,將有抽象類和子類的字段,它將是this.fields,你想訪問。

示例代碼:

public abstract class CharacterClass { 

    private int intelligence; 
    private int strength; 
    private int dexterity; 
    private int vitality; 

    protected CharacterClass() { 
     setIntelligence(10); 
     setStrength(10); 
     setDexterity(10); 
     setVitality(10); 
    } 

    public int getDexterity() { 
     return dexterity; 
    } 
    protected void setDexterity(int dexterity) { 
     this.dexterity = dexterity; 
    } 
    public int getVitality() { 
     return vitality; 
    } 
    protected void setVitality(int vitality) { 
     this.vitality = vitality; 
    } 
    public int getStrength() { 
     return strength; 
    } 
    protected void setStrength(int strength) { 
     this.strength = strength; 
    } 
    public int getIntelligence() { 
     return intelligence; 
    } 
    protected void setIntelligence(int intelligence) { 
     this.intelligence = intelligence; 
    } 

} 

public class Fighter extends CharacterClass { 

    public Fighter() { 
     setStrength(15); 
     setVitality(15); 
    } 

} 

public class Main { 

    public static void main(String[] args) { 
     CharacterClass player = new Fighter(); 

     System.out.println(player.getStrength()); 
     System.out.println(player.getIntelligence()); 
    } 

} 

這將打印15,然後10,因爲實力已經被figther修改,但情報仍是一個在CharacterClass中定義。

請注意,您可能希望您的播放器不只是CharacterClass或Figther。雖然你將有很多Figther,Rogue和Mages作爲PNJ,但玩家將擁有其他一系列可能性,例如在他的庫存中存儲物品,與世界進行互動等。

祝您的遊戲順利!

+0

我寧願將其保留爲私有。我將在我的抽象類中添加getters/setters。然後我會在Fighter中使用setter。我需要在Character中創建一個對象(CharacterClass的一個子類,如Fighter,根據輸入),並使用getter作爲Character的構造函數。對 ?我錯過了什麼嗎? – Niminim

+0

對,應該是這個而不是超級。 – Niminim

+1

@Niminim沒有那樣,雖然如果你的角色本身擴展Fighter,它可能會更自然:我相信訪問Character.getStrength()而不是Character.getCharacterClass()會更自然。getStrength() – Aaron