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