首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RPG的Java面向对象设计

RPG的Java面向对象设计
EN

Stack Overflow用户
提问于 2015-10-25 18:05:07
回答 3查看 2K关注 0票数 2

我开始创建一个角色扮演作为我的第一个java项目。我不会向你展示我拥有的代码,而是它的一个极其简单的版本,这样就更容易解释和展示它到底应该做什么。在这里,我们有一个来自用户的输入,其中包含他选择的字符类的字符串(在本例中是Fighter或Rogue ),并且我们想要创建一个新的角色,我们的英雄。该字符有3个字段:字符类别(根据输入)和攻防。现在我想存储战斗和红色的攻击和防御的初始统计数据,这样代码就可以调用角色(ChosenCharacterClass)并创建具有正确统计数据的角色。应该怎么做呢?代码非常简单,所以很容易编辑。请记住,我有比2个更多的统计数据,所以这个解决方案应该适用于一个很长的统计数据列表(大部分是int,但我可能会有一些布尔值),所以避免使用枚举(避免继承,我不认为在这里将字符作为抽象类是最好的解决方案)。谢谢!

代码语言:javascript
复制
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; }

}
EN

回答 3

Stack Overflow用户

发布于 2015-10-25 18:51:46

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

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2015-10-25 18:43:56

我建议使用如下属性文件:

代码语言:javascript
复制
characters=Rogue,Fighter
character.Rogue.attack=15
character.Rogue.defense=7
character.Rogue.use_magic=false
character.Fighter.attack=12
character.Fighter.defense=13
character.Fighter.use_magic=false

您可以使用properties类(Java Standard)或resp读取属性文件。库,比如你的角色构造函数中的apache commons-configuration ( https://commons.apache.org/proper/commons-configuration/ )。获取匹配的值并将其设置在构造器中。

票数 0
EN

Stack Overflow用户

发布于 2015-10-25 19:45:23

我还没有读完完整的问题,但我所理解的是你有性格(勇士,斗士),每个人都有(攻击,防御)这样的属性。

所以“品格”本身并不是什么。它是抽象的。

代码语言:javascript
复制
public abstract class Character {
    private int attack;
    private int defense;

    public Character(int attack, int defense) {
        this.attack = attack;
        this.defense = defense;
    }

    public int getDefense() {
        return defense;
    }

    public void changeDefence(int alterDefence) {
        defense += alterDefence;
        if (defense < 0) {
            defense = 0;
        }
    }
    // similarly for attack 
}

这是你的战斗机

代码语言:javascript
复制
public class Fighter extends Character {
    public Fighter(int attack, int defense) {
        super(attack, defense);
    }
}

就像你的盗贼。现在再多想一想。“性格”是什么意思??战斗,行走..。太多了。这些都是接口,所以现在有接口IFight

代码语言:javascript
复制
public interface Fight<E extends Character> {
    public int fightStat (E char1);
}

现在"Character“将实现它。

所以“字符”的定义现在是

代码语言:javascript
复制
public abstract class Character<E extends Character> implements Fight<E>{
....

而"Fighter“现在必须在其中实现方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33328448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档