您应该尝试使用多态性。
对于开关/if-else
创建一个表示攻击的接口,并让它声明一个方法:
public interface Attack {
double doAttack(double baseDamage);
}
然后创建实现此接口的类:
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
。baseDamage * aDouble
这是一个简单的例子,你可以做一些比你想要的更强大的东西。
对于状态(烧毁/冻结)
有很多方法可以实现冻结等状态。首先,您可以使用我上面解释的相同模式。
除了拥有成员之外,您还可以使用您喜欢Attack mAttack
的名称或任何名称添加类似的逻辑。HealthStatus mHealthStatus
然后调用inflictDamage()
会将对象重定向mAttack
到mHealthStatus
对象。
然后这个HealthStatus
类将再次成为一个接口,
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!
}
}
您也可以使用其他模式。我建议您查看设计模式,它可以解决您所面临的问题。
仅举几个。