C#WinForms:在无限循环中等待按钮按下
我正在用GUI做一个简单的数字猜测游戏。我需要等待一个循环,等待用户在文本框中输入一个数字,然后按“OK”。如何在循环中等待事件 注意:我不想要消息框。这是在主窗口中完成的,因此需要等待输入 编辑:我应该更好地解释我自己。我知道GUI中有一个循环。我想要的是方法中的另一个循环。也许有更好的办法。现在,我可以在按钮的事件处理程序中编写代码。虽然我需要全局变量。无论如何,我会考虑的,但我希望我的问题现在更清楚 编辑2:很抱歉,我的问题不清楚,编辑也没有什么帮助。首先,代码太大,无法在这里发布。我可能不得不发布GUI的屏幕截图,所以它没有多大用处。基本上,我有两个字段,“最大数量”和“允许猜测的数量”。用户输入这两个并单击“播放”。新面板可用,带有文本框和“猜测”按钮。用户输入猜测,程序检查是否正确 第二个无限循环的目的是避免全局变量。看,每次用户点击“玩”,游戏必须生成一个新的随机数作为正确的猜测。如果一切都是在一个方法内完成的,那就没问题了。但是,如果多次调用“Guess”按钮的事件处理程序,则必须将该数字存储为表单的实例变量。当然,这没什么大不了的,但我认为数字应该是指导当前游戏的方法的属性,而不是形式的属性 我还必须跟踪该方法之外的剩余猜测数。再说一次,这没什么大不了的。如果可以的话,我只想避开环球C#WinForms:在无限循环中等待按钮按下,c#,events,infinite-loop,C#,Events,Infinite Loop,我正在用GUI做一个简单的数字猜测游戏。我需要等待一个循环,等待用户在文本框中输入一个数字,然后按“OK”。如何在循环中等待事件 注意:我不想要消息框。这是在主窗口中完成的,因此需要等待输入 编辑:我应该更好地解释我自己。我知道GUI中有一个循环。我想要的是方法中的另一个循环。也许有更好的办法。现在,我可以在按钮的事件处理程序中编写代码。虽然我需要全局变量。无论如何,我会考虑的,但我希望我的问题现在更清楚 编辑2:很抱歉,我的问题不清楚,编辑也没有什么帮助。首先,代码太大,无法在这里发布。我可能
再一次,我很抱歉我的问题不太清楚。我有点累了,我不想写太多。如果这还不清楚,那就不用麻烦了。我会想办法的。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
}
}