我正在为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;
}
如果我对每种状态都有很多可能的结果,我也可以使用嵌套开关。
使用二维数组,其中x
值为状态,y
值为攻击或类型。当您检查[x][y]
时,它会返回攻击中发生的更改的数值。
Burned Frozen
Fire [1.1] [1]
Ice [1] [2]
虽然现在这两个看起来都不错,但我不确定它是否适用于未来。现在,我当然可以使用可以改变伤害量的组合,但是那些具有非数字效果的攻击呢?我不能简单地返回一个值并将我的伤害乘以该值?
是否有可能生成某种代表如下情况的代码:
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
。
答案 0 :(得分:7)
你应该尝试使用多态。
创建一个代表攻击的界面,让它声明一个方法:
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!
}
}
您也可以使用其他模式。我建议您查看设计模式,它可以解决您所面临的问题。
仅举几例。
答案 1 :(得分:0)
AntonieG走在正确的轨道上。此问题的一般解决方案是使用策略设计模式。
<强>策略强>
动机
通常情况下,班级的行为只有不同。对于这种情况,最好将算法隔离在不同的类中,以便能够在运行时选择不同的算法。
意图
定义一系列算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端。
实施
http://www.oodesign.com/strategy-pattern.html
另请查看以下链接。
答案 2 :(得分:0)
你的想法似乎过于线性。使用面向对象的原则来设计您的游戏。为您的攻击创建扩展通用攻击的类。
public abstract class Attack{
protected String attackName;
protected Double damage;
public Attack(){
attackName = "Standard";
damage = 1.0;
}
public Double getDamage(){
return damage;
}
public String getAttackName(){
return attackName;
}
}
然后延伸:
public class FireStorm extends Attack{
public FireStorm(String attackName, Double damage){
this.attackName = attackName;
this.damage = damage;
}
@Override
public Double getDamage(Enemy target){
if(target.hasBurnEffect()){
damage *= 2.0;
} else {
damage = super.getDamage();
}
return damage;
}
}
我对你游戏中的事物范围并不是很了解,所以我不能让它更具描述性。但是如果你想让你的游戏像你建议的那样灵活和可扩展,那么你将需要使用继承和面向对象编程的其他原则。