Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用组合的Java_Java_Composition - Fatal编程技术网

使用组合的Java

使用组合的Java,java,composition,Java,Composition,我开始做一个基本的RPG游戏,我有一个小问题。我有一个角色类,这是我们的英雄和他的数据。我用构图来创造一个角色。我遇到的问题是CharacterCreator在createCharacter方法中,hero有问题。为什么,我该如何解决这个问题?代码如下: public class Game { public static void main(String[] args) throws IOException { Character h = CharacterCreato

我开始做一个基本的RPG游戏,我有一个小问题。我有一个角色类,这是我们的英雄和他的数据。我用构图来创造一个角色。我遇到的问题是
CharacterCreator
createCharacter
方法中,
hero
有问题。为什么,我该如何解决这个问题?代码如下:

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

        Character h = CharacterCreator.createCharacter();

        try {
            h.displayCharacter();
        } catch (Exception e) {
            System.out.println("Wrong");
        }

    }

}

public class CharacterCreator {

    public static Character createCharacter() {
        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();
        String chosenClass = getCharacterClass(scan);

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

        Character hero = null;

        switch (chosenClass) {
        case "Fighter":
            Fighter hero = new Fighter(name);
            break;
        case "Rogue":
            Rogue hero = new Rogue(name);
            break;
        case "Mage":
            Mage hero = new Mage(name);
            break;
        case "Cleric":
            Cleric hero = new Cleric(name);
            break;
        }

        return hero;
    }

    public static String getCharacterClass(int scan) {

        String classIn;

        switch (scan) {
        case 1:
            classIn = "Fighter";
            break;
        case 2:
            classIn = "Rogue";
            break;
        case 3:
            classIn = "Mage";
            break;
        case 4:
            classIn = "Cleric";
            break;
        default:
            System.out.println("Enter again");
            classIn = "def";
        }

        return classIn;
    }

}

public class Character {

    private String name;
    private String characterClass;
    private int level;
    private int hp;
    private int currentHp;
    private int armorClass;

    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;

    protected Character(String name) {

        setName(name);
        characterClass = "Class";
        setLevel(1);
        setStrength(10);
        setConstitution(14);
        setDexterity(14);
        setIntelligence(10);
        setWisdom(10);
        setCharisma(10);
        setHp(0 + getModifier(getConstitution()));
        setCurrentHp(getHp());
        setArmorClass(10 + getModifier(getDexterity()));
        setXp(0);

    }

    void displayCharacter() throws IOException {
        System.out.print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        System.out.println("Name: " + getName());
        System.out.println("Class: " + getCharacterClass());
        System.out.println("Level: " + getLevel());
        System.out.println("HP: " + getHp());
        System.out.println("Armor Class: " + getArmorClass());

        System.out.println("***************");
        System.out.println("Attributes: ");
        System.out.println("Strength: " + getStrength());
        System.out.println("Constitution: " + getConstitution());
        System.out.println("Dexterity: " + getDexterity());
        System.out.println("Intelligence: " + getIntelligence());
        System.out.println("Wisdom: " + getWisdom());
        System.out.println("Charisma: " + getCharisma());
        System.out.println("***************");
        System.out.println("XP: " + getXp());

    }

    public int getModifier(int number) {
        int mod = (int) ((number - 10) / 2);
        return mod;
    }

    public String getName() {
        return name;
    }

    public String getCharacterClass() {
        return characterClass;
    }

    public int getLevel() {
        return level;
    }

    public int getHp() {
        return hp;
    }

    public int getCurrentHp() {
        return currentHp;
    }

    public int getArmorClass() {
        return armorClass;
    }

    public int getStrength() {
        return strength;
    }

    public int getConstitution() {
        return constitution;
    }

    public int getDexterity() {
        return dexterity;
    }

    public int getIntelligence() {
        return intelligence;
    }

    public int getWisdom() {
        return wisdom;
    }

    public int getCharisma() {
        return charisma;
    }

    public long getXp() {
        return xp;
    }

    protected void setName(String Name) {
        name = Name;
    }

    protected void setCharacterClass(String characterClass) {
        this.characterClass = characterClass;
    }

    protected void setLevel(int lvl) {
        level = lvl;
    }

    protected void setHp(int hitPoints) {
        hp = hitPoints;
    }

    protected void setCurrentHp(int curHp) {
        currentHp = curHp;
    }

    protected void setArmorClass(int ac) {
        armorClass = ac;
    }

    protected void setStrength(int str) {
        strength = str;
    }

    protected void setConstitution(int con) {
        constitution = con;
    }

    protected void setDexterity(int dex) {
        dexterity = dex;
    }

    protected void setIntelligence(int intel) {
        intelligence = intel;
    }

    protected void setWisdom(int wis) {
        wisdom = wis;
    }

    protected void setCharisma(int cha) {
        charisma = cha;
    }

    protected void setXp(int XP) {
        xp = XP;
    }

}

class Fighter extends CharacterClass {

    Fighter(String name) {

        Character hero = new Character(name);

        hero.setName(name);
        hero.setCharacterClass("Fighter");
        hero.setLevel(1);
        hero.setStrength(14);
        hero.setConstitution(16);
        hero.setDexterity(14);
        hero.setIntelligence(10);
        hero.setWisdom(10);
        hero.setCharisma(10);
        hero.setHp(10 + hero.getModifier(getConstitution()));
        hero.setCurrentHp(hero.getHp());
        hero.setArmorClass(10 + hero.getModifier(getDexterity()));
    }

}

我可以在你的程序中看到一个潜在的编译器错误。这就是罪魁祸首:

switch (chosenClass){
        case "Fighter":
            Fighter hero = new Fighter(name);
            break;
        case "Rogue":
            Rogue hero = new Rogue(name);
            break;
        case "Mage":
            Mage hero = new Mage(name);
            break;
        case "Cleric":
            Cleric hero = new Cleric(name);
            break;
    }
在开关外壳外部声明一次
hero
变量

编辑:

createCharacter
方法中检查这段修改过的代码

Character hero = null;

switch (chosenClass){
    case "Fighter":
        hero = new Fighter(name);
        break;
    case "Rogue":
        hero = new Rogue(name);
        break;
    case "Mage":
        hero = new Mage(name);
        break;
    case "Cleric":
        hero = new Cleric(name);
        break;
}
这是你应该首先做的。一旦你这样做了,你会看到更多的错误出现。这是因为,您已经声明了
createCharacter
方法来返回Character的实例,但是
法师、牧师、战士、盗贼都是
CharacterClass
的子类。我在代码中没有看到名为
CharacterClass
的类。也许这就是您拥有的类。因此,我建议将上述4个子类更改为从Character isntead扩展到
CharacterClass
class,这在您的代码中是不存在的


最后,在需要初始化时,从基类构造函数调用超级类构造函数。

您将在交换机案例中创建新的hero实例,并将其分配给局部变量。在输入switch语句之前创建的hero变量将始终保持null。你需要将你的新英雄分配给这个变量

Character hero = null;
switch (chosenClass){
    case "Fighter":
        hero = new Fighter(name);
        break;
    case "Rogue":
        hero = new Rogue(name);
        break;
    case "Mage":
        hero = new Mage(name);
        break;
    case "Cleric":
        hero = new Cleric(name);
        break;
}
return hero;

有什么问题吗?堆栈跟踪?正确,但还有另一个问题。看看战斗机扩展了什么……它不工作了。我现在有了“角色英雄”;在切换之前。哦,我忘了更改它:)你的代码一开始不会编译。有一个编译问题,上面的建议解决了这个问题。你试过了吗?。您有运行时问题吗?已更新答案。请检查一下,它坏了。我现在在开关前有了“角色英雄”,没有空值。你可以先把它赋给空值。您只需要确保它被重新分配给switch语句中的实际字符。现在有两个问题:1)您没有处理chosenClass可能是“def”的情况。2) Fighter扩展了CharacterClass,而不是Character。Fighter扩展了什么(我忘了这么做了:))。但是它不起作用…那就意味着你在你的开关里重新创建了hero变量。您应该只在切换之前创建一次,并在切换内部分配它,例如:hero=new Fighter(名称);没问题,很高兴它成功了:)