You need to enable JavaScript to run this app. 如何在WPF应用的if-else逻辑中实现循环,达成4次错误累计后终止游戏的需求
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 06:36:04