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

What is the simplest way to implement "weakness table" (usually in game)?

本文关键字:游戏 是什么 table weakness 最简单 实现 方法      更新时间:2023-10-16

例如,我有一个游戏,一些角色有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;
        }
    }
}

其中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" };

在您的开发环境中,您可以使用 STD 吗?

如果是这样,那么也许地图可能最适合您。 http://www.cplusplus.com/reference/map/map/。

您可以将一对元素(枚举的 int)设置为映射输入,并将攻击因子设置为输出。您只需为可能的组合定义输出。