2012-07-25 33 views
1

我試圖用9個按鈕編寫一個簡單的井字。 當我點擊任何一個按鈕時,我會顯示一個帶有WIN對話框的消息框。儘管此消息框僅用於在出現WIN CASE時顯示。 問題是它沒有正確比較Button.Text值。井字VisualBasic中不比較按鈕文本正確

最初,所有按鈕的Text屬性爲空。 點擊我將它們的TEXT設置爲「x」或「0」視情況而定。 這是假設正常工作,但無法弄清楚它爲什麼不比較clicked按鈕與其他按鈕的文本新分配的文本。

這裏是我的代碼

Public Class Form1 
Dim count As Int32 = 0 
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 


End Sub 
Sub checkwin() 
    If Button1.Text = Button2.Text And Button2.Text = Button3.Text Then 

     MessageBox.Show(Button1.Text & "wins") 
     Call reset() 


    ElseIf Button4.Text = Button5.Text And Button5.Text = Button6.Text Then 
     MessageBox.Show(Button4.Text & "wins") 
     Call reset() 

    ElseIf Button7.Text = Button8.Text And Button8.Text = Button9.Text Then 
     MessageBox.Show(Button7.Text & "wins") 
     Call reset() 
    ElseIf Button1.Text = Button4.Text And Button4.Text = Button7.Text Then 
     MessageBox.Show(Button1.Text & "wins") 
     Call reset() 

    ElseIf Button2.Text = Button5.Text And Button5.Text = Button8.Text Then 
     MessageBox.Show(Button2.Text & "wins") 
     Call reset() 
    ElseIf Button3.Text = Button6.Text And Button6.Text = Button9.Text Then 
     MessageBox.Show(Button3.Text & "wins") 
     Call reset() 
    ElseIf Button1.Text = Button5.Text And Button5.Text = Button9.Text Then 
     MessageBox.Show(Button1.Text & "wins") 
     Call reset() 

    ElseIf Button3.Text = Button5.Text And Button5.Text = Button7.Text Then 
     MessageBox.Show(Button3.Text & "wins") 
     Call reset() 
    End If 

End Sub 


Sub reset() 
    For Each b as Button in Controls 

     b.Text = " " 
     b.Enabled = True 

    Next 


End Sub 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, Button6.Click, Button7.Click, Button8.Click, Button9.Click 
    If sender Is Button1 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button1.Text = "0" 

     Else 
      Button1.Text = "x" 
     End If 

     Button1.Enabled = False 
     Call checkwin() 
    End If 

    If sender Is Button2 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button2.Text = "0" 
     Else 
      Button2.Text = "x" 
     End If 


     Button2.Enabled = False 
     Call checkwin() 
    End If 

    If sender Is Button3 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button3.Text = "0" 
     Else 
      Button3.Text = "x" 
     End If 

     Button3.Enabled = False 
     Call checkwin() 


    End If 
    If sender Is Button4 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button4.Text = "0" 

     Else 
      Button4.Text = "x" 
     End If 

     Button4.Enabled = False 
     Call checkwin() 
    End If 
    If sender Is Button5 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button5.Text = "0" 

     Else 
      Button5.Text = "x" 
     End If 

     Button5.Enabled = False 
     Call checkwin() 
    End If 

    If sender Is Button6 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button6.Text = "0" 

     Else 
      Button6.Text = "x" 
     End If 

     Button6.Enabled = False 
     Call checkwin() 
    End If 

    If sender Is Button7 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button7.Text = "0" 

     Else 
      Button7.Text = "x" 
     End If 

     Button7.Enabled = False 
     Call checkwin() 
    End If 

    If sender Is Button8 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button8.Text = "0" 

     Else 
      Button8.Text = "x" 
     End If 

     Button8.Enabled = False 
     Call checkwin() 
    End If 

    If sender Is Button9 Then 
     count = count + 1 
     If count Mod 2 = 0 Then 
      Button9.Text = "0" 

     Else 
      Button9.Text = "x" 
     End If 

     Button9.Enabled = False 
     Call checkwin() 
    End If 



End Sub 
End Class 

回答

3

你不是消除了checkWin子的If聲明未使用的按鈕。您還應該使用短路比較來避免不必要的處理。所以,第一個If聲明是這樣的:

If Not Button1.Enabled AndAlso Not Button2.Enabled AndAlso Not Button3.Enabled AndAlso _ 
      (Button1.Text = Button2.Text) AndAlso (Button2.Text = Button3.Text) Then 
    ... 
ElseIf Not Button4.Enabled ... 'etc. 

哦,在你的按鈕單擊事件所有這些If塊是不必要的。只需使用發件人的對象,像這樣:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _ 
    Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, 
      Button6.Click, Button7.Click, Button8.Click, Button9.Click 
    sender.Text = If(clickCount Mod 2 = 0, "X", "O") 
    sender.Enabled = False 
    clickCount += 1 
    CheckWin() 
End Sub 

編輯(在意見中的要求)
爲了避免CheckWin次重複比較代碼,所以你可以使用的工作的功能。這樣比較代碼只寫入一次,因此不太容易出錯並且更容易閱讀。這樣的事情是我會做什麼:

Private Sub CheckWin() 
    If LineWins(Button1, Button2, Button3) OrElse _ 
     LineWins(Button4, Button5, Button6) OrElse _ 
     LineWins(Button7, Button8, Button9) OrElse _ 
     LineWins(Button1, Button4, Button7) OrElse _ 
     LineWins(Button2, Button5, Button8) OrElse _ 
     LineWins(Button3, Button6, Button9) OrElse _ 
     LineWins(Button1, Button5, Button9) OrElse _ 
     LineWins(Button3, Button5, Button7) Then ResetGame() 
End Sub 

Private Function LineWins(b1 As Button, b2 As Button, b3 As Button) As Boolean 
    LineWins = CBool(Not b1.Enabled AndAlso Not b2.Enabled AndAlso Not b3.Enabled _ 
       AndAlso (b1.Text = b2.Text) AndAlso (b2.Text = b3.Text)) 
    If LineWins Then MessageBox.Show(b1.Text & " wins") 
End Function 

順便說一句,你可能會注意到我已經改名爲「復位」到「ResetGame」 - 我建議你也這麼做Reset已經被分配給一個.NET FileSystem方法。

+0

非常好!只是從來沒有使用面向對象,所以會嘗試逐步學習它。此外checkwin()可以簡單地稱爲了你編寫,所以Y並VB有明確的關鍵字'Calls' – kushalvm 2012-07-25 19:41:52

+0

我有幾個疑問1.可我用'和',而不是'AndAlso' 2.凡正是我們短路的comparisions ? – kushalvm 2012-07-25 19:47:34

+0

@kushal'AndAlso'和'OrElse'是短路運營商,因爲不像'和'和'或'他們不評價語句的後續部分,如果電流比較結果爲'True.' – Antagony 2012-07-25 19:51:35