【发布时间】:2023-03-29 06:20:01
【问题描述】:
我开始创建一个基本的角色扮演游戏,现在我在做基础工作。我有一个用于创建新角色和现有角色的代码重复,这是一件非常糟糕的事情。我将解释我的问题 - 一开始,玩家可以通过使用CharacterCreator 调用来选择角色类别(如战士)。我有一个 Character 类,它描述了有关角色的所有信息。我还有一个名为CharacterClass 的abstract 类,它描述了字符类的特定属性和其他内容(例如Fighter,而不是Java 类)。 CharacterClass 有一些子类(如Fighter、Mage 等)。代码有效,但设计不佳。
我怎样才能摆脱Character和CharacterClass的代码重复?我应该改变设计吗?
public class Game {
public static void main(String[] args) {
Character hero = CharacterCreator.CharacterCreator();
}
}
public class CharacterCreator {
public static Character CharacterCreator() {
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 choice = getCharacterClass(scan);
System.out.println("Choose Name:");
Scanner nameIn = new Scanner(System.in);
String name = nameIn.next();
CharacterClass chosenClass = null;
Character hero = null;
switch (choice){
case "Fighter":
chosenClass = new Fighter();
break;
case "Rogue":
chosenClass = new Rogue();
break;
case "Mage":
chosenClass = new Mage();
break;
case "Cleric":
chosenClass = new Cleric();
break;
}
try {
hero = new Character(name, chosenClass);
System.out.println("A hero has been created");
hero.displayCharacter();
} catch (Exception e){
System.out.println("There was a problem assigning a character class");
}
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;
Character(String name, CharacterClass chosenClass){
this.name = name;
this.characterClass = chosenClass.getCharacterClass();
level = chosenClass.getLevel() ;
hp = ( chosenClass.getHp() + getModifier( chosenClass.getConstitution() ) );
currentHp = hp;
setArmorClass(10 + getModifier( + chosenClass.getDexterity()));
strength = chosenClass.getStrength();
constitution = chosenClass.getConstitution();
dexterity = chosenClass.getDexterity();
intelligence = chosenClass.getIntelligence();
wisdom = chosenClass.getWisdom();
charisma = chosenClass.getCharisma();
xp = 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 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; }
}
abstract class CharacterClass {
private String 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;
protected CharacterClass(){
setCharacterClass("Character Class");
setLevel(1);
setHp(10);
setStrength(10);
setConstitution(10);
setDexterity(10);
setIntelligence(10);
setWisdom(10);
setCharisma(10);
}
public String getCharacterClass() { return characterClass; }
public int getLevel() { return level; }
public int getHp() { return hp; }
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; }
protected void setCharacterClass(String characterClass){ this.characterClass = characterClass; }
protected void setLevel(int lvl){ level = lvl; }
protected void setHp(int hitPoints){ hp = hitPoints; }
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; }
}
class Fighter extends CharacterClass {
Fighter(){
setCharacterClass("Fighter");
setLevel(1);
setHp(10);
setStrength(14);
setConstitution(16);
setDexterity(14);
setIntelligence(10);
setWisdom(10);
setCharisma(10);
}
}
【问题讨论】:
-
附带说明,避免使用类名
Character(或java.lang或java.util中的任何其他名称),因为它往往会在令人惊讶的时候引起冲突。 -
尝试让您的问题更清楚 - 您正在努力解决的“代码重复”具体在哪里/具体是什么?
-
问题是 Character 和 CharacterClass 都有很多相同的 getter/setter,因为我创建了 CharacterClass 的子类,然后将其分配给 Character 的构造(加上 Character 构造的一些补充)。跨度>
-
如果你有 CharacterClass 作为你的抽象类(你的所有角色数据都有获取/设置)并且 Fighter、Rogue 等正在扩展该抽象类,你不应该需要“重新-实施”您的获取/设置。这是拥有这个超类实现的好处之一(例如:公共类 Fighter 扩展 CharacterClass)
-
是的,但是长代码会让人们专注于代码,而不是概念。概念设计可能比代码更重要。
标签: java oop code-duplication