Кроме того, и это важно, поэтому я помещаю это наверху, даже если это редактирование.
Не включайте в это ни одного изображения У вас должны быть только изображения в пользовательском интерфейсе. Теоретически вы можете запустить игру из командной строки, просто набрав свои команды. «Купить меч», «продать мусор», «атаковать гоблина» и т. Д. Когда вы начинаете объединять свой пользовательский интерфейс и «бизнес-логику», вы обнаруживаете, что вам очень трудно разделить их, когда приходит время что-то исправить.
У меня было бы что-то вроде этого
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);
}