wil*_*mer 3 java android switch-statement multidimensional-array nested-statement
我正在为Android手机开发基于回合制的RPG游戏,我正在试图弄清楚如何处理具有超出损害的额外变量的攻击.例如,当目标具有燃烧效果时,我希望火焰攻击额外造成10%的伤害.我有点不确定如何以有效的方式执行此操作,以及允许将来添加到我的状态/攻击系统的方法.
所以这是我对如何做到这一点的想法:
一系列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)
如果我对每个状态有很多可能的结果,我也可以使用嵌套开关.
使用二维数组,其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.
你应该尝试使用多态.
创建一个代表攻击的接口,并让它声明一个方法:
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)
您还可以使用其他模式.我建议您查看设计模式,它可以解决您所面临的问题.
仅举几个.