Java 一个人如何以编程的方式表现魔术?

Java 一个人如何以编程的方式表现魔术?,java,algorithm,oop,data-structures,Java,Algorithm,Oop,Data Structures,对于那些不熟悉魔法的人(通常被非正式地称为“施法”),施法成本是表示施法所需“法力”的值。法力来自不同的来源,每种类型的法力都有特定的颜色。例如,一个假想的“蓝色”法术可能需要2个蓝色法力和两个任意颜色的法力,而另一个法术可能需要1个绿色法力、2个红色法力和3个任意颜色的法力。魔法力的颜色是有限的(红色、蓝色、绿色、黑色、白色和无色)(这是魔法力颜色的不可知论,换句话说,无色施法费用可以由任何颜色的魔法力支付)所以,假设我们有一个咒语,价格是2绿,1蓝,3无色,它只能用2绿,1蓝,和3种颜色的组

对于那些不熟悉魔法的人(通常被非正式地称为“施法”),施法成本是表示施法所需“法力”的值。法力来自不同的来源,每种类型的法力都有特定的颜色。例如,一个假想的“蓝色”法术可能需要2个蓝色法力和两个任意颜色的法力,而另一个法术可能需要1个绿色法力、2个红色法力和3个任意颜色的法力。魔法力的颜色是有限的(红色、蓝色、绿色、黑色、白色和无色)(这是魔法力颜色的不可知论,换句话说,无色施法费用可以由任何颜色的魔法力支付)所以,假设我们有一个咒语,价格是2绿,1蓝,3无色,它只能用2绿,1蓝,和3种颜色的组合来支付。在程序中用什么有效的方法来表示它呢?我目前正在用Java写这个,但一般的建议也很好。如果你有任何问题,请评论,我会用c如果需要,请澄清我的问题。

铸造成本表示可以是一个非常简单的类或结构。我写Java已经有一段时间了,所以这里有一个C#示例,它应该以简单的方式转换为Java(任何人都可以随意编辑此答案,使其成为正确的Java):

计算施法法力值的算法会直接从玩家当前的每种颜色的法力值中扣除(如果施法会将这些颜色的法力值降为负值,则会使施法无效),然后使用一些公式选择从哪个法力池中扣除任何费用(如果总剩余法力低于任何成本,再次使施法无效)

在魔法中,不同法力池的数量相当小。如果你处理的是大量和/或可变数量的池,你可以使用一个由法力类型键入的
HashMap
,其值代表该法力类型的成本


当施法时,你将迭代HashMap,从玩家的法力池中扣除每个法力消耗,如果任何法力消耗无法支付,则使施法无效。

我将有一个名为法力消耗的类,每个卡都需要

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;
    ...
}
枚举颜色{
红、绿、蓝、黑、白;
}
类别成本{
私人int COLORLESCOST;
私人成本;
public int getConvertedManaCost(){
int convertedManaCost=0;
for(整数colorCost:colorCosts.values()){
convertedManaCost=convertedManaCost+colorCost;
}
convertedManaCost=convertedManaCost+colorlessCost;
退货成本;
}
公共整数getColorCost(ManaColor颜色){
返回此.colorCosts.get(颜色);
}
}
班级卡{
私人成本;
...
}
是的,我玩魔术:)
ConvertedManaCost=所有法力消耗的总和。

表示MtG法术法力消耗的自然方式是从法力类型到(非负)整数的映射;用Java术语来说,a,其中
法力类型
最合理地表示为a

当然,你也可以用其他方法来表示法力消耗,例如整数向量。然而,地图表示法的优点在于,除了它的自然性之外,它很容易扩展,如果你发现自己需要表示,比如说,或者说很傻的话

在许多其他语言(如JavaScript)中,也可以使用以下文字语法方便地初始化此类映射:

manaCost:{无色:1,绿色:2}

唉,但至少你可以用它来获得一些模糊相似的东西。

为什么不使用贴图,而不是为每种颜色创建一个方法呢?避免重复代码:)这就是我想用
字典
(即.NET术语)表达的意思。我将更新我的答案以使用正确的Java术语。啊,谢谢你指出它应该是非负的。不想让游戏变得更糟;)目前还没有。我刚刚开始学习Java,我认为对我熟悉的复杂系统进行建模(MTG)将是学习该语言的最佳方式。我只是在寻求建议。
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;
    ...
}