嵌套if/else,开关还是更有效的RPG战斗?

wil*_*mer 3 java android switch-statement multidimensional-array nested-statement

我正在为Android手机开发基于回合制的RPG游戏,我正在试图弄清楚如何处理具有超出损害的额外变量的攻击.例如,当目标具有燃烧效果时,我希望火焰攻击额外造成10%的伤害.我有点不确定如何以有效的方式执行此操作,以及允许将来添加到我的状态/攻击系统的方法.

所以这是我对如何做到这一点的想法:

  1. 一系列if/else语句或switch

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

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

  2. 使用二维数组,其x值为状态,y值为攻击或类型.检查时,[x][y]它会返回攻击中发生的更改的数值.

          Burned   Frozen
    
    Fire  [1.1]    [1]
    
    Ice   [1]      [2]
    
    Run Code Online (Sandbox Code Playgroud)

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

是否有可能生成某种代表以下情况的代码:

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.

Ant*_*neG 7

你应该尝试使用多态.

对于开关/ if-elses

创建一个代表攻击的接口,并让它声明一个方法:

public interface Attack {
    double doAttack(double baseDamage);
}
Run Code Online (Sandbox Code Playgroud)

然后创建实现此接口的类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后代替在代码中使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许你做的是实现你将来可能希望的任何新类型的攻击,并简单地分配Attack mAttack这个新的接口实现Attack.这是一个微不足道的例子,你可以做一些比baseDamage * aDouble你想要的更强大的东西.

对于状态(烧毁/冻结)

有很多方法可以实现像冻结这样的状态.首先,您可以使用我上面解释的相同模式.

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

然后HealthStatus该类将再次成为一个接口,

public interface HealthStatus {
    double considerAttack(Attack anAttack);
}
Run Code Online (Sandbox Code Playgroud)

哪个会实现各种状态:

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!
    }
}
Run Code Online (Sandbox Code Playgroud)

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

仅举几个.