战争游戏互动的设计模式

时间:2015-01-20 14:19:10

标签: class design-patterns interaction

我正在使用java进行战争游戏。这场战争游戏有不同的战斗单位。单位例如是'人','矮人'和'精灵',它们都有自己的属性。为了适应这些属性,我目前有一个“人类”,“矮人”和“精灵”的课程,它延伸抽象的“单元”课程。

现在我要编制损坏图表。例如,当人类攻击矮人时,它会造成56点伤害。当矮人攻击精灵时,它会造成27点伤害。单位之间的每次互动都是独特的,并给出一个数字。

我正在寻找一种设计模式,可以轻松添加新单位并更新损坏图表,以便与其他单位进行交互。它还应该可以轻松删除单位

我想为每个单元提供一个唯一的ID,并在每个单元中放置一个这样的方法。

public int getDamage(Unit defender) {
    switch(defender.getID() {
        case 0: return 27;
        case 1: return 50;
        ....
    }
}

但是以这种方式添加或删除单元似乎非常笨重,因为你必须在实现'Unit'的每个类中改变switch语句。它也不是很易读。我还想过将switch语句放在一个单独的'Damage Chart'类中。但这也需要为攻击者提供一个switch语句,并创建嵌套的switch语句(这很丑陋)。

有没有一个干净的方法来解决这个问题?也许这种问题已经存在一种设计模式?

2 个答案:

答案 0 :(得分:1)

这种问题被称为" double dispatch"它有不同的解决方案。例如,如果你有一定数量的物种,你不仅关心它们之间的攻击,而且有越来越多的不同决定(绘画,外交,运气等)都依赖于实际物种,你可以使用visitor pattern

答案 1 :(得分:0)

如果您确实想要根据具体情况依赖攻击者和防御者,则必须管理这些数字。它实际上是一个二维矩阵。每当您添加另一个单位时,您需要将当前单位数(一行和一列)值的两倍添加到该矩阵。我会为此使用二维数组。

如果你有很多单位,这很快就会很乏味。我建议使用诸如攻击和防御等级之类的东西(例如矮人斧头30/20),标记单位"它们是什么" (例如精灵,矮人)和一些特殊物品(例如对抗精灵的+ 4 / + 1;或者对抗斧头的-5/0)。这样,您可以添加一个新单元,应用一些标签和特殊内容,然后完成,因为其余部分是一个简单的计算。

换句话说:我认为你有数据问题,而不是语言问题。