实现"weakness table"的最简单方法是什么(通常在游戏中)?
What is the simplest way to implement "weakness table" (usually in game)?
例如,我有一个游戏,一些角色有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)设置为映射输入,并将攻击因子设置为输出。您只需为可能的组合定义输出。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- GetWindowRect()返回的大小小于游戏的实际可见窗口的可能原因是什么
- 游戏访问其他班级成员的最佳方式是什么?
- 组织一个C++游戏的最佳方式是什么?该游戏涉及用户在路径之间进行选择,以便在旅程中前进
- 组织X11和Win32简单游戏代码的最佳方式是什么
- 将脚本语言嵌入游戏引擎中的编程语言的目的是什么?
- C++中的游戏编程,这条老行是什么,为什么它不起作用?
- 实现"weakness table"的最简单方法是什么(通常在游戏中)?