我正在用Java创建一个简单的基于文本的生存游戏作为我的最终项目。我仍然坚持创建库存。今天,我有点工作(正确添加和删除项目),但是当添加第三种不同类型的项目时,它覆盖了第二种。我不再拥有这个代码,而且我的老师帮助了#34;修复它#34;现在它甚至不显示库存。
主类:
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。我考虑过让每个项目的每个实例都占用自己的&#34;库存插槽&#34;但这对我来说不够好。最后,我没有包含Player类,因为它在这里无关紧要。它没有触及库存或物品等。
系统会打印添加和删除消息,但不会打印广告资源的内容,因为它之前最多有两个项目。
答案 0 :(得分: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;
}
}
}