2013-01-23 71 views
0

我花了幾個小時做只是主要利用井字遊戲,如果else語句,一些代碼,我只是複製並粘貼的...短路長的if語句

我怎麼會只是創建代碼的一個實例,那麼稍後再提及? - 當我需要這些代碼時,不要每次都複製粘貼大量代碼。在這段代碼中,我得到一個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; 
     } 
    } 
} 

例如這段代碼,是一些代碼,我已經複製ATLEAST 10倍,它只是讓我的代碼看起來很醜陋,真的很難讀。

+1

您的標題問題詢問關於「這個if語句」,但他們問題的身體在您正在談論的代碼上含糊不清。 –

+1

btn1.Text始終爲X,所以爲什麼要檢查它;) – MUG4N

回答

8

例如這段代碼,是一些代碼,我已經複製ATLEAST 10倍

你複製代碼的時候,你應該嘗試把它移動到一個方法。然後您可以直接調用該方法。在你的情況下,一個方法可以輕鬆接受三個按鈕來影響,並直接對它們進行處理。

+0

如果您使用的是Visual Studio,則可以嘗試突出顯示其中一個塊,然後右鍵單擊並選擇Refactor> Extract Method。 –

+0

有趣!我也會仔細研究這個! –

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; 
} 
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; 
    } 
} 
+1

即使後面兩個if()都不是真(這將是錯誤的),您正在將btn1.BackColor設置爲綠色。看看整個任務 - 他正在玩井字遊戲。當X獲勝時,他想以綠色着色獲勝。在贏得比賽之前,你有正方形彩色。 –

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); 
+0

我打算髮布這個,但你打敗了我:)。 +1雖然 – Max

+0

「1」是什麼意思?以及testwin的功能是什麼? –

+0

可能在字符串XorO中加入,然後檢查是否有一行X或OS然後返回獲勝的字符,如果沒有獲勝者,則檢查string.empty。 –

0

沒有錯,很長,如果else語句;比短的不可管理的代碼更長的可讀代碼更好。

有一件事我可以看到,可能有助於爲在添加一個方法(有一些改變,以匹配你的類型):

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

那麼你可以添加到您的代碼:

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

這會爲您節省一些重複的代碼。

+0

@JG在SD - 感謝修復!以爲我抓住了所有剩下的代碼。 –