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;
        }
    }
}

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

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

有没有什么方法可以以更易于维护的代码风格和更少的代码行来实现该表?

最佳答案

如果你想要一张 table ,就用一张 table :

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++ - 纹理化一个 opengl 立方体

c++ - 为什么代码会主动尝试阻止尾调用优化?

c++ - C++如何继承Template类

javascript - Facebook 页面点赞计数

c# 具有相同数据但类型不同的变量的命名约定

c++ - 使用 C++ 的 Oracle 扩展存储过程

c++ - static lock_guard 和 static mutex 也一样吗?

PHPStorm 禁用匿名函数括号前的空格

ios - 从 XCode 4.2 到 4.3,新的 ViewController 类 .m 文件的定义不同。为什么?

c++11 - 指针检查的性能差异 - 智能指针