2013-04-27 53 views
4

我正在创建一个能够自动创建玩家角色的程序。以下是我的PlayerCharacter班。我注意到我对不同的变量重复了许多操作。Java - 寻找更高效的代码类方法

public class PlayerCharacter { 

    int strength, dexterity, constitution, intelligence, wisdom, charisma; 
    int[] strRolls, dexRolls, conRolls, intRolls, wisRolls, charRolls; 

    public void generateAbilityScoresMethod1() { 

     strRolls = new int[3]; 
     dexRolls = new int[3]; 
     conRolls = new int[3]; 
     intRolls = new int[3]; 
     wisRolls = new int[3]; 
     charRolls = new int[3]; 

     for(int i = 0; i < 3; i++) { 

      strRolls[i] = dice.Dice.D6.getNewRoll(); 
      strength += strRolls[i]; 

      dexRolls[i] = dice.Dice.D6.getNewRoll(); 
      dexterity += dexRolls[i]; 

      conRolls[i] = dice.Dice.D6.getNewRoll(); 
      constitution += conRolls[i]; 

      intRolls[i] = dice.Dice.D6.getNewRoll(); 
      intelligence += intRolls[i]; 

      wisRolls[i] = dice.Dice.D6.getNewRoll(); 
      wisdom += wisRolls[i]; 

      charRolls[i] = dice.Dice.D6.getNewRoll(); 
      charisma += charRolls[i]; 

     } 


    } 

    public int getStrength() { 
     return strength; 
    } 

    public void printStrRolls() { 
     System.out.println("Str: roll 1 = " + strRolls[0]); 
     System.out.println("Str: roll 2 = " + strRolls[1]); 
     System.out.println("Str: roll 3 = " + strRolls[2]); 
    } 

    public int getDexterity() { 
     return dexterity; 
    } 

    public void printDexRolls() { 
     System.out.println("Dex: roll 1 = " + dexRolls[0]); 
     System.out.println("Dex: roll 2 = " + dexRolls[1]); 
     System.out.println("Dex: roll 3 = " + dexRolls[2]); 
    } 

    public int getConsitution() { 
     return constitution; 
    } 

    public void printConRolls() { 
     System.out.println("Con: roll 1 = " + conRolls[0]); 
     System.out.println("Con: roll 2 = " + conRolls[1]); 
     System.out.println("Con: roll 3 = " + conRolls[2]); 
    } 

    public int getIntelligence() { 
     return intelligence; 
    } 

    public void printIntRolls() { 
     System.out.println("Int: roll 1 = " + intRolls[0]); 
     System.out.println("Int: roll 2 = " + intRolls[1]); 
     System.out.println("Int: roll 3 = " + intRolls[2]); 
    } 

    public int getWisdom() { 
     return wisdom; 
    } 

    public void printWisRolls() { 
     System.out.println("Wis: roll 1 = " + wisRolls[0]); 
     System.out.println("Wis: roll 2 = " + wisRolls[1]); 
     System.out.println("Wis: roll 3 = " + wisRolls[2]); 
    } 

    public int getCharisma() { 
     return charisma; 
    } 

    public void printCharRolls() { 
     System.out.println("Char: roll 1 = " + charRolls[0]); 
     System.out.println("Char: roll 2 = " + charRolls[1]); 
     System.out.println("Char: roll 3 = " + charRolls[2]); 
    } 

    public void printAbilities() { 
     System.out.println("Str = " + getStrength()); 
     System.out.println("Dex = " + getDexterity()); 
     System.out.println("Con = " + getConsitution()); 
     System.out.println("Int = " + getIntelligence()); 
     System.out.println("Wis = " + getWisdom()); 
     System.out.println("Char = " + getCharisma()); 
    } 

} 

如何以更高效的方式完成相同的任务?

+0

你为什么要存放Rolls数组呢? – UmNyobe 2013-04-27 13:00:07

+0

大部分人都很好奇,看看我的骰子怎么样。 – 2013-04-27 13:01:56

回答

3

您可以声明一个类Ability并使strength, dexterity,...其实例。下面的代码片段可能是一个开始:

class Ability { 

    private final int[] rolls; 
    private int value; 

    public Ability(int dice) { 
     rolls = new int[dice]; 
    } 

    public int roll() { 
     value = 0; 
     for (int i = 0; i < rolls.length; i++) { 
      rolls[i] = dice.Dice.D6.getNewRoll(); 
      value += rolls[i]; 
     } 
     return value; 
    } 

    public int getValue() { 
     return value; 
    } 

    public void printRolls() { 
     // ... tbd ... 
    } 

} 

您可以使用该技能像...

Ability strength; 
strength = new Ability(3); 
strength.roll(); // get new value 
System.out.println(strength.getValue()); // e.g. print 
strength.printRolls(); // e.g. print rolls 
0

如何:

public void printRolls(String label, int[] rolls) { 
    System.out.println(label + ": roll 1 = " + rolls[0]); 
    System.out.println(label + ": roll 2 = " + rolls[1]); 
    System.out.println(label + ": roll 3 = " + rolls[2]); 
} 
0

可以减少重复的代码行此

enum Attribute { 
    Str, Con, Dex, Int, Wis, Cha 
} 

class PlayerCharacter { 
    static final Random rand = new Random(); 
    static final Attribute[] ATTRS = Attributes.values(); 
    final int[] attr = new int[ATTRS.length]; 

    PlayerCharacter() { 
     for(int i = 0; i < attr.length; i++) 
      attr[i] = rand.nextInt(6) + rand.nextInt(6) + rand.nextInt(6) + 3; 
    } 

    public int getAttr(Attribute attr) { 
     return attrs[attr.ordinal()]; 
    } 

    public void printAbilities() { 
     for(int i = 0; i < ATTRS.length; i++) 
      System.out.println(ATTRS[i]+ " = " + attrs[i]); 
    } 

注意:您可能需要的任何其他属性,如HP,AC,最大HP,等级,XP,等等。

0

我会做的唯一的事情有创建一个静态的骰子滚动方法,该方法返回阵列需要,这样就可以产生任何类型的骰子掷骰数组:

public static int[] roll(int numberOfDice, int sidesOnEachDie) { 
    int[] result = new int[numberOfDice]; 
    for(int i = 0; i < numberOfDice; ++i) { 
     result[i] = 1 + (int) Math.floor(Math.random() * 
       (double) sidesOnEachDie); 
    } 
    return result; 
} 

然后就可以调用,例如:

intRolls = roll(3, 6); 

这将给出在一个int数组中滚动3D6的结果。

+0

我的卷由Dice枚举类处理。 – 2013-04-27 13:07:22

+0

添加选项以一次性返回多个卷到Dice类的时间太晚了吗?如果您可以让Dice类通过一个方法调用返回多个结果,它将消除在代码的主流程中添加for循环的需要。 – Bobulous 2013-04-27 13:10:27

+0

我相信这当然是一个可行的选择。 – 2013-04-27 13:12:27

0

您可以将所有属性保留在int []中。因此,而不是力量,敏捷,体质,智力,智慧,魅力作为独立变量有一个

int[] characteristics; 

然后0将强度; 1会灵巧等等。

要保持滚动值,您需要一个int [] []。

-1

这是较少的代码;它在CPU使用或内存使用方面并不“高效”,但会使代码缩短以便读写。我认为骰子卷是随机的,不管他们的顺序如何。

package example; 

public class PlayerCharacter 
{ 

    int strength, dexterity, constitution, intelligence, wisdom, charisma; 
    int[] strRolls, dexRolls, conRolls, intRolls, wisRolls, charRolls; 

    private int getScore(Dice d, int[] storage) 
    { 
    for (int i=0; i<storage.length; i++) 
    { 
     storage[i] = d.getNewRoll(); 
    } 
    int result = 0; 
    for (int i=0; i<storage.length; i++) { result += storage[i]; } 

    } 

    public void generateAbilityScoresMethod1() 
    { 

    strRolls = new int[3]; 
    dexRolls = new int[3]; 
    conRolls = new int[3]; 
    intRolls = new int[3]; 
    wisRolls = new int[3]; 
    charRolls = new int[3]; 

    for (int i = 0; i < 3; i++) 
    { 
     strength  = getScore(dice.Dice.D6, strRolls); 
     dexterity  = getScore(dice.Dice.D6, dexRolls); 
     constitution = getScore(dice.Dice.D6, conRolls); 
     intelligence = getScore(dice.Dice.D6, intRolls); 
     wisdom  = getScore(dice.Dice.D6, wisRolls); 
     charisma  = getScore(dice.Dice.D6, charRolls); 

    } 

    } 

    public int getStrength() 
    { 
    return strength; 
    } 

    private void printArrayRolls(String label, int[] rolls) 
    { 
    for (int i=0; i < rolls.length; i++) 
    { 
     System.out.println(label + ": roll " + rolls[i]); 
    } 
    } 

    public void printStrRolls() 
    { 
    printArrayRolls("Str", strRolls); 
    } 

    public int getDexterity() 
    { 
    return dexterity; 
    } 

    public void printDexRolls() 
    { 
    printArrayRolls("Dex", dexRolls); 
    } 

    public int getConsitution() 
    { 
    return constitution; 
    } 

    public void printConRolls() 
    { 
    printArrayRolls("Con", conRolls); 
    } 

    public int getIntelligence() 
    { 
    return intelligence; 
    } 

    public void printIntRolls() 
    { 
    printArrayRolls("Int", intRolls); 
    } 

    public int getWisdom() 
    { 
    return wisdom; 
    } 

    public void printWisRolls() 
    { 
    printArrayRolls("Wis", wisRolls); 
    } 

    public int getCharisma() 
    { 
    return charisma; 
    } 

    public void printCharRolls() 
    { 
    printArrayRolls("Char", charRolls); 
    } 

    public void printAbilities() 
    { 
    System.out.println("Str = " + getStrength()); 
    System.out.println("Dex = " + getDexterity()); 
    System.out.println("Con = " + getConsitution()); 
    System.out.println("Int = " + getIntelligence()); 
    System.out.println("Wis = " + getWisdom()); 
    System.out.println("Char = " + getCharisma()); 
    } 

} 
+0

谁会低估这种关怀来解释原因? – arcy 2013-04-27 13:37:36

0

这是少代码;它在CPU使用或内存使用方面并不是“更高效”,但是使得代码更短以便写入和读取。我认为骰子卷是随机的,不管他们的顺序如何。

package example; 

public class PlayerCharacter 
{ 

    int strength, dexterity, constitution, intelligence, wisdom, charisma; 
    int[] strRolls, dexRolls, conRolls, intRolls, wisRolls, charRolls; 

    private int getScore(Dice d, int[] storage) 
    { 
    for (int i=0; i<storage.length; i++) 
    { 
     storage[i] = d.getNewRoll(); 
    } 
    int result = 0; 
    for (int i=0; i<storage.length; i++) { result += storage[i]; } 

    } 

    public void generateAbilityScoresMethod1() 
    { 

    strRolls = new int[3]; 
    dexRolls = new int[3]; 
    conRolls = new int[3]; 
    intRolls = new int[3]; 
    wisRolls = new int[3]; 
    charRolls = new int[3]; 

    for (int i = 0; i < 3; i++) 
    { 
     strength  = getScore(dice.Dice.D6, strRolls); 
     dexterity  = getScore(dice.Dice.D6, dexRolls); 
     constitution = getScore(dice.Dice.D6, conRolls); 
     intelligence = getScore(dice.Dice.D6, intRolls); 
     wisdom  = getScore(dice.Dice.D6, wisRolls); 
     charisma  = getScore(dice.Dice.D6, charRolls); 

    } 

    } 

    public int getStrength() 
    { 
    return strength; 
    } 

    private void printArrayRolls(String label, int[] rolls) 
    { 
    for (int i=0; i < rolls.length; i++) 
    { 
     System.out.println(label + ": roll " + rolls[i]); 
    } 
    } 

    public void printStrRolls() 
    { 
    printArrayRolls("Str", strRolls); 
    } 

    public int getDexterity() 
    { 
    return dexterity; 
    } 

    public void printDexRolls() 
    { 
    printArrayRolls("Dex", dexRolls); 
    } 

    public int getConsitution() 
    { 
    return constitution; 
    } 

    public void printConRolls() 
    { 
    printArrayRolls("Con", conRolls); 
    } 

    public int getIntelligence() 
    { 
    return intelligence; 
    } 

    public void printIntRolls() 
    { 
    printArrayRolls("Int", intRolls); 
    } 

    public int getWisdom() 
    { 
    return wisdom; 
    } 

    public void printWisRolls() 
    { 
    printArrayRolls("Wis", wisRolls); 
    } 

    public int getCharisma() 
    { 
    return charisma; 
    } 

    public void printCharRolls() 
    { 
    printArrayRolls("Char", charRolls); 
    } 

    public void printAbilities() 
    { 
    System.out.println("Str = " + getStrength()); 
    System.out.println("Dex = " + getDexterity()); 
    System.out.println("Con = " + getConsitution()); 
    System.out.println("Int = " + getIntelligence()); 
    System.out.println("Wis = " + getWisdom()); 
    System.out.println("Char = " + getCharisma()); 
    } 

}