我正在开发一种与口袋妖怪具有相同系统的游戏,即每个玩家都有一个'类型'(火,水,草等)。当玩家战斗时,我需要确定乘法攻击的乘法,以创造优势和劣势。到目前为止,我在每个'type'类中使用一个开关,它将另一个'type'类作为输入并返回乘法因子。只有三个'类型'类,我写了很多颂歌,我可以预见它将来会失控,当我想添加更多。
所以我的问题是,我如何实施DRY解决方案来确定每种类型的优缺点?我附上了一张口袋妖怪类型的表格,作为我试图做的参考。
答案 0 :(得分:3)
如何枚举类型,并构建一个看起来就像您发布的2D矩阵。每当你需要战斗的“因子”时,使用攻击者和防御者作为2D阵列中的索引来查看因子。查找速度很快,代码也很干净。
示例用例看起来像这样:
factor = factorTable[FIRE][WATER]; // would set factor to 0.5
factor = factorTable[WATER][FIRE]; // would set factor to 2.0
正如Noctua建议的那样,将实际数据放在配置文件中可能是个好主意。这样您就可以轻松更改它而无需重新编译。如果你选择那个选项,你需要某种解析函数来在程序开头创建矩阵。
接下来采取的更好的步骤是将表行为和类型表示封装在类中。底层实现可能仍然是相同的(或更改,这是重点),但您不会直接公开表或枚举。
factor = StrengthFactors(Player1.Type(), Player2.Type()); // or similar
答案 1 :(得分:1)
我认为您应该使用单个字符串数组来存储不同类型。然后使用2D矩阵存储乘数。我的想法是使用这个字符串数组的id来知道乘数的位置。你将有一个O(n)复杂度来找到你想要的乘数。