代码之家  ›  专栏  ›  技术社区  ›  Javier

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

  •  0
  • Javier  · 技术社区  · 15 年前

    我用图形用户界面做了一个简单的数字猜谜游戏。我需要等待一个循环,等待用户在文本框中输入一个数字,然后按“确定”。如何在循环中等待事件?

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

    编辑: 我应该好好解释一下自己。我知道在GUI中有一个循环。我想要的是 另一个 在方法内循环。也许有更好的方法。我现在可以在按钮的事件处理程序中编写代码了。尽管我需要全局变量。不管怎样,我会考虑的,但我希望我的问题现在更清楚了。

    编辑2: 抱歉,我的问题不清楚,编辑也没什么帮助。首先,代码太大,无法在此处发布。我可能需要发布一个图形用户界面的屏幕截图,这样就不会有太大的用处了。基本上,我有两个字段,“max number”和“允许猜测的次数”。用户输入这两个并点击“播放”。一个新的面板变得可用,有一个文本框和一个“猜测”按钮。用户输入一个猜测,程序检查它是否正确。

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

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

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

    5 回复  |  直到 14 年前
        1
  •  3
  •   John Rasch    15 年前

    杰森·唐的建议是明智的,创造一个新的 GuessingGame 类并将其添加到项目中。我知道你很担心“全局变量”(学校里每个人都在教这种变量) 从未 使用,除非你必须这样做),但是考虑一下你的设计规格。

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

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

    这个 猜谜游戏 对象将看起来像:

    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
        }
    }
    
        2
  •  5
  •   Instance Hunter    15 年前

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

        3
  •  1
  •   CodeRedick    15 年前

    你应该找本书来学习Windows编程。

    最基本的:

    1)在Windows代码的某个地方已经有了一个无限循环。任何Windows程序都在不断地循环和扫描输入。

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

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

        4
  •  1
  •   BlackTigerX Borut Tomazin    15 年前

    正如已经指出的那样,你很可能做错了,但是你可以用这个

    application.doEvents();

    在实际循环中处理事件

    以正确的方式去做 -不要使用循环 -使用编辑框输入,然后使用按钮 -实现按钮onclick事件

        5
  •  1
  •   Patrick    14 年前

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