Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WinForms:在无限循环中等待按钮按下_C#_Events_Infinite Loop - Fatal编程技术网

C#WinForms:在无限循环中等待按钮按下

C#WinForms:在无限循环中等待按钮按下,c#,events,infinite-loop,C#,Events,Infinite Loop,我正在用GUI做一个简单的数字猜测游戏。我需要等待一个循环,等待用户在文本框中输入一个数字,然后按“OK”。如何在循环中等待事件 注意:我不想要消息框。这是在主窗口中完成的,因此需要等待输入 编辑:我应该更好地解释我自己。我知道GUI中有一个循环。我想要的是方法中的另一个循环。也许有更好的办法。现在,我可以在按钮的事件处理程序中编写代码。虽然我需要全局变量。无论如何,我会考虑的,但我希望我的问题现在更清楚 编辑2:很抱歉,我的问题不清楚,编辑也没有什么帮助。首先,代码太大,无法在这里发布。我可能

我正在用GUI做一个简单的数字猜测游戏。我需要等待一个循环,等待用户在文本框中输入一个数字,然后按“OK”。如何在循环中等待事件

注意:我不想要消息框。这是在主窗口中完成的,因此需要等待输入

编辑:我应该更好地解释我自己。我知道GUI中有一个循环。我想要的是方法中的另一个循环。也许有更好的办法。现在,我可以在按钮的事件处理程序中编写代码。虽然我需要全局变量。无论如何,我会考虑的,但我希望我的问题现在更清楚

编辑2:很抱歉,我的问题不清楚,编辑也没有什么帮助。首先,代码太大,无法在这里发布。我可能不得不发布GUI的屏幕截图,所以它没有多大用处。基本上,我有两个字段,“最大数量”和“允许猜测的数量”。用户输入这两个并单击“播放”。新面板可用,带有文本框和“猜测”按钮。用户输入猜测,程序检查是否正确

第二个无限循环的目的是避免全局变量。看,每次用户点击“玩”,游戏必须生成一个新的随机数作为正确的猜测。如果一切都是在一个方法内完成的,那就没问题了。但是,如果多次调用“Guess”按钮的事件处理程序,则必须将该数字存储为表单的实例变量。当然,这没什么大不了的,但我认为数字应该是指导当前游戏的方法的属性,而不是形式的属性

我还必须跟踪该方法之外的剩余猜测数。再说一次,这没什么大不了的。如果可以的话,我只想避开环球


再一次,我很抱歉我的问题不太清楚。我有点累了,我不想写太多。如果这还不清楚,那就不用麻烦了。我会想办法的。

C#自动无限循环等待事件,直到表单关闭。您只需要响应按钮单击事件。

您可能应该找一本书来真正学习windows编程

最基本的是:

1) 在windows代码的深处已经有一个无限循环。任何windows程序都在不断循环和扫描输入

2) 一旦找到输入,这个循环就会触发一个事件


3) 如果您选择接受它,您的任务是编写事件处理程序来处理这些事件。

您很可能做得不对,正如已经指出的那样,但您可以使用此方法

Application.DoEvents()

在实际循环中处理事件的步骤

以正确的方式去做 -不要使用循环 -使用编辑框进行输入,然后使用按钮
-在单击事件时执行按钮

Jason Down的建议是明智的,创建一个新的
GuessingGame
类并将其添加到项目中。我知道你担心“全局变量”(学校里的每个人都被教导,除非你绝对必须使用,否则永远不要使用它),但请考虑一下你的设计规范

但是,如果多次调用“Guess”按钮的事件处理程序,则必须将该数字存储为表单的实例变量。当然,这没什么大不了的,但我认为数字应该是指导当前游戏的方法的属性,而不是形式的属性

或者,将
GuessingGame
类的实例存储在表单中。这不是一个全局变量!你自己也这么说过,游戏的重点是跟踪猜测,并在每次点击“玩”时生成新的数字进行猜测。如果将游戏实例存储在表单中,然后打开另一个表单(例如帮助或关于框),则游戏实例将不可用(因此,不是全局的)

GuessingGame
对象的外观如下所示:

public class GuessingGame
{
    private static Random _RNG = new Random();
    private bool _GameRunning;
    private bool _GameWon;
    private int _Number;
    private int _GuessesRemaining;

    public int GuessesRemaining
    {
        get { return _GuessesRemaining; }
    }

    public bool GameEnded
    {
        get { return !_GameRunning; }
    }

    public bool GameWon
    {
        get { return _GameWon; }
    }

    public GuessingGame()
    {
        _GameRunning = false;
        _GameWon = false;
    }

    public void StartNewGame(int numberOfGuesses, int max)
    {
        if (max <= 0)
            throw new ArgumentOutOfRangeException("max", "Must be > 0");

        if (max == int.MaxValue)
            _Number = _RNG.Next();
        else
            _Number = _RNG.Next(0, max + 1);

        _GuessesRemaining = numberOfGuesses;
        _GameRunning = true;
    }

    public bool MakeGuess(int guess)
    {
        if (_GameRunning)
        {
            _GuessesRemaining--;
            if (_GuessesRemaining <= 0)
            {
                _GameRunning = false;
                _GameWon = false;
                return false;
            }

            if (guess == _Number)
            {
                _GameWon = true;
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            throw new Exception("The game is not running. Call StartNewGame() before making a guess.");
        }
    }
}

是的,如果我在等待语音事件,它可能会在函数运行时的任何时间发生,我需要在不递归调用函数的情况下处理它

也许你应该解释无限循环的目的,也许你应该发布一些代码。。。这样我们就可以不再假设你是新手了。你可以创建一个游戏类来处理跟踪一切。
GuessingGame game = new GuessingGame();

private void btnPlay_Click(object sender, EventArgs e)
{
    int numberOfGuesses = Convert.ToInt32(txtNumberOfGuesses.Text);
    int max = Convert.ToInt32(txtMax.Text);
    game.StartNewGame(numberOfGuesses, max);
}

private void btnGuess_Click(object sender, EventArgs e)
{
    int guess = Convert.ToInt32(txtGuess.Text);
    bool correct = game.MakeGuess(guess);

    if (correct) 
        lblWin.Visible = true;

    if (game.GameEnded)
    {
        // disable guess button, show loss label
    }
}