替代多分支else if的高效实现 C#控制台游戏敌人随机名生成
无需沿用大量else if写法,用「名字池+随机索引」的方案是最适合该场景的实现
方案核心特点
- 彻底消除冗余分支判断,后续扩展敌人名字仅需向列表追加条目,不需要修改任何判断逻辑
- 规避你现有代码的隐藏问题:在方法内部每次实例化
Random,会因短时间内系统时钟种子一致,生成重复的随机值 - 逻辑与配置数据完全分离,后续调整名字列表、修改生成规则都不会影响核心流程
具体实现
先在游戏类的全局作用域定义两个字段,不要把随机数生成器和名字列表塞在chooseName方法内部:
// 全局唯一的随机数生成器,避免重复实例化导致的随机值重复问题 private readonly Random _randomGenerator = new Random(); // 敌人名字池,所有可生成的名字都存在这里,增删名字直接修改这个列表即可 private readonly List<string> _enemyNamePool = new List<string>() { "洞穴哥布林", "游荡骷髅兵", "森林狼人", "熔岩史莱姆", "荒野强盗", "深海塞壬", "古墓食尸鬼", "峡谷鹰身女妖", "暗影刺客", "迷路的旅行者" // 对应原逻辑中else分支的兜底名称 };
原chooseName方法可简化到几行,完全不需要任何分支判断:
string chooseName() { // 直接生成覆盖名字池长度范围的随机索引,取对应位置的名字即可 int randomIndex = _randomGenerator.Next(_enemyNamePool.Count); return _enemyNamePool[randomIndex]; }
扩展适配
如果后续需要配置不同名字的出现权重(比如稀有名字生成概率低、普通名字生成概率高),依然不需要写分支判断:仅需要给每个名字对应配置权重值,封装通用的随机权重选择逻辑即可,增删名字、调整概率都只需要修改配置项,完全不涉及分支代码的维护。
内容的提问来源于stack exchange,提问作者Trex
相关产品推荐
相关产品推荐

