0

我正在尝试在 c# 中复制 Mastermind 游戏并且遇到了障碍,可以这么说。我面临的问题是玩家 2 从可用的 6 个复选框中猜测哪些 3 个复选框是正确的。(8 行 8 次尝试/猜测生命)。The code I have works when player 2 guesses the correct checkboxes, however when the incorrect checkboxes are selected and the "guess" button is clicked nothing happens. 我有第二个 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;
                        }
    }                              
}
4

2 回答 2

10

好了,走吧。在您的代码中有几件事需要查看:

1. 勾选了多少个复选框?

让我们用一个小兰巴让它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();
于 2012-08-15T19:09:51.587 回答
2

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

换句话说,它永远不会被击中。您需要将其从大括号中取出,以便它运行。

就像其他人说的那样,所有那些嵌套的 if 最终都会伤害到你。考虑清理那一点,以便您可以更好地了解正在发生的事情。

于 2012-08-15T19:03:59.233 回答