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

C#开发乘法表小游戏 随机数无法跨按钮传递导致答案校验错误

问题根因

你的代码核心问题是两次按钮点击事件中生成的随机数没有共享,校验时用的不是出题时的随机数:

  • 按钮1点击事件里生成的rrNum是方法内的局部变量,方法执行结束后就会被销毁,按钮2的事件完全拿不到这个值
  • 你在按钮2的事件里又重新实例化了Random并生成了新的rrNum,相当于用完全不相干的新随机数校验用户答案,自然几乎不可能匹配成功

修复方案

你需要把需要跨事件访问的变量,定义为窗体类的成员变量(放在所有方法外部,类的内部),这样整个类的所有方法都可以访问修改这些值。另外Random实例全局只需要初始化一次,重复实例化可能会导致生成的随机数重复。

第一步:定义类成员变量

在你的窗体类内部、所有方法的上方添加如下定义:

// 存储用户输入的数字
private int userInput;
// 存储出题用的随机数
private int rrNum;
// 随机数生成器全局仅初始化一次
private Random rNum = new Random();
// 可选:加个存分数的变量用来累加
private int score = 0;

第二步:修改按钮1的点击事件代码

删掉事件内部的Random实例化代码,直接用全局的rNum生成随机数并赋值给成员变量rrNum:

private void button1_Click(object sender, EventArgs e)
{
    // 输入校验避免非数字输入报错
    if(int.TryParse(textBox1.Text, out userInput) && userInput >= 1 && userInput <= 10)
    {
        rrNum = rNum.Next(1, 12);
        label5.Text = $"{rrNum}x{userInput}";
        // 每次出新题清空上一次的答题提示和输入框
        label8.Text = string.Empty;
        textBox2.Clear();
    }
    else
    {
        label8.Text = "请输入1-10之间的有效数字";
    }
}

第三步:修改按钮2的点击事件代码

删掉事件内部重复生成随机数的代码,直接用成员变量里存的出题用随机数校验:

private void button2_Click(object sender, EventArgs e)
{
    int userAnswer;
    // 先校验用户答案是不是有效数字
    if(!int.TryParse(textBox2.Text, out userAnswer))
    {
        label8.Text = "请输入有效的数字答案";
        return;
    }
    if (userAnswer == userInput * rrNum)
    {
        label8.Text = "恭喜你答对了!";
        pictureBox1.Enabled = true;
        pictureBox1.Visible = true;
        // 累加分数逻辑,可额外加label展示分数
        score += 10;
    }
    else
    {
        label8.Text = "回答错误,再试一次吧!";
    }
}

内容的提问来源于stack exchange,提问作者NM120

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:48:03