java - 嵌套 if/else、开关或更有效的 RPG 战斗?

标签 java android multidimensional-array switch-statement nested-statement

我正在为 Android 手机开发一个基于 Java 的回合制 RPG,目前我正在尝试弄清楚如何处理具有超出伤害的额外变量的攻击。例如,当目标具有燃烧效果时,我想让火焰攻击额外造成 10% 的伤害。我有点不确定如何以一种有效的方式去做这件事,并且允许将来添加到我的状态/攻击系统。

下面是我对如何做到这一点的想法:

  1. 一系列 if/else 语句或开关

    switch (status) {
    case burned:
        if (type == fire) {
            damage = damage * 1.1;
        }
        break;
    case frozen:
        if (type == ice) {
            damage = damage * 2;
        }
        break;
    }
    

    如果每个状态都有很多可能的结果,我也可以使用嵌套开关。

  2. 使用二维数组,其中 x 值为状态,y 值为攻击或类型。当您检查 [x][y] 时,它会返回一个数值,表示将在攻击中发生的变化。

          Burned   Frozen
    
    Fire  [1.1]    [1]
    
    Ice   [1]      [2]
    

虽然这两种方法目前看起来都不错,但我不确定它是否适用于 future 。现在,我当然可以使用改变伤害量的组合,但是如果攻击具有非数值效果,我不能简单地返回一个值并将我的伤害乘以该值呢?

是否可以生成某种代码来表示如下情况:

burned = 1 in first position, frozen = 2
fire attack = f in 2nd position, ice = i
damage mod is in the 3rd position

所以对被烧伤的敌人的火力攻击将是 1-f-1.1

最佳答案

你应该尝试使用多态性。

对于开关/if-elses

创建一个表示攻击的接口(interface),并让它声明一个方法:

public interface Attack {
    double doAttack(double baseDamage);
}

然后创建实现这个接口(interface)的类:

public class FireAttack implements Attack {
    double doAttack(double baseDamage){
        return 1.1 * baseDamage;
    }
}

public class IceAttack implements Attack {
    double doAttack(double baseDamage){
        return 2 * baseDamage;
    }
}

然后不要在代码中使用 switch 语句,而是执行如下操作:

public class Player {
    private Attack mAttack;

    // Somewhere in your code, you setup something like
    void setFireWeapon(){
        mAttack = new FireAttack();
    }

    // This is where the attack is taken care of
    double inflictDamage() {
        return mAttack.doAttack();
    }
}

这允许你做的是在未来实现你可能希望的任何新类型的攻击,并简单地将 Attack mAttack 分配给 Attack 接口(interface)的新实现.这是一个简单的例子,如果你愿意,你可以做一些比 baseDamage * aDouble 更强大的事情。

对于状态(已销毁/卡住)

您可以通过多种方式实现卡住等状态。首先,您可以使用我上面解释的相同模式。

除了拥有 Attack mAttack 成员之外,您还可以使用 HealthStatus mHealthStatus 或您喜欢的任何名称添加类似的逻辑。然后调用 inflictDamage() 会将 mAttack 对象重定向到 mHealthStatus 对象。

然后 HealthStatus 类将再次成为一个接口(interface),

public interface HealthStatus {
    double considerAttack(Attack anAttack);
}

这将有各种状态的实现:

public class NormalStatus implements HealthStatus{
    double considerAttack(Attack anAttack){
        return anAttack.doAttack(); // No change here
    }
}

public class FrozenStatus implements HealthStatus{
    double considerAttack(Attack anAttack){
        return 0; // Can't attack when froxen
    }
}

public class BurnedStatus implements HealthStatus{
    double considerAttack(Attack anAttack){
        return anAttack.doAttack() * 2.0; // Get berserk when on fire!
    }
}

您还可以使用其他模式。我建议您查看设计模式,它可以解决您所面临的问题。

仅举几例。

关于java - 嵌套 if/else、开关或更有效的 RPG 战斗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11799996/

相关文章:

c++ - 是否可以从类创建多维数组?

java - 将 XmlSerializer 代码从 java 转换为 C#

android - 如何使用单选复选框android在AlertDialog中选择一个条目?

android - 两个值 [-50, 0, 50] 的搜索栏

C# - Xamarin 表单在切换时删除 ListView 项

arrays - MATLAB:如何在没有 for 循环的情况下使用一维向量索引对多维矩阵进行子集化?

c - 使用指针对二维数组中一行中的元素进行排序

java - Expectinator.spawn 上的 ExpectJ 异常

java - 使用类和索引单击元素时出现问题

java - 基于派生数据强制执行子类行为