我正在做我的第一个Java项目,但有一个问题。这个问题应该很简单(尽管代码不是那么短,但是没有理由被吓到:))。我创建了一个基本的角色扮演游戏,并且有一个定义每个角色的抽象类“角色”。在其子类中,您可以找到拥有法术书(地图)的法师。 Spellbook类提供了类似addToSpellbook的方法,效果很好。另外,我还有一个具有addToInventory方法的Inventory类,该方法与addToSpellbook完全相同。

我的问题如下-为什么我可以在主要方法中使用addToSpellbook而不能使用AddToInventory?

我想原因是Map没有AddToInventory,所以我应该覆盖put,但是仍然如何使用addToSpellbook?

public class Game {
public static void main(String[] args) throws IOException {

    CharacterCreator heroCreator = new CharacterCreator();
    CharacterCreator.showAllClasses();

    Scanner sc = new Scanner(System.in);
    int scan = sc.nextInt();
    String chosenClass = CharacterCreator.getCharacterClass(scan);
    Character hero = CharacterCreator.createCharacter(chosenClass);
    try {
        hero.displayCharacter();
    }catch (Exception e){
        System.out.println("Problem displaying character data");
    }

    hero.getInventory().addToInventory("Long sword");


    CharacterCreator heroCreator2 = new CharacterCreator();
    CharacterCreator.showAllClasses();

    Scanner sc2 = new Scanner(System.in);
    int scan2 = sc.nextInt();
    String chosenClass2 = CharacterCreator.getCharacterClass(scan2);
    Character hero2 = CharacterCreator.createCharacter(chosenClass2);
    try {
        hero2.displayCharacter();
    }catch (Exception e){
        System.out.println("Wrong input");
    }

    if(hero instanceof Mage) {
        ((Mage)hero).getSpellBook().addToSpellBook("Magic Missiles");
        ((Mage)hero).getSpellBook().addToSpellBook("Fireball");
        ((Mage)hero).getSpellBook().addToSpellBook("Mage Armor");

        ((Mage)hero).getSpellBook().showSpellBook();
        ((Mage)hero).getSpellBook().getSpellFromSpellbook("Fireball").castSpell(hero, hero2);
        ((Mage)hero).getSpellBook().getSpellFromSpellbook("Magic Missiles").castSpell(hero, hero2);
        ((Mage)hero).getSpellBook().getSpellFromSpellbook("Mage Armor").castSpell(hero, hero);

    }


}

}


abstract public class Character {



private Equipment equipment;

private Map<String, Integer> inventory;



protected Character(String name){

    equipment = new Equipment();

    inventory = new HashMap<String, Integer>();

}

protected Character(String name, int lvl){


    equipment = new Equipment();

    inventory = new HashMap<String, Integer>();

}


}






public Equipment getEquipment() { return equipment; }
public Map getInventory() { return inventory; }


}

public class Inventory {

private Map<String,Integer> inventory;

Inventory() {

    inventory = new HashMap<String, Integer>();
}

public void addToInventory(String item) {

    boolean found = false;

    try {
        for (Iterator<Map.Entry<String, Integer>> iter = inventory.entrySet().iterator(); iter.hasNext(); ) {
            Map.Entry<String, Integer> newItem = iter.next();
            if (newItem.getKey() == item) {
                inventory.put(item, inventory.get(newItem) + 1);
                break;
            }
        }
    }catch (Exception e) {
        System.out.println(item + " : adding failed");
    }

    if (!found) {
        inventory.put(item,1);
    }

}


public void showInventory() {

    System.out.println("Show Inventory: ");

    for (Map.Entry<String,Integer> entry: inventory.entrySet()) {
        System.out.println( entry.getKey()  + ", quantity: " + entry.getValue() );
    }
    System.out.println("");
}

}


public class Mage extends Character {


private SpellBook spellBook;


public Mage(String name) {

    super(name);

    SpellBook spellbook = new SpellBook();

}

protected Mage(String name, int lvl){

    super(name, lvl);


    spellBook = new SpellBook();


}


public SpellBook getSpellBook() { return spellBook; }


}



}


public class SpellBook {

private Map<String, Spell> spellBook;

SpellBook() {

    spellBook = new HashMap<String, Spell>();
}

public Map getSpellBook() { return spellBook; }


public void addToSpellBook(String spellName) {

    Spell newSpell = null;

    try {

        if (DamageSpell.getSpell(spellName) != null) {
            newSpell = DamageSpell.getSpell(spellName);
        } else if (ChangeStatSpell.getSpell(spellName) != null) {
            newSpell = ChangeStatSpell.getSpell(spellName);
        }

        System.out.println(newSpell.getSpellName() + " has been added to the spellbook");
        spellBook.put(newSpell.getSpellName(), newSpell);

    } catch (Exception e){
        System.out.println("Adding " + spellName +"to spellbook has failed");
    }

}


public void showSpellBook() {

    System.out.println("Show spellbook: ");

    for (Iterator<String> iter = spellBook.keySet().iterator(); iter.hasNext(); ) {
        String spell = iter.next();
        System.out.println(spell);
    }
    System.out.println("");
}

public Spell getSpellFromSpellbook(String spellName) {

    Spell spl = null;

    //Spell splGet = spellBook.get(spellName); /* straight forward   implementation*/
   // System.out.println("The spell " + splGet.getSpellName() + " has been retrived from the spellbook by using get method");

    try {
        for (Iterator<Map.Entry<String, Spell>> iter = spellBook.entrySet().iterator(); iter.hasNext(); ) {
            Map.Entry<String, Spell> spell = iter.next();
            if (spell.getKey() == spellName) {
                spl =  spell.getValue();
            }
        }
    }catch (Exception e) {
        System.out.println(spellName + " : no such spell in spellbook");
    }
   return spl;

}

}

最佳答案

getInventory()返回Map,而Map没有addToInventory()方法。
getInventory()应该添加一个Inventory实例。

09-12 05:14