按钮无法处理!= if语句

时间:2012-08-15 18:55:27

标签: c# winforms

我正试图在c#中复制Mastermind游戏并且已经遇到了障碍,可以这么说。我面临的问题是玩家2从6个可用的猜测哪3个复选框是正确的阶段。 (8次尝试8次/生活在猜测中)。当玩家2猜出正确的复选框时,我的代码有效,但是当选择了不正确的复选框并且点击了“猜测”按钮时,没有任何反应。我有第二个if语句来检查这个,但显然一定是错的。按钮点击事件的代码是:

 private void Guess_button_Click(object sender, EventArgs e)
 {
     int boxesChecked = 0;   // Default value

     CheckBox[] checkBoxArray = new CheckBox[] 
         { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6 };

     for (int i = 0; i < checkBoxArray.Length; i++)
     {
         if (checkBoxArray[i].Checked)
             boxesChecked++;
      }

      if (boxesChecked > 3)
          MessageBox.Show("You have checked " + boxesChecked.ToString() + 
              " checkboxes. Only 3 are allowed.");
      else if (boxesChecked < 3)
          MessageBox.Show("You have checked " + boxesChecked.ToString() + 
              " checkboxes. Please choose 3.");

      if (checkBox1.Checked == cb1)
          if (checkBox2.Checked == cb2)
              if (checkBox3.Checked == cb3)
                  if (checkBox4.Checked == cb4)
                      if (checkBox5.Checked == cb5)
                          if (checkBox6.Checked == cb6)
                          {
                              MessageBox.Show("Congratulations, You Win!", 
                                  "Game Won"); 

                              if (MessageBox.Show("Would you like to play again?", 
                                  "Play Again?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                              {
                                  p1input restart = new p1input();
                                  this.Close();   // Close current window
                                  restart.Show(); // Open restart (instance of p1input)
                              }
                              else
                              {
                                  Environment.Exit(0);    // Terminate Application
                              }

    if (checkBox1.Checked != cb1)
        if (checkBox2.Checked != cb2)
            if (checkBox3.Checked != cb3)
                if (checkBox4.Checked != cb4)
                    if (checkBox5.Checked != cb5)
                        if (checkBox6.Checked != cb6)
                        {
                            MessageBox.Show("Unlucky, Guess Again!");
                            checkBox1.Visible = false;
                            checkBox2.Visible = false;
                            checkBox3.Visible = false;
                            checkBox4.Visible = false;
                            checkBox5.Visible = false;
                            checkBox6.Visible = false;
                        }
    }                              
}

2 个答案:

答案 0 :(得分:10)

好的,我们走了。您的代码需要检查一些内容:

<强> 1。选中了多少个复选框?

让我们使用一点lamba来使for更漂亮一点:

boxesChecked = checkBoxArray.Where<CheckBox>(x => x.Checked).Count();

<强> 2。如果用户没有选中3个复选框,让我们显示该消息并保留方法!

它也有点简化,你可能希望改变它:

        if (boxesChecked != 3)
        {
            MessageBox.Show(string.Format("You have checked {0} checkboxes. Please choose 3.", boxesChecked));
            return;
        }

第3。验证结果

让我们稍微改变一下if。注意主else条件(玩家丢失!):

        if (checkBox1.Checked == cb1
            && checkBox2.Checked == cb2
            && checkBox3.Checked == cb3
            && checkBox4.Checked == cb4
            && checkBox5.Checked == cb5
            && checkBox6.Checked == cb6)
        {
            MessageBox.Show("Congratulations, You Win!", "Game Won"); // Display MessageBox

            if (MessageBox.Show("Would you like to play again?", "Play Again?", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                p1input restart = new p1input();
                this.Close();   // Close current window
                restart.Show(); // Open restart (instance of p1input)
            }
            else
            {
                Environment.Exit(0);    // Terminate Application
            }
        }
        else
        {
            MessageBox.Show("Unlucky, Guess Again!");
            checkBox1.Visible = false;
            checkBox2.Visible = false;
            checkBox3.Visible = false;
            checkBox4.Visible = false;
            checkBox5.Visible = false;
            checkBox6.Visible = false;
        }

请注意,我并不是说这是游戏的最佳设计,我只是指出要改变代码的一些事情。


<强>更新

根据花费的评论,我们来看看你的方法。请检查一下:

    private void Guess_button_Click(object sender, EventArgs e)
    {
        int boxesChecked = 0;   // Default value

        List<CheckBox> AllTheCheckBoxes = new List<CheckBox> { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6 };

        boxesChecked = AllTheCheckBoxes.Where<CheckBox>(x => x.Checked).Count();

        if (boxesChecked != 3)
        {
            MessageBox.Show(string.Format("You have checked {0} checkboxes. Please choose 3.", boxesChecked));
            return;
        }

        if (AllTheCheckBoxes.Any<CheckBox>(x => x.Checked != Convert.ToBoolean(x.Tag)))
        {
            MessageBox.Show("Unlucky, Guess Again!");

            AllTheCheckBoxes.ForEach(x => x.Visible = false);

            return;
        }

        MessageBox.Show("Congratulations, You Win!", "Game Won"); // Display MessageBox

        if (MessageBox.Show("Would you like to play again?", "Play Again?", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            p1input restart = new p1input();
            this.Close();   // Close current window
            restart.Show(); // Open restart (instance of p1input)
        }
        else
        {
            Environment.Exit(0);    // Terminate Application
        }
    }

请注意,我正在使用Tag属性。它是一个任意字符串,开发人员可以将其用于任何目的。在这里,我希望在此属性中存储正确的值(truefalse)。


更新2

关于发现所有复选框的OP评论(看起来总共48个)。 您可以使用以下语句(了解并根据您的需要进行改进)。

List<CheckBox> AllTheCheckBoxes = this.Controls.AsQueryable().OfType<CheckBox>().Where(x => x.Tag != null).ToList();

答案 1 :(得分:2)

当用户猜对时,您检查错误值似乎位于if语句的大括号内。

换句话说,它永远不会被击中。你需要将它从括号中分离出来才能运行。

像其他人所说的那样,所有那些嵌套的ifs最终都会伤到你。考虑清理那一点,这样你就可以更好地了解发生了什么。