2016-12-14 73 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

哇,非常感谢你!!!现在完美的作品,即使有两个或更多的项目。完全为什么以及它是如何工作的(我从不使用那些“有效”的东西,但我不知道为什么或如何)。 –

相关问题