2015-11-08 54 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