0

私はc#内でMastermindゲームを複製しようとしていて、いわばハードルにぶつかっています。私が直面している問題は、プレーヤー2が利用可能な6つのチェックボックスから正しい3つのチェックボックスを推測する段階にあります。(8回の試行/推測での生存に対して8行)。私が持っているコードは、プレーヤー2が正しいチェックボックスを推測したときに機能しますが、間違ったチェックボックスが選択され、「推測」ボタンがクリックされた場合は何も起こりません。これをチェックするための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;
                        }
    }                              
}
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プロパティを使用していることに注意してください。これは任意の文字列であり、開発者は任意の目的で使用できます。ここでは、正しい値(trueまたはfalse)がこのプロパティに格納されていることを期待しています。


更新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 に答える