我正在为 Android 手机开发一个基于 Java 的回合制 RPG,目前我正在尝试弄清楚如何处理具有超出伤害的额外变量的攻击。例如,当目标具有燃烧效果时,我想让火焰攻击额外造成 10% 的伤害。我有点不确定如何以一种有效的方式去做这件事,并且允许将来添加到我的状态/攻击系统。
下面是我对如何做到这一点的想法:
一系列 if/else 语句或开关
switch (status) { case burned: if (type == fire) { damage = damage * 1.1; } break; case frozen: if (type == ice) { damage = damage * 2; } break; }
如果每个状态都有很多可能的结果,我也可以使用嵌套开关。
使用二维数组,其中
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!
}
}
您还可以使用其他模式。我建议您查看设计模式,它可以解决您所面临的问题。
- 查看状态模式 http://en.wikipedia.org/wiki/State_pattern
- 参见策略模式 http://en.wikipedia.org/wiki/Strategy_pattern
- 查看访问者模式 http://en.wikipedia.org/wiki/Visitor_pattern
仅举几例。
关于java - 嵌套 if/else、开关或更有效的 RPG 战斗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11799996/