0

主にif elseステートメント、コピーして貼り付けたコードの一部を使用して、三目並べゲームを作成するのに何時間も費やしました...

コードのインスタンスを 1 つだけ作成して、後で参照するにはどうすればよいでしょうか? - 毎回大量のコード行をコピーして貼り付けるのではなく、そのコードが必要なときに。このコード ブロックでは、1 から 10 までの乱数を取得しています。この数値は RI に格納されます。次に、Ai の番になると、コンピューターはボタンに X をランダムに入力し、このコードを使用してチェックします。コンピューターが勝ったかどうかを判断します。それが理にかなっていることを願っています=)

do
{
    storeRI = rc.Next(0, 10); //storing random number into storeRI so it can be used later on in life. 
    if (storeRI == 1 && btn1.Text == "")
    {
        btn1.Text = "X";
        Turn = 1;
        if (btn1.Text == "X" & btn2.Text == "X" & btn3.Text == "X")
        {
            btn1.BackColor = Color.Green;
            btn2.BackColor = Color.Green;
            btn3.BackColor = Color.Green;

            XScore += 1;
            lblPScoreX.Text = XScore.ToString();

            foreach (Button btn in buttonList)
                 btn.Enabled = false;
        }
        else if (btn1.Text == "X" & btn4.Text == "X" & btn7.Text == "X")
        {
             btn1.BackColor = Color.Green;
             btn4.BackColor = Color.Green;
             btn7.BackColor = Color.Green;

             XScore += 1;
             lblPScoreX.Text = XScore.ToString();

             foreach (Button btn in buttonList)
                btn.Enabled = false;
        }
    }
}

たとえば、このコードは、少なくとも 10 回コピーしたコードの一部であり、コードが見苦しく、非常に読みにくくなります。

4

5 に答える 5

8

たとえば、このコードは、少なくとも10回コピーしたコードの一部です

コードをコピーしたときはいつでも、それをメソッドに移動するようにしてください。その後、メソッドを直接呼び出すことができます。あなたの場合、メソッドは影響を与える 3 つのボタンを簡単に受け入れて、それらに直接作用することができます。

于 2013-01-23T19:55:46.673 に答える
2

検討したいリファクタリング手法は、Consolidate Duplicate Conditional Fragmentsです。

if (btn1.Text == "X" & btn2.Text == "X" & btn3.Text == "X")
{
    btn2.BackColor = Color.Green;
    btn3.BackColor = Color.Green;
}
else if (btn1.Text == "X" & btn4.Text == "X" & btn7.Text == "X")
{
    btn4.BackColor = Color.Green;
    btn7.BackColor = Color.Green;
}
else
{
    return/break/continue; // hard to tell which you what as you have a do without a corresponding while
}

btn1.BackColor = Color.Green;

XScore += 1;
lblPScoreX.Text = XScore.ToString();
foreach (Button btn in buttonList)
{
    btn.Enabled = false;
}
于 2013-01-23T19:57:21.300 に答える
2
   bool TestWin(Button btnA, Button btnB, button btnC)
   {
           if (btnA.Text == "X" & btnB.Text == "X" & btnC.Text == "X")
           {
                    btnA.BackColor = Color.Green;
                    btnB.BackColor = Color.Green;
                    btnC.BackColor = Color.Green;

                    XScore += 1;
                    lblPScoreX.Text = XScore.ToString();

                    foreach (Button btn in buttonList)
                    {
                         btn.Enabled = false;
                    }
                    return true;
           }
           return false;
     }


     if (!TestWin(btn1, btn2, btn3))
           TestWin(btn1, btn4, btn7);
于 2013-01-23T20:02:05.033 に答える
0
if (btn1.Text == "X")
{
    btn1.BackColor = Color.Green;
    if(btn2.Text == "X" & btn3.Text == "X")
        btn2.BackColor = Color.Green;
        btn3.BackColor = Color.Green;
    }
    else if (btn4.Text == "X" & btn7.Text == "X")
    {
        btn4.BackColor = Color.Green;
        btn7.BackColor = Color.Green;
    }
    XScore += 1;
    lblPScoreX.Text = XScore.ToString();
    foreach (Button btn in buttonList)
    {
        btn.Enabled = false;
    }
}
于 2013-01-23T20:00:23.070 に答える
0

長い if else ステートメントに問題はありません。扱いにくい短いコードよりも、長くて読みやすいコードの方がよいのです。

私が見ることができる1つのことは、メソッドを追加することです(いくつかはあなたのタイプに合わせて変更されています):

public void ChangeButtonColor(Color thisColor, params Button[] buttons)
{
    foreach (Button thisButton in buttons)
    {
        thisButton.BackColor = thisColor
    }
}

次に、コードに追加するだけです:

ChangeButtonColor(Color.Green, btn1, btn2, btn3);

これにより、重複したコードを節約できます。

于 2013-01-23T20:06:27.227 に答える