java - Java - 商店系统中的错误
问题描述
所以我有一些库存/商店互动,我找不到解决方案。
玩家应该能够在我的 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 输出并没有影响任何东西。非常感谢任何提示!
解决方案
线
Item item = store[i];
不创建副本,但引用存储在数组中的相同对象store
。以下
item.setQuantity(buyQuantity);
store
在tobuyQuantity
和以下设置项目的数量
store[i].setQuantity(store[i].getQuantity() - buyQuantity);
有效地将物品的数量减少到0
(在商店和玩家库存中)。
至于修复,可以使用clone()
,但这被认为是损坏的。
我会建议一种语义不同的方法。每个项目不代表单个项目,而是一组项目。因此,可以将特定量添加到束中或从束中移除。为了使这可行,我将通用超类Item
(我假设存在)在 中通用T extends Item<T>
,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
可以重命名为ItemBundle
并且Arrow
可以重命名为ArrowBundle
or Arrows
。
推荐阅读
- java - 使用有想法的图书馆
- swift - SwiftUI 列表项装饰影响幻灯片删除
- azure - 24 小时后,所有容器和 blob 操作均失败并出现授权错误
- ssis - SSIS在写入时替换值
- r - 如何删除r中纵向数据中特定主题的行
- javascript - p5.js 使用变量改变大小
- dropbox-api - Node-Red Dropbox 节点
- javascript - dot net core 项目,在 site.js 中使用 jquery maxlength 和 count 插件
- pygame - 使用 pygame 更改显示方向
- azure - Azure Active Directory 阻止登录