什么类型的变量最适合此任务?

时间:2011-04-21 22:55:27

标签: java arrays variables types

我目前正在为一个小项目创建一个类,并遇到了一个我以前没有真正处理过的有趣场景。

我的程序只会显示有关游戏中某些项目的信息。我遇到问题的类别是物品的成本。例如,项目成本可以是:

  • 100银和300石
  • 500铜,300石和2稀有金属
  • 175 Gold

成本可能是任何一种,这意味着它只能花费一种“货币”或者可能花费多达三种不同的“货币”。此外,每种类型的货币都包含它的图片。因此100 Silver and 300 Stone看起来像:100(Int) Silver(image) and 300(Int) Stone(Image)

因此可以看到可能存在多种类型的货币和图像,是否会将其存储在数组中?还是另一种变量?

只是想找个人来解决这个问题。如果需要用课程样本来解释,我可以这样做。

修改

虽然我的解释不明确,但我收到了很多好的回答。事实上,很多都适合作为正确的答案。我感谢所有的回复,并对每个有帮助反馈的人表示赞赏。

谢谢大家!!!

6 个答案:

答案 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());