C# 在WinForm中循环期间,用户如何更改其号码?
我试图制作一个小程序,选择一个随机数,用户有5次尝试猜测正确的数字。我用一个C# 在WinForm中循环期间,用户如何更改其号码?,c#,winforms,C#,Winforms,我试图制作一个小程序,选择一个随机数,用户有5次尝试猜测正确的数字。我用一个for循环来做这件事。这是我的密码: private void btn1_Click(object sender, EventArgs e) { Random r = new Random(); int nbMagique = r.Next(1, 10); int nombreUser=165; bool nbJuste=false; for (int essais = 5; es
for
循环来做这件事。这是我的密码:
private void btn1_Click(object sender, EventArgs e)
{
Random r = new Random();
int nbMagique = r.Next(1, 10);
int nombreUser=165;
bool nbJuste=false;
for (int essais = 5; essais != 0 && nombreUser != nbMagique || nbJuste == true; essais--)
{
if (nombreUser == nbMagique)
{
lblCond.Text = "WOW INCREDIBLE!";
nbJuste = true;
}
else
{
if (nombreUser < nbMagique)
{
lblCond.Text = "Lower!";
}
else
{
lblCond.Text = "Higher!";
}
}
lblChance.Text = Convert.ToString(essais);
//I tried to make the program wait 5 seconds
System.Threading.Thread.Sleep(5000);
if (essais == 4 || essais == 5)
{
this.BackColor = Color.LimeGreen;
}
else if (essais == 3)
{
this.BackColor = Color.Orange;
}
else if(essais==2)
{
this.BackColor = Color.OrangeRed;
}
else if(essais==1)
{
this.BackColor = Color.Crimson;
}
}
}
private void btn1\u单击(对象发送者,事件参数e)
{
随机r=新随机();
int-nbMagique=r.Next(1,10);
int nombreUser=165;
bool nbJuste=false;
for(int-essais=5;essais!=0&&nombreUser!=nbMagique | | nbJuste==true;essais--)
{
if(nombreUser==nbMagique)
{
lblCond.Text=“哇,难以置信!”;
nbjust=true;
}
其他的
{
if(nombreUser
我试着等了5秒钟,但没用。谢谢您的帮助。这里的问题是您正在按钮单击处理程序中运行逻辑循环 您应该使用单击按钮来获取用户输入的号码(我假设这是您的意图),并在其他地方的逻辑循环中使用该号码
理想情况下,您希望在任务中运行逻辑。这样,您就可以让它在等待新用户数据时停止处理,而不会冻结用户界面。您正在使主线程进入睡眠状态。这使得您的主线程无法侦听用户输入 在UI驱动的应用程序中,永远不要让UI线程做任何需要比用户愿意等待的时间更长的事情 通常人们希望在100毫秒内得到回复:如果你试图键入12345,而你必须在1之后等待100毫秒才能看到2,你会很恼火 我们不害怕类,所以让我们创建一个为您玩游戏的类。显然,您希望通过向文本框发送消息来通知用户,并且希望更改某些控件的背景颜色。当游戏对象被创建时,一个神奇的数字被创建。方法guess(int)将执行猜测
class MyGame
{
private readonly static random = new Random();
public MyGame()
{
this.MagicNumber = this.random.Next(1, 10);
this.GuessCount = 0
}
public TextBox Messagebox {get; set;} // shows higher / lower / ok
public Control ColorControl {get; set;} // Change the color when almost out of guesses
public int MagicNumber {get; private set;}
public int GuessCount {get; private set;}
public void Guess(int guess)
{
// update the MessageBox:
if (guess > this.MagicNumber)
this.MessageBox.Text = ...
else if (guess < this.MagicNumber)
this.MessageBox.Text = ...
else
this.MessageBox.Text = ...
// update the backgound color:
++this.GuessCount;
if (this.GuessCount < ...)
this.ColorControl.BackColor = ...
else if (this.GuessCount < ...)
this.ColorControl.BackColor = ...
// etc.
}
}
你想什么时候开始比赛?表单何时加载?或者当用户按下新游戏按钮时
void OnButtonNewGameClicked(Button sender, EventArgs e)
{
if (Object.ReferenceEquals(sender, this.ButtonNewGame)
{
// start a new Game
this.StartNewGame();
}
}
用户应该如何进行新的猜测:只需在文本框中键入一个数字,或者键入一个数字并按下按钮猜测
void OnButtonGuessClicked(Button sender, EventArgs e)
{
if (Object.ReferenceEquals(sender, this.ButtonGuess)
{ // User pressed guess button
string input = this.ButtonGuess.Text;
int guess = Int32.Parse(input);
// TODO: catch exception and proper error if not a proper number
this.Game.Guess(guess);
// this will display the result and color the form
}
}
这个单独的类的好处是,您可以轻松地更改游戏,而无需更改表单:您可以决定为文本框而不是整个表单上色。您可以决定将输入设置为数字向上向下,而不是文本框,这样人们就不会意外地键入任何非数字的内容
在windows窗体应用程序中,尝试将用户输入/输出与数据处理分开
这样,在不更改数据处理的情况下更改表单将更容易。单元测试数据处理也会更容易(因为它没有表单)我认为你必须使用
计时器或类似的东西,而不是for
循环。你为什么认为你需要等待?一般流程如下:1)用户输入2)检查输入3)如果正确:完成4)否则:转到1)使用此系统。线程。线程。睡眠(5000)您将冻结ui线程5秒钟。您可以在任务或线程中运行此代码,或者在winform timer中更轻松地运行此代码。我不认为这里的任何计时器都可以帮助OP达到其目的。您将事件驱动接口视为控制台应用程序。让用户点击按钮提交他们猜测的数字。使用int
字段跟踪猜测次数<代码>int nombreUser=165
完全超出了int nbMagique=r.Next(1,10)代码>范围。使用文本框让用户插入一个数字,int.TryParse()
it验证输入。
void OnButtonGuessClicked(Button sender, EventArgs e)
{
if (Object.ReferenceEquals(sender, this.ButtonGuess)
{ // User pressed guess button
string input = this.ButtonGuess.Text;
int guess = Int32.Parse(input);
// TODO: catch exception and proper error if not a proper number
this.Game.Guess(guess);
// this will display the result and color the form
}
}