java - 如何以编程方式表示 Magic The Gathering 的类型转换成本?

标签 java algorithm oop data-structures

<分区>

对于那些不熟悉万智牌(它通常被非正式地称为)的人来说,施法成本是表示施放“法术”所需的“法力”的值。法力来自不同的来源,并且为每种类型的法力分配了特定的颜色。例如,一个假设的“蓝色”法术可能需要 2 点蓝色法术力和 2 点任何颜色的法术力,而另一个法术可能需要 1 点绿色法术力、2 点红色法术力和 3 点任何颜色的法术力。法术力颜色的数量是有限的(红色、蓝色、绿色、黑色、白色和无色(与法术力颜色无关,换句话说,无色的施法成本可以由任何颜色的法术力支付)。因此,假设我们有一个花费 2 绿色、1 蓝色和 3 无色的咒语,它只能用 2 绿色、1 蓝色和 3 的任意颜色组合来支付。在程序中有什么有效的方法来表示它?我目前正在用 Java 编写此代码,但一般建议也很好。如果您有任何问题,请发表评论,如果需要,我会澄清我的问题。

最佳答案

表示 MtG 咒语法力消耗的自然方式是从法力类型到(非负)整数的映射;用 Java 术语来说,一个 Map<ManaType, int> , 其中ManaType最合理的是 enum .

当然,您也可以通过其他方式表示法术力成本,例如作为整数 vector 。然而, map 表示的好处除了它的自然性之外,还在于它很容易扩展,如果你发现自己需要表示,比如说,Phyrexian mana。或 snow mana或者那个傻pink mana from Unhinged .

在许多其他语言中,比如 JavaScript,这样的映射也可以使用像这样的文字语法方便地初始化:

manaCost: { colorless: 1, green: 2 }

唉,Java still has no collection literals , 但至少你可以使用 double brace initialization得到模糊相似的东西。

关于java - 如何以编程方式表示 Magic The Gathering 的类型转换成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25172195/

相关文章:

java - 在类似图形的对象中查找循环

c - 如何使用 C 对继承建模?

c++ - 模板类C++中两种不同类型的方法

javascript - 使用对象的方法设置对象的属性值

java - 我如何最好地从 SnakeYaml 加载非 bean 对象

java - 重复使用 Groovy Shells 会导致 PermGen 空间已满

algorithm - 为什么adobe要为type 1字体选择这种加密算法呢?

java - JDBC 连接协议(protocol)不受支持

Java 日期/日历异常

algorithm - 如何找到任何二叉树中两个节点的最低公共(public)祖先?