C#骰子模拟器特定数值下无法正常工作问题求助
解决C#骰子模拟器构造函数默认值不生效的问题
嘿,我来帮你搞定这个骰子模拟器的问题!看起来你在构造函数里的默认值判断逻辑可能没写对,导致输入面数小于3时没有正确切换到默认配置。我来给你梳理下问题所在,再提供修正后的完整代码。
常见问题分析
通常出现这种情况,大概率是构造函数里没有对输入的面数做合法性校验并替换默认值,或者校验逻辑写反了。比如直接把输入的sides赋值给属性,没有判断是否小于3,后续Roll的时候可能还会出现范围错误(因为Random.Next(1, sides+1)要求第二个参数必须大于第一个)。
修正后的完整代码
下面是符合你需求的骰子模拟器实现,我加了详细的注释说明:
using System; public class DiceSimulator { // 定义可维护的默认常量,方便后续修改默认配置 private const int DefaultSideCount = 6; private const int DefaultInitialRollValue = 1; // 公开只读属性,外部只能获取面数和当前点数 public int SideCount { get; private set; } public int CurrentValue { get; private set; } // 随机数实例,放在构造函数初始化避免重复创建导致的重复值问题 private readonly Random _randomGenerator; public DiceSimulator(int requestedSides) { // 核心逻辑:校验输入面数,小于3则使用默认值 SideCount = requestedSides >= 3 ? requestedSides : DefaultSideCount; _randomGenerator = new Random(); // 根据需求初始化点数:如果是默认情况,用固定默认值;否则直接滚动一次 if (requestedSides >= 3) { Roll(); } else { CurrentValue = DefaultInitialRollValue; } } // 滚动骰子方法,返回新的点数 public int Roll() { // 因为构造函数已经保证SideCount至少为3,这里无需额外校验 CurrentValue = _randomGenerator.Next(1, SideCount + 1); return CurrentValue; } }
关键细节说明
- 默认值校验:构造函数里用三元运算符(或者if-else)判断输入的
requestedSides,不符合要求就替换为DefaultSideCount,确保SideCount永远不会小于3。 - 随机数实例优化:把
Random实例放在构造函数初始化,而不是每次Roll都新建,避免短时间内多次Roll导致生成重复的随机数。 - 初始点数控制:根据需求,当使用默认面数时,直接设置固定的默认点数(比如1);如果是合法输入,直接调用Roll生成随机点数,你也可以根据需求调整这里的逻辑。
测试示例
你可以用下面的代码测试效果:
// 测试输入小于3的情况(比如2面) var defaultDice = new DiceSimulator(2); Console.WriteLine($"默认骰子:面数={defaultDice.SideCount},当前点数={defaultDice.CurrentValue}"); // 输出:默认骰子:面数=6,当前点数=1 // 测试合法输入(比如10面) var customDice = new DiceSimulator(10); Console.WriteLine($"自定义骰子:面数={customDice.SideCount},当前点数={customDice.CurrentValue}"); // 输出:自定义骰子:面数=10,当前点数=1-10之间的随机数
这样就能完美解决你遇到的问题啦!
内容的提问来源于stack exchange,提问作者Samuel Chow
相关产品推荐
相关产品推荐

