例如,我有一个游戏,其中一些角色有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语句太多了,如果我添加一个新元素,它似乎很难维护。
是否有任何方法可以实现该表,但代码风格更易于维护且代码行更少?
答案 0 :(得分:5)
如果您想要一张桌子,请使用表格:
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" };
答案 1 :(得分:0)
在您的开发环境中,您可以使用STD吗?
如果是这样,那么也许地图可能最适合你。 http://www.cplusplus.com/reference/map/map/
您可以将地图输入设置为一对元素(枚举的int),并将攻击因子设置为输出。您只需要为可能的组合定义输出。