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その時間間隔内に数回呼び出すと、同じ「乱数」が得られることを意味します。

呼び出しは 1 回だけなので、これは差し迫った問題ではないようですが、将来的にはこれに注意する必要があります。

于 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 に答える