我目前正在为一个小项目创建一个类,并遇到了一个我以前没有真正处理过的有趣场景。
我的程序只会显示有关游戏中某些项目的信息。我遇到问题的类别是物品的成本。例如,项目成本可以是:
成本可能是任何一种,这意味着它只能花费一种“货币”或者可能花费多达三种不同的“货币”。此外,每种类型的货币都包含它的图片。因此100 Silver and 300 Stone
看起来像:100(Int) Silver(image) and 300(Int) Stone(Image)
因此可以看到可能存在多种类型的货币和图像,是否会将其存储在数组中?还是另一种变量?
只是想找个人来解决这个问题。如果需要用课程样本来解释,我可以这样做。
修改 的
虽然我的解释不明确,但我收到了很多好的回答。事实上,很多都适合作为正确的答案。我感谢所有的回复,并对每个有帮助反馈的人表示赞赏。
谢谢大家!!!
答案 0 :(得分:2)
您可以创建一个非常简单的类Cost
public class Cost {
int amount;
String currency;
public Cost(int amount, String currency) {
this.amount = amount;
this.currency = currency;
}
}
然后将cost实现为ArrayList
List<Cost> cost = new ArrayList<Cost>();
cost.add (new Cost(100, "Gold"));
这很简单,同时保留了添加新货币的灵活性
public class Cost {
private int amount;
private Currency currency;
public Cost(int amount, Currency currency) {
this.amount = amount;
this.currency = currency;
}
public enum Currency {
GOLD { public String toString() { return "gold"; } },
SILVER { public String toString() { return "silver"; } },
COPPER { public String toString() { return "copper"; } },
STONE { public String toString() { return "stone"; } },
RARE_METAL { public String toString() { return "rare"; } }
}
public String getImageName() {
return new String(currency.toString()+".png");
}
public int getAmount() {
return amount;
}
public String getCurrency() {
return currency.toString();
}
}
List<Cost> costs = new ArrayList<Cost>();
cost.add (new Cost(100, Cost.Currency.GOLD));
cost.add (new Cost(200, Cost.Currency.COPPER));
for (Cost cost: costs) {
ImageIcon icon = createImageIcon(cost(i).getImageName());
JLabel label1 = new JLabel(cost(i).getAmount(), icon, JLabel.CENTER);
}
答案 1 :(得分:2)
Java是一种面向对象的语言;为什么没有一个Item或Commodity类来封装你想要的行为而不是依赖于原语?您可以通过将其封装到类中来隐藏客户端的复杂性。
如果您有多个Currency实例,您还可以在它们之间封装转换,而不是在代码中嵌入常量。如果您更改转化次数,则只需在一个地方进行转化。
答案 2 :(得分:2)
此外,这很重要,所以我把它放在顶部,即使它是一个编辑。 不要将图片包含在任何内容中您应该只在用户界面上放置图片。从理论上讲,只需键入命令就可以从命令提示符运行游戏。 “购买剑”“卖垃圾”“攻击精灵”等。当你开始整合你的用户界面和“业务逻辑”时,你发现自己在解决问题的时候很难将两者分开。
我会有类似的东西
class Cost {
// use the builder pattern - it makes it VERY easy to add new currency types
// without breaking existing types
// it does make it more difficult to remove types, but you would have to
// modify everywhere a type that used a removed currency anyway, so it's no
// ADDITIONAL work there.
class Builder {
private int copper;
private int silver;
private int gold;
public Builder copper(int cu) { this.copper = cu; return this; }
public Builder silver(int ag) { this.silver = ag; return this; }
public Builder gold(int au) { this.gold = au; return this; }
public Cost complete() {
return new Cost(this);
}
}
public final int copper;
public final int silver;
public final int gold;
// other costs;
private Cost(CostBuilder cb) {
this.copper = cb.copper;
this.silver = cb.silver;
this.gold = cb.gold;
}
}
class Item {
String name;
// other stuff
private Set<Cost> costs;
public Set<Cost> getCosts() {
return java.util.Collections.unmodifiableSet(costs);
}
}
使用这样的代码:
Cost allGold = new Cost.Builder().gold(175).complete();
Cost goldAndSilver = new Cost.Builder().silver(50).gold(50).complete();
Cost allMaterials = new Cost.Builder().gold(10).silver(30).copper(100).complete();
Set<Cost> costs = new HashSet<Cost>();
costs.add(allGold);
costs.add(goldAndsilver);
costs.add(allMaterials);
Item swordOf1000Truths = new Item("Sword of 1000 truths",costs);
以后你可以这样做
// assume player found allGold by quering for what costs he could use
if(player.canAfford(allGold)) {
player.spend(allGold);
player.addItem(swordOf1000Truths);
}
答案 3 :(得分:1)
在代码中,我只将项目的成本存储为单个值(int或double)。然后,当您显示成本时,会有一些类将内部值转换为您想要显示的任何货币。
如果所有值基本相同,则无需携带值数组。
答案 4 :(得分:1)
没有内置类型的变量是合适的,因此您需要创建代表您的概念的类。至少Cost应该是一个类,也许也是货币,但Enum可能会这样做。
答案 5 :(得分:1)
我可能会选择枚举来代表各种类型的货币。像这样:
public enum Currency {
GOLD("gold"),
SILVER("silver"),
COPPER("copper"),
STONE("stone");
private String displayName;
private Currency(String displayName) {
this.displayName = displayName;
}
public String toString() {
return displayName;
}
}
这里的枚举实际上有一个字段来存储用户友好的货币显示名称;这不是必需的 - 我只是把它扔进去,以便在我的例子中稍后输出。它还可以存储相应的图像文件名(甚至是实际图像),但最好留给您正在使用的任何UI,而不是将其放在模型中。
您的商品只需要一个Map
来存储费用:
private Map<Currency, Integer> costs;
如何使用它的一个粗略示例:
Item vorpalSword = new Item();
vorpalSword.getCosts().put(Currency.GOLD, 100);
vorpalSword.getCosts().put(Currency.STONE, 300);
StringBuilder costOutput = new StringBuilder();
for(Map.Entry<Currency, Integer> cost : vorpalSword.getCosts().entrySet()) {
costOutput.append(cost.getValue() + " " + cost.getKey() + " ");
}
System.out.println(costOutput.toString());