2015-10-24 2 views
0

Я создаю какой-то базовый rpg. Я использую композицию (Character and Fighter), и есть проблема в классе CharacterCreator. В нем говорится, что существуют несовместимые типы Game.Fighter (и остальные классы символов, которые я создал) и Game.Character. Любая идея, почему и как это исправить?Конструктор компоновки Java

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"); 
    } 


} 

} 

public class CharacterCreator { 

public static Character createCharacter() { 
    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 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": 
      hero = new Fighter(name); 
      break; 
     case "Rogue": 
      hero = new Rogue(name); 
      break; 
     case "Mage": 
      hero = new Mage(name); 
      break; 
     case "Cleric": 
      new Cleric(name); 
      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; 
     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; 


protected Character(String name){ 

    setName(name); 
    setCharacterClass("Class"); 
    setLevel(1); 
    setStrength(10); 
    setConstitution(10); 
    setDexterity(10); 
    setIntelligence(10); 
    setWisdom(10); 
    setCharisma(10); 
    setHp(0); 
    setCurrentHp(getHp()); 
    setArmorClass(10); 
    setXp(0); 

} 


void displayCharacter() throws IOException { 
    System.out.print("\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("Current HP: " + getCurrentHp()); 
    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 setName(String Name) { name = Name; } 
protected void setCharacterClass(String characterClass) { this.characterClass = characterClass; } 
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; } 
protected void setXp(int XP){xp = XP; } 

} 


public class Fighter { 

    Fighter(String name){ 

     Character hero = new Character(name); 

     hero.setName(name); 
     hero.setCharacterClass("Fighter"); 
     hero.setLevel(1); 
     hero.setStrength(14); 
     hero.setConstitution(16); 
     hero.setDexterity(14); 
     hero.setIntelligence(10); 
     hero.setWisdom(10); 
     hero.setCharisma(10); 
     hero.setHp((int) (10 + hero.getModifier(hero.getConstitution()))); 
     hero.setHp(10); 
     System.out.println("hero.getconst(): " + hero.getConstitution()); 
     System.out.println("hero.getModifier(getConstitution(): " + hero.getModifier(hero.getConstitution())); 
     hero.setCurrentHp(hero.getHp()); 
     hero.setArmorClass(10 + hero.getModifier(hero.getDexterity())); 


} 


} 
+3

Вы не отправляете точное и полное сообщение об ошибке, которое является наиболее важной информацией. То, что вы также должны сделать как можно скорее, переименовать символ в другое: оно конфликтует с java.lang.Character, которое вызовет у вас бесконечную боль. –

+0

java: несовместимые типы: Game.Fighter не может быть преобразован в Game.Character – Niminim

+0

И неправильная строка кода? –

ответ

0

Класс Figter объявлен как

public class Fighter { 

Так что делает не простираться от класса персонажа. Так что Истребитель не a Персонаж.

Однако CharacterCreator класс имеет следующий метод:

public static Character createCharacter() { 
    // ... 
    switch (chosenClass){ 
     case "Fighter": 
      hero = new Fighter(name); 
      break; 
      // ... 
    } 

    return hero; 
} 

Так вы пытаетесь вернуть истребитель от метода, который должен вернуть символ. И Истребитель не характер. Отсюда сообщение об ошибке.

+0

Получаю ваше мнение. Это должна быть композиция, а не наследование. Тогда как я могу это решить? – Niminim

+0

Композиция состоит из того, что «имеет» связь между двумя классами. Поэтому, я думаю, вы хотите, чтобы Charater имел поле типа Fighter и имел конструктор, такой как новый Character (someFighter). Но, учитывая имена, это не кажется правильным. Я даже не понимаю, почему у вас есть класс Fighter: у него нет поля и никакого метода. Все, что у него есть, - это конструктор, который создает персонаж. Это бесполезно. –

+0

Я хочу получить класс символов (например, истребитель) в качестве ввода и создать персонаж в соответствии с выбранным классом символов (например, истребитель) с заданными статистическими данными/способностями. Разумеется, символ имеет характерный класс, а не характерный класс. Как вы сказали, конструктор должен выглядеть как символ («Истребитель»). Любые предложения? – Niminim

0

Я хочу получить класс символов (например, истребитель) в качестве ввода и создать символ в соответствии с выбранным классом символов (например, истребитель) с заданными статистическими данными/способностями.

Создайте метод создания статического истребителя в символе (чтобы получить доступ к защищенным методам setXxxx()), создать новый экземпляр символа и переопределить нужную статистику.

class Character { 
    public static Character createFighter(String name) { 
     Character hero = new Character(name); 
     hero.setStrength(14); 
     hero.setCharacterClass("Fighter"); 
     hero.setStrength(14); 
     hero.setConstitution(16); 
     hero.setDexterity(14); 
     hero.setHp((int) (10 + hero.getModifier(hero.getConstitution()))); 
     hero.setCurrentHp(hero.getHp()); 
     hero.setArmorClass(10 + hero.getModifier(hero.getDexterity())); 

     return hero; 
    } 
} 

С другой стороны, передать класс символов в конструктор Character:

class Character { 
    public Character(String name, String charClass) { 
     // Initialize defaults 
     setStrength(10); 
     setIntelligence(10); 
     // etc 

     switch(charClass) { 
     case "Fighter": 
      setStrength(14); 
      // ... other overrides for Fighter 
      break; 
     case "Cleric": 
      // etc 
     } 
    } 
} 

Однако, если вы собираетесь делать много проверок против класса символов, вы должны использовать перечисление. И тогда вы могли бы даже поставить начальную статистику внутри класса перечисления. См. https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html, особенно пример Планеты.