如何在WPF应用的if-else逻辑中实现循环,达成4次错误累计后终止游戏的需求
现有代码的核心问题
- 错误计数器作用域错误:
poch变量定义在kontrola_Click方法内部,属于每次触发点击都会重新初始化的局部临时变量,初始值永远为0,完全不具备跨多次用户交互累计计数的能力 - 循环逻辑完全偏离需求:嵌入在答错分支里的do-while循环存在两处逻辑错误:一是循环判断条件写反了,原代码判断规则是“当poch等于4时继续循环”,实际执行时进入分支后把poch从0自增到1,就因为不满足“等于4”的循环条件直接跳出,没有任何循环价值;二是整体逻辑和“累计答错4次再终止”的目标完全错位,靠循环在单次点击内刷计数本身就不符合交互逻辑
- 随机数生成存在缺陷:单独创建两个
Random实例时,受系统时钟精度限制,两个实例的随机种子差值极小,大概率会生成完全相同的随机操作数,失去出题的随机性
修正后的可运行实现
调整核心逻辑的作用域、移除误用的循环、补全交互校验,修正后的代码完全覆盖累计计数、错误阈值终止的需求:
// 类级别的成员变量,生命周期和窗口一致,支持跨事件累计状态 private readonly Random _random = new Random(); // 全局共用一个随机实例,避免种子重复问题 private int _errorCount = 0; // 跨点击累计的错误计数器 private const int MaxAllowedError = 4; // 最大允许错误次数,后续调整阈值直接修改常量即可 private void Window_Loaded(object sender, RoutedEventArgs e) { // 窗口加载时直接加载第一道题 LoadNewQuestion(); } private void kontrola_Click(object sender, RoutedEventArgs e) { // 输入合法性校验,避免空值、非数字输入导致的判断错误 if (!int.TryParse(vysledekhrac.Text, out int playerAnswer)) { hlaska.Text = "请输入有效的数字答案"; return; } int correctAnswer = int.Parse(vysledek.Text); if (playerAnswer == correctAnswer) { hlaska.Text = "Správně"; // 答对时重置错误计数,加载下一题 _errorCount = 0; pocetchyb.Text = _errorCount.ToString(); LoadNewQuestion(); } else { // 每次答错仅自增一次计数,不再嵌入无意义的循环 _errorCount++; pocetchyb.Text = _errorCount.ToString(); hlaska.Text = "Špatně"; // 达到错误阈值直接终止游戏流程 if (_errorCount >= MaxAllowedError) { hlaska.Text = $"累计错误达{MaxAllowedError}次,游戏终止"; // 禁用交互控件,阻断后续答题操作 kontrola.IsEnabled = false; vysledekhrac.IsEnabled = false; } } } // 把出题逻辑抽成独立方法,后续扩展题型时无需修改事件交互逻辑 private void LoadNewQuestion() { int firstNum = _random.Next(1, 10); int secondNum = _random.Next(2, 10); int correctResult = firstNum + secondNum; prvnit.Text = firstNum.ToString(); druhyt.Text = secondNum.ToString(); vysledek.Text = correctResult.ToString(); vysledekhrac.Clear(); }
后续多题型扩展的开发建议
- 抽象题型生成逻辑:把“生成题目文本、计算正确答案”的流程抽成独立的接口规范,后续新增减法、乘法、除法题型时,只要实现对应的出题逻辑即可,不用改动错误计数、答案判断、流程终止的核心框架
- 解耦UI和业务状态:目前的错误数、正确答案都直接存在UI控件的文本属性里,后续扩展功能时取数逻辑会非常零散,可以把游戏状态、当前题目、累计计数单独存为业务层的状态变量,减少UI属性的硬依赖
- 优化难度配置:把出题的数值范围、最大错误次数、题型规则都做成可配置的参数,后续调整题目难度时不用修改核心交互代码
- 补全异常场景处理:比如用户连续输入非数字、答题超时的场景,可以在现有计数逻辑的基础上扩展对应判断,不用重写核心流程
内容的提问来源于stack exchange,提问作者userdavid
相关产品推荐
相关产品推荐

