You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:51:20