C# 在WinForm中循环期间,用户如何更改其号码?

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

我试图制作一个小程序,选择一个随机数,用户有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; 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
      }
 }