c++ - 实现 "weakness table"(通常在游戏中)的最简单方法是什么?

标签 c++ coding-style

例如,我有一个游戏,其中一些角色有 5 个元素:火、水、木、光、暗。

该元素有弱点,某些元素的攻击力会增加:

火>木

水>火

木>水

浅色>深色

暗>亮

例如:

火击木头,威力*2

火击水,威力*0.5

我有一个函数来获取元素和因子之间的关系:

float getFactor(string me,string enemy){
    if(me=="fire"){
        if(enemy=="fire"){
            return 1;
        }else if(enemy=="water"){
            return 0.5;
        }else if(enemy=="wood"){
            return 2;
        }else if(enemy=="light"){
            return 1;
        }else{
        return 1;
        }
    }else if(me=="water"){
        if(enemy=="fire"){
            return 2;
        }else if(enemy=="water"){
            return 1;
        }else if(enemy=="wood"){
            return 0.5;
        }else if(enemy=="light"){
            return 1;
        }else{
            return 1;
        }
    }else if(me=="wood"){
        if(enemy=="fire"){
            return 0.5;
        }else if(enemy=="water"){
            return 2;
        }else if(enemy=="wood"){
            return 1;
        }else if(enemy=="light"){
            return 1;
        }else{
            return 1;
        }
    }else if(me=="light"){
        if(enemy=="fire"){
            return 1;
        }else if(enemy=="water"){
            return 1;
        }else if(enemy=="wood"){
            return 1;
        }else if(enemy=="light"){
            return 1;
        }else{
            return 2;
        }
    }else{
        if(enemy=="fire"){
            return 1;
        }else if(enemy=="water"){
            return 1;
        }else if(enemy=="wood"){
            return 1;
        }else if(enemy=="light"){
            return 2;
        }else{
            return 1;
        }
    }
}

which getFactor("fire","water") 将返回 0.5;

这个函数可以工作,但是它有太多的行和太多的 if else 语句,而且如果我向它添加一个新元素,它似乎很难维护。

是否有任何方法可以以更易于维护的代码风格和更少的代码行来实现表格?

最佳答案

如果您想要一个表格,请使用表格:

enum Elements { ELEM_FIRE, ELEM_WATER, ELEM_WOOD, ELEM_LIGHT, ELEM_DARK, NUM_ELEM };

float attack_factor[NUM_ELEM][NUM_ELEM] = {
    {1, .5f, 2, 1, 1}, // fire vs ...
    {2, 1, .5f, 1, 1}, // water vs ...
    ...
};

现在你就这样做

attack_factor[my_elem][enemy_elem]

获取攻击力。这种方法要求您将元素类型存储为枚举值而不是字符串,但这对于 C++ 来说是更好的编码风格,因为它将可能元素的空间限制为实际定义的元素,并使许多功能变得非常简单。

另一个有用的表格示例:

const char *element_names[] = { "fire", "water", "wood", "light", "dark" };

关于c++ - 实现 "weakness table"(通常在游戏中)的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862720/

相关文章:

c++ - boost::shared_ptr 到 void * 反之亦然

Cocoa NSTabView编码风格问题

c - int[]是什么意思

c++ - "by the bytes"与 "in bytes"

language-agnostic - 我使用仅大小写不同于其类型的变量名是不道德的吗?

c++ - (C++)用于实例化新对象并将其分配给指向相同对象类型的二维指针 vector 的语法?

c++ - 需要有关在 gcc-7.2.0 中有编译错误但在 gcc-6.4.0 中没有的代码的帮助

c++ - 没有可用的复制构造函数或声明了复制构造函数 'explicit'

c++ - 指的是键盘控件时的 0x80 代码是什么意思

go - 在 Go 中命名标签的标准做法是什么?