2016-12-14 52 views
0

我正在製作一個基於Java的簡單的基於文本的生存遊戲作爲我的最終項目。我仍然堅持創建廣告資源。今天,我有點工作了(正確添加和刪除項目),但是當添加第三種不同類型的項目時,它覆蓋了第二項。我不再有這段代碼,我的老師幫助「修復它」,現在它甚至不顯示庫存。試圖在ArrayList中組合一個項目的多個實例

主類:

public class SurvivalGame{ 

//inv 
    static ArrayList<Item> inv = new ArrayList<Item>(); 
//items 
    static Item Water = new Item("Water ", 1); 

public static void main(String[] args){ 
//intro(); 
addItem(Water); 
addItem(Water); 
removeItem(Water); 
showInv(); 
} 

添加項方法:

public static void addItem(Item item){ 
for(int i = 0; i < inv.size(); i++){ 
    if(inv.get(i).getName().equals(item.getName())){ 
    inv.get(i).addQuantity(); 
    } 
break; 
    } 
System.out.println("Item added: 1 " + item.getName());} 

刪除項目方法:

public static void removeItem(Item item){ 
for(int i = 0; i < inv.size(); i++){ 
    if((inv.get(i).getName()).equals(item.getName())){ 
    if((inv.get(i).getQuantity()) == 0){ 
     inv.remove(item); 
    } 
    else inv.get(i).minusQuantity(); 
    } 
    break; 
} 

System.out.println("Item removed: 1 " + item.getName());} 

顯示盤存法:

public static void showInv(){ 
System.out.println("You have the following: "); 
for(int i = 0; i < inv.size(); i++) 
    inv.get(i).showItem(); 
    } 
}//(end of class) 

項目類:

public class Item{ 

String name; 
int quantity; 

public Item(String n, int q){ 
    name = n; 
    quantity = q; 
} 

public String getName(){ 
    return name;} 

public void addQuantity(){ 
    quantity += 1;} 

public void minusQuantity(){ 
    quantity -= 1;} 

public int getQuantity(){ 
    return quantity;} 

public void showItem(){ 
    System.out.println(getQuantity() + " " + getName());} 

}//(end of class) 

這可能是一些小的是我俯瞰,所以一些幫助將非常感激!在這方面,我不能再是初學者了,我已經嘗試了幾次重寫。我不知道如何使用列表,所以我寧願將庫存作爲一個ArrayList。我考慮讓每個項目的每個實例佔用自己的「庫存槽位」,但這對我來說還不夠好。最後,我沒有包含Player類,因爲它在這裏不重要。它不觸及庫存或物品等。

系統打印添加和刪除消息,但不打印庫存的內容,因爲它最多有兩個項目。

+0

與調試器通過步進應該很快發現,當你認爲它是沒有被叫什麼線或不更新什麼價值預期。 – NESPowerGlove

回答

0

我可以在你addItem方法看到兩個明顯的要點:

public static void addItem(Item item) { 
    for (int i = 0; i < inv.size(); i++) { 
     if (inv.get(i).getName().equals(item.getName())) { 
      inv.get(i).addQuantity(); 
     } 
     break; 
    } 
    System.out.println("Item added: 1 " + item.getName()); 
} 

第一:break;應該是你if的體內,因爲現在它會退出每一次後第一次運行循環。

第二種:當您的廣告資源中尚未包含該商品時,您錯過了初始添加。您只會增加現有項目的數量。

試試這個:

public static void addItem(Item item) { 
    boolean found = false; 
    for (int i = 0; i < inv.size(); i++) { 
     if (inv.get(i).getName().equals(item.getName())) { 
      inv.get(i).addQuantity(); 
      // Remember that we already had the item in inventory 
      found = true; 
      break; 
     } 
    } 
    if (!found) { 
     // Item isn't in inventory yet: add it 
     inv.add(item); 
    } 
    System.out.println("Item added: 1 " + item.getName()); 
} 

請注意,您removeItem方法也看起來很奇怪:

public static void removeItem(Item item) { 
    for (int i = 0; i < inv.size(); i++) { 
     if ((inv.get(i).getName()).equals(item.getName())) { 
      if ((inv.get(i).getQuantity()) == 0) { 
       inv.remove(item); 
      } 
      else inv.get(i).minusQuantity(); 
     } 
     break; 
    } 
} 

break再次應該是內部的(第一)if和您要撥打minusQuantity()在任何情況下。

考慮與您的庫存數量1項:你的第一個條件產量false,因爲getQuantity()不爲0,那麼你打電話minusQuantity(),並與庫存量的0還是項目結束。

試試這個:

public static void removeItem(Item item) { 
    for (int i = 0; i < inv.size(); i++) { 
     if (inv.get(i).getName().equals(item.getName())) { 
      // Reduce quantity 
      inv.get(i).minusQuantity(); 
      if (inv.get(i).getQuantity() == 0) { 
       // We don't have any quantity left: remove item from inventory 
       inv.remove(item); 
      } 
      break; 
     } 
    } 
} 
+0

我剛要回來,說我忘了做「其他,inv.add(item); –

+0

哇,非常感謝你!!!現在完美的作品,即使有兩個或更多的項目。完全爲什麼以及它是如何工作的(我從不使用那些「有效」的東西,但我不知道爲什麼或如何)。 –

相關問題