2015-10-23 117 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