C++开发随机角色生成器如何优化冗长多分支if判断语句?
这类连续区间匹配的分支逻辑完全没必要写冗长的if-else链,你的属性修正规则本身有明确的数学规律,配合简单封装就能把12段重复判断全部消掉。
首先你当前的代码本身还有隐藏bug:rand()%18只会生成0-17的随机数,最后一个else分支是永远走不到的死代码;且0和1都映射为属性1,相当于感知1的出现概率是其他值的两倍,随机分布不符合常规TRPG属性骰的设计。
最简实现:用公式替代分支判断
DND系规则的属性修正值本身就有固定公式:修正值 = 属性值 / 2 - 5(C++整数除法自动向下取整,完全匹配你写的所有分支逻辑)。你只需要把随机值调整为1-18的合法区间,所有if判断都可以删掉:
#include <iostream> #include <cstdlib> #include <ctime> int main() { srand(time(nullptr)); // 记得初始化随机种子,否则每次运行结果完全一致 int wisdom_score = rand() % 18 + 1; // 直接生成1-18的合法属性值 int wisdom_mod = wisdom_score / 2 - 5; std::cout << "\n"; std::cout << "Wisdom Score: " << wisdom_score << "\n"; std::cout << "Modifier: " << (wisdom_mod >= 0 ? "+" : "") << wisdom_mod << "\n"; return 0; }
这段代码的输出逻辑和你原来写的10段if分支完全一致,代码量不到原来的1/5。
通用封装:适配12个属性的重复逻辑
你提到总共有12个类似的属性判断块,完全可以把公共逻辑抽成通用函数,所有属性复用一套逻辑,不用重复写判断和输出:
#include <iostream> #include <string> #include <cstdlib> #include <ctime> // 统一存属性结果,后续要加属性描述、特殊效果直接加字段即可 struct Attribute { int score; int modifier; }; // 骰属性的通用逻辑,力量、敏捷、感知等所有属性都用这个函数生成 Attribute roll_attribute() { Attribute attr; attr.score = rand() % 18 + 1; attr.modifier = attr.score / 2 - 5; return attr; } // 打印属性的通用逻辑,传入属性名即可 void print_attribute(const std::string& attr_name, const Attribute& attr) { std::cout << "\n"; std::cout << attr_name << " Score: " << attr.score << "\n"; std::cout << "Modifier: " << (attr.modifier >= 0 ? "+" : "") << attr.modifier << "\n"; } int main() { srand(time(nullptr)); // 生成并打印感知属性 Attribute wisdom = roll_attribute(); print_attribute("Wisdom", wisdom); // 剩下11个属性直接复用逻辑,不用重复写判断 // Attribute strength = roll_attribute(); // print_attribute("Strength", strength); // Attribute dexterity = roll_attribute(); // print_attribute("Dexterity", dexterity); return 0; }
复杂规则扩展:查表法
如果后续属性规则变复杂(比如不同区间加特殊描述、触发特殊效果),公式没法直接覆盖的话,用查表法替代if-else,规则统一存在表里,维护起来比散落在代码里的分支方便很多:
// 示例:带描述的属性规则表 struct AttrRule { int min_score; int modifier; const char* desc; }; // 所有属性规则统一在表里维护,不用改动分支逻辑 constexpr AttrRule kAttrRules[] = { {1, -5, "无法对周遭事物做出基本判断"}, {3, -4, "反应迟钝,经常忽略明显线索"}, {5, -3, "观察力弱于常人"}, {7, -2, "偶尔会犯低级错误"}, {9, -1, "略低于平均水平"}, {11, 0, "普通普通人水平"}, {13, 1, "思维敏锐,能快速捕捉异常"}, {15, 2, "洞察力强,轻易识破谎言"}, {17, 3, "智识超群,能快速看透事物本质"}, {18, 4, "拥有近乎先知的感知力"} };
查表时只需要遍历找到当前属性值对应的规则条目即可,新增、修改规则只需要调整表的内容,不用改核心逻辑。
内容的提问来源于stack exchange,提问作者HoneycodeRidge
相关产品推荐
相关产品推荐

