2015-11-08 72 views
1

我正在开发我的第一个Java项目,我有一个问题。问题应该很简单(尽管代码不是那么简短,但没有理由被吓倒:))。我创建了一个基本的角色扮演游戏,并且我有一个抽象类“Character”来定义每个角色。在其子类中,你可以找到魔法师,他有一个魔法书(地图)。 Spellbook类提供了像addToSpellbook这样的方法,工作正常。另外,我有一个Inventory类,它有addToInventory方法,它与addToSpellbook完全相同。Java - Collection

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

我想原因是Map没有AddToInventory,所以我应该重写放,但仍然如何使用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; 

} 

} 
+2

请将您的代码缩小到相关部分。谢谢。 –

+0

我正在处理它,在一分钟内 – Niminim

+0

它现在更短:) – Niminim

回答

0

getInventory()返回MapMap没有addToInventory()方法。 getInventory()应添加一个Inventory实例。

+0

我知道,那正是我所说的。 – Niminim

+0

但为什么addToSpellbook的作品?这两种方法几乎完全相同,因此执行spellbook和库存 – Niminim

+0

@Niminim'getSpellBook()'(在'Mage'类中)返回一个'SpellBook',它有一个'addToSpellbook'方法。 – Eran