0

所以我有以下代码,它几乎可以完美地工作,除了无论我做什么我都无法获得类似的部分:for (int.parse(txtGuess.Text) == numbGen)无论我将它放在代码中的哪个位置,它都无法识别“numbGen”。我不能将它放在按钮单击功能中,因为我不希望更改数字,除非他们已正确或重新打开表单。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;


    namespace WindowsApplication1
    {
        public partial class rndNum : Form
        {
            public rndNum()
            {
            }

            private void rndNum_Load(object sender, EventArgs e)
            {
                int numbGen = RandMake(0, 100);
            }

            private void txtGuess_TextChanged(object sender, EventArgs e)
            {

            }

            private void btnEval_Click(object sender, EventArgs e)
            {
                int guesses = 0;
                while (txtGuess.Text != "")
                {
                    if (int.Parse(txtGuess.Text) == numbGen)
                    {
                        MessageBox.Show("You got it!", "Congratulations!");
                        break;
                    }
                    else if (int.Parse(txtGuess.Text) > numbGen)
                    {
                        MessageBox.Show("Sorry, but you're too high. The number was " + numbGen + "!", "Please try again.");
                        txtGuess.Clear();
                        txtGuess.Focus();
                        guesses++;
                        break;
                    }
                    else if (int.Parse(txtGuess.Text) < numbGen)
                    {
                        MessageBox.Show("Sorry, but you're too low. The number was " + numbGen + "!", "Please try again.");
                        txtGuess.Clear();
                        txtGuess.Focus();
                        guesses++;
                        break;
                    }
                }
            }



            private static int RandMake(int min, int max)
            {
                Random mkRnd = new Random();
                return mkRnd.Next(min, max);
            }
}

}

4

4 回答 4

3

numbGen必须是类成员。

改变

        private void rndNum_Load(object sender, EventArgs e)
        {
            int numbGen = RandMake(0, 100);
        }

        private int numbGen;
        private void rndNum_Load(object sender, EventArgs e)
        {
            numbGen = RandMake(0, 100);
        }

其实你不需要把初始化放在里面Form.Load,你可以直接初始化一个类成员。

    public partial class rndNum : Form
    {
        private int numbGen = RandMake(0, 100);
        public rndNum()
        {
        }

并进一步细化:如果你想确保值没有改变,你可以做到readonly

    public partial class rndNum : Form
    {
        private readonly int numbGen = RandMake(0, 100);
        public rndNum()
        {
        }
于 2011-10-09T20:25:46.220 回答
2
int numbGen;
private void rndNum_Load(object sender, EventArgs e)
{
    numbGen = RandMake(0, 100);
}

试试这个!!!

于 2011-10-09T20:26:45.923 回答
2

其他人已经对您注意到的范围界定问题发表了评论。但是你的RandMake方法也有缺陷。您不应Random为每个数字创建一个实例,而应重用该实例。

这里的问题是new Random()使用时间作为种子,时间每隔几毫秒就会改变一次。这意味着如果您RandMake在该时间间隔内多次调用,您将获得相同的“随机”号码。

这似乎不是一个直接的问题,因为您只调用它一次,但您应该在将来意识到这一点。

于 2011-10-09T20:30:29.537 回答
0

当您将 numbGen 的声明放在方法内部时,该数字仅存在于该函数范围内。你必须像这样把它放在外面:

        int numbGen;
        private void rndNum_Load(object sender, EventArgs e)
        {
            numbGen = RandMake(0, 100);
        }

于 2011-10-09T20:30:51.693 回答