我开始创建角色扮演作为我的第一个java项目。我不会向您展示我所拥有的代码,但只是一个非常简单的版本,因此它更容易解释并显示应该做什么。我们在这里 - 我们有一个来自用户的输入,其中包含他所选择的角色类的字符串(在这种情况下是战斗机或盗贼),我们想创建一个新角色,我们的英雄。角色有3个字段:字符类(根据输入)和攻击和防御。现在我想存储Fighter和Rouge的初始攻击和防御统计数据,因此代码可以调用Character(selectedCharacterClass)并创建具有正确统计数据的角色。怎么做?代码非常简单,因此编辑起来很容易。请记住,我有超过2个统计数据,所以解决方案应该适用于长统计列表(大多数都是int,但我可能会有一些布尔值),所以避免使用枚举(和避免继承,我不认为将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; }
}
答案 0 :(得分:1)
面向对象的方式是使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;
答案 1 :(得分:0)
我建议使用以下属性文件:
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标准)或resp读取属性文件。库像例如您的Character-constructor中的apache commons-configuration(https://commons.apache.org/proper/commons-configuration/)。获取匹配值并在构造函数中设置它。
答案 2 :(得分:0)
我还没有阅读完整的问题,但我明白的是你有角色(战士,战士),每个人都有像(攻击,防御)这样的属性。
所以"字符",本身就什么都不是。这是抽象的。
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
}
这是你的战士
public class Fighter extends Character {
public Fighter(int attack, int defense) {
super(attack, defense);
}
}
同样是你的盗贼。 现在再想想。什么&#34;字符&#34;是在做?? 战斗,走......等等。这些都是相互关联的 所以现在有界面IFight
public interface Fight<E extends Character> {
public int fightStat (E char1);
}
现在&#34;字符&#34;将要实施它。
所以&#34;字符&#34;现在定义
public abstract class Character<E extends Character> implements Fight<E>{
....
和#34;战斗机&#34;现在必须在其中实现方法。