【问题标题】:Java - Bug in Shop SystemJava - 商店系统中的错误
【发布时间】:2020-12-02 14:54:20
【问题描述】:

所以我有一些库存/商店互动,但我找不到解决方案。

玩家应该能够在我的 Item 类构造函数中以预定义的买入/卖出值买卖物品。在扫描仪的帮助下,我可以在没有任何错误的情况下进行销售。但是,如果我购买任何数量,那么整个数量都会以某种方式购买。购买任意数量后,商品数量设置为0。

    private void buyItem() {
    System.out.println("Which item would you like to buy?");
    showStock();

    @SuppressWarnings("resource")
    Scanner sc = new Scanner(System.in);
    String itemName = "" + sc.next();
    
    for (int i = 0; i < store.length; i++) {
        if (store[i] != null && store[i].getName().equals(itemName)) {
            // Checks if the given item name is available in the store
            System.out.println("We have " + store[i].getQuantity() + " " + store[i].getName() + "s in our stock. " + store[i].getBuyPrice() + " each");
            System.out.println("How many would you like to buy?");
            int buyQuantity = sc.nextInt();
            // Checks if there is enough in the stock
            if (buyQuantity > store[i].getQuantity()) {
                System.out.println("Not enough " + store[i].getName() + " available in the stock.");
                break;
            } else {
                // Checks if Player can afford it
                if (Player.getInstance().getCoins() >= store[i].getBuyPrice()) {
                    // Update player inventory
                    Player.getInstance().removeCoins(buyQuantity * store[i].getBuyPrice());
                    Item item = store[i];
                    item.setQuantity(buyQuantity);
                    Player.getInstance().getInv().addItem(item);
                    
                    // Buy transaction
                    store[i].setQuantity(store[i].getQuantity() - buyQuantity);
                    System.out.println("You have purchased " + buyQuantity + "x " + itemName);
                    System.out.println("Coins: " + Player.getInstance().getCoins());
                    
                    // Checks if the entire amount has been bought
                    if (buyQuantity == store[i].getQuantity()) {
                        store[i] = null;
                        System.out.println("That's all " + itemName + " the store had");
                    }
                    break;
                } else {
                    System.out.println("You don't have enough coins to buy " + buyQuantity + " " + itemName + "s");
                    break;
                }
            }

        }
    }
}

这是我的控制台输出示例:

Which item would you like to buy?
Slot 0: Weapon
Slot 1: Cake
Slot 2: Arrow
Arrow
We have 100 Arrows in our stock. 2 each
How many would you like to buy?
10
You have purchased 10x Arrow
Coins: 980
That's all Arrow the store had

我已经尝试和思考了很长一段时间,但我无法弄清楚我的错误。你有什么建议吗?我尝试调试,一切正常,值正确。但是当我输入我想购买的数量时,我的 int 输出并没有影响任何东西。非常感谢任何提示!

【问题讨论】:

    标签: java debugging methods inventory-management shop


    【解决方案1】:

    线

    Item item = store[i];
    

    不创建副本,但引用存储在数组store 中的相同对象。以下

    item.setQuantity(buyQuantity); 
    

    store中的商品数量设置为buyQuantity及以下

    store[i].setQuantity(store[i].getQuantity() - buyQuantity);
    

    有效地将物品数量减少到0(在商店和玩家库存中)。

    至于修复,可以使用clone()this is regarded as broken

    我会建议一种语义不同的方法。每个项目不代表单个项目,而是一组项目。因此,可以将特定量添加到束中或从束中移除。为此,我将通用超类Item(我假设存在)在T extends Item&lt;T&gt;abstract 中通用,并给它一个public abstract T take(int amount); 方法:

    public abstract class Item<T extends Item<T>> {
        ...
        public abstract T take(int amount);
        ...
    }
    

    然后,我将更改所有子类以扩展此超类,例如

    public class Arrow extends Item<Arrow> {
        public Arrow take(int amount) {
            ...
        }
    }
    

    最后,我将重命名这些类以清楚地反映每个Item 是一组项目。例如,Item 可以重命名为 ItemBundleArrow 可以重命名为 ArrowBundleArrows

    【讨论】:

    • 哦,这很有道理
    • 那么我是否需要在我的 Item 类中使用克隆方法来解决这个问题?或者最好的方法是什么?
    • 好吧clone() 是一种可能性,但is regarded as broken。给我一点时间考虑一下。
    • 感谢您的宝贵时间和解决方案!干杯
    【解决方案2】:

    您在此处明确将所购买物品的数量更改为玩家要求的数量:

    Item item = store[i];
    item.setQuantity(buyQuantity);
    

    如果您想将 x 数量的 Item 添加到玩家的库存中,您需要创建该 Item 的新实例,并在其中将 buyQuantity 设置为购买的任何数量。这样您就可以保持商店库存的完整性。

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2012-08-28
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多