RPG 的 Java 面向对象设计

标签 java

我开始创建角色扮演作为我的第一个 Java 项目。我不会向您展示我拥有的代码,而只是展示它的一个极其简单的版本,这样可以更容易地解释和展示它到底应该做什么。开始吧 - 我们有来自用户的输入,其中包含他选择的角色类别(在本例中为战士或盗贼)的字符串,我们想要创建一个新角色,我们的英雄。角色有3个字段:角色类别(根据输入)和攻击与防御。现在我想存储 Fighter 和 Rouge 的初始攻击和防御统计数据,因此代码可以调用 Character(chosenCharacterClass) 并创建具有正确统计数据的角色。应该怎么做?代码非常简单,因此很容易编辑。请记住,我有超过 2 个统计数据,因此解决方案应该适用于较长的统计数据列表(其中大部分是 int 但我可能会有一些 boolean 值),因此避免使用枚举(和避免继承,我不认为让 Character 成为抽象类是最好的解决方案)。谢谢!

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

    Character hero = CharacterCreator.createCharacter();

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


}

}



public static Character createCharacter() {
    System.out.println("Choose a character: ");
    System.out.println("1. Fighter");
    System.out.println("2. Rogue");


    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":

            break;
        case "Rogue":

            break;
        case "def":
            System.out.println("Wrong input");
    }

    return hero;
}

    public static String getCharacterClass(int scan){

    String classIn;

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

    return classIn;
}
}


public class Character {

    private String characterClass;
    private int attack;
    private int defense;


    protected Character(String characterClass){
    setCharacterClass(characterClass); 
    setAttack();
    setDefense();

    }


    public String getCharacterClass() { return characterClass; }
    public int getAttack() { return attack; }
    public int getDefense() { return  defense; }


    protected void setCharacterClass(String characterClass) { this.characterClass = characterClass; }
    protected void setAttack(int atck){ attack = atck}
    protected void setDefense(int dfns){ defence = dfns; }

}

最佳答案

面向对象的方法是使 characterClass 成为一个类,并利用多态性,例如(以下为java伪代码,可能编译不通过)

interface CharacterClass {
    String getName();
    CharacterStats getBaseStats();
}

public class Warrior implements CharacterClass{
    private CharacterStats = new CharacterStats(){{  //anonymous class with static initializer
        attack = 66;
        defense = 54;
        ...
    }}
    public String getName(){
        return this.class.getSimpleName();
    }

}

public class CharacterStats {
    public int attack;
    public int defence;
    ...
}

public class Character {

    private String characterClass;
    public CharacterStats stats;


...

    public setCharacterBaseStats(CharacterStats baseStats){
        this.stats = baseStats;
    }
}

Character npc1 = new Character();
...
npc1.stats.attack += 1;

关于RPG 的 Java 面向对象设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33328448/

相关文章:

使用 JAXB 将 Java 转换为 XML

java Runtime.getRuntime().availableProcessors() 和 nproc 返回不同的值

java - Servlet Session 行为和 Session.invalidate

java - 在 ArrayList 中的指定索引处设置元素

java - 来自方法中创建的数组的 NullPointerException

java - 为什么应该首选 Java 类的接口(interface)?

java - 日期,字符串,格式java,android日期选择器

java - 使用不必要的时间和时区解析和格式化 LocalDate

java - 如何获取Map中值的大小?

java - 适用于 Blackberry 的二维码源