2009-06-17 176 views
0

我正在用一个GUI做一个简单的猜数字游戏。我需要等待循环等待用户在文本框中输入数字,然后按“确定”。我如何等待循环内的事件?C#WinForms:等待一个无限循环内的按钮按下

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

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

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

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

我还必须跟踪方法以外的剩余猜测数。再次,这没什么大不了的。如果可以,我只想避免使用全局变量。

再次,我很抱歉,我的问题不太清楚。我有点累,而且我不想写太多。如果这还不清楚,那么不要打扰。我会想到一些事情。

+1

也许你应该解释什么是无限循环的目的,也许发布一些代码......以便我们可以停止假设你是一个新手。 – ichiban 2009-06-17 03:59:04

回答

3

Jason Down的建议是明智的,创建一个新的GuessingGame类并将其添加到您的项目。我知道你担心“全局变量”(每个人都在学校中教过,绝不会使用,除非你绝对必须使用),但是考虑一下你的设计规格。

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

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

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 
    } 
} 
5

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

1

你应该找一本书来真正学习windows编程。

最基础:

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

2)一旦找到输入,该循环就会触发事件。 3)你的任务,如果你选择接受它,就是编写事件处理程序来处理这些事件。

1

你最有可能做错了,因为它已经指出的那样,但是你可以使用这个

应用。的DoEvents();

处理事件时,你是一个实际的循环

做正确的方式 - 不要使用循环 - 使用一个编辑框的输入,然后一个按钮 - 落实按钮onclick event

1

是的,如果我在等待言语事件,它可能发生的功能运行时随时随地事件,我需要处理,如果没有递归调用函数