对于那些不熟悉魔法的人(因为它通常被称为非正式),施法成本是代表施放“咒语”所需的“法术力”的值。法力来自不同的来源,并且具有分配给每种类型法术力的某些颜色。例如,假设的“蓝色”法术可能需要2个蓝色法术力和2个任意颜色的法术力,而另一个法术可能需要1个绿色法力值,2个红色法力值和3个任意颜色的法力值。有一定数量的法力值(红色,蓝色,绿色,黑色,白色和无色)(这与法术力颜色无关,换句话说,无色铸造成本可以通过任何颜色的法术力来支付)。所以,假设我们有一个花费2绿色,1蓝色和3无色的咒语,它只能用2种绿色,1种蓝色和3种颜色组合来支付。在程序中代表这个的有效方法是什么?我目前用Java编写这个,但是通用的建议也很好。如果你有任何问题,请发表评论,如果需要,我会澄清我的问题。
答案 0 :(得分:4)
表示MtG法术的法术力费用的自然方式是从法力类型到(非负)整数的映射;在Java术语中,Map<ManaType, int>
,其中ManaType
最合理地是enum。
当然,还有其他方法可以代表法术力费用,例如:作为整数的向量。然而,除了它的自然性之外,关于地图表示的好处在于,当你发现自己需要代表Phyrexian mana或snow mana或愚蠢时,它很容易扩展。 pink mana from Unhinged
在许多其他语言中,如JavaScript,也可以使用如下文字语法方便地初始化这样的地图:
manaCost: { colorless: 1, green: 2 }
唉,Java still has no collection literals,但至少你可以使用double brace initialization来获得类似的东西。
答案 1 :(得分:3)
我会有一个名为ManaCost的课程,每个卡都需要。
enum ManaColor {
RED, GREEN, BLUE, BLACK, WHITE;
}
class ManaCost {
private int colorlessCost;
private HashMap<ManaColor,Integer> colorCosts;
public int getConvertedManaCost(){
int convertedManaCost = 0;
for(Integer colorCost : colorCosts.values()){
convertedManaCost = convertedManaCost + colorCost;
}
convertedManaCost = convertedManaCost + colorlessCost;
return convertedManaCost;
}
public Integer getColorCost(ManaColor color){
return this.colorCosts.get(color);
}
}
class Card {
private ManaCost manaCost;
...
}
是的,我确实玩魔术:)
ConvertedManaCost =所有法力消耗的总和。
答案 2 :(得分:2)
铸造成本表示可以是非常简单的类或结构。自从我编写Java以来已经有一段时间了,所以这里是一个C#示例,应该以简单的方式转换为Java(任何人都可以编辑这个答案以使其正确的Java):
class SpellCost
{
public int GreenCost { get; set; }
public int RedCost { get; set }
// etc
public int AnyCost { get; set; }
}
扣除法术点以施放法术的算法将直接从玩家的当前法力值中扣除每种颜色(如果它会将任何一种颜色的法术力降低到负值,则使投掷失效),然后使用一些公式来选择从哪个法术力池中扣除AnyCost(如果总剩余法力值小于AnyCost,则再次取消施法)。
在魔术中,不同法术力池的数量相当小。如果您正在处理大量和/或可变数量的池,则可以使用ManaType键入的HashMap<ManaType, int>
,其值代表该法术力类型的成本。
当施放咒语时,你将迭代HashMap<ManaType, int>
,从玩家的法术力池中扣除每个法术力费用,如果无法支付任何法术力费用,则取消施法。