2015-05-12 76 views
-1

我試圖在連接4中垂直和水平地檢查獲勝者。當您單擊更改標籤顏色的按鈕時,我有一個7,6的遊戲板。標籤是2維數組。我創建的循環讓每次點擊按鈕時看看是否有勝者,這是行不通的。連接四個贏家

Dim board(7,6) as integer 

Dim Labelboard as (7,6) as label 

Labelboard(0,0) = L00 'I have 41 others 

For i as integer = 0 to 3 
    For k as integer = 0 to 3 
     If pturn =1 then tag= "p1" 
      'Horizontal Win 
      For i As Integer = 0 To 3 
       For k As Integer = 0 To 6 
        If Labelboard(i, k).Tag.ToString = "p1" AndAlso 
         Labelboard(i + 1, k).Tag.ToString = "p1" AndAlso 
         Labelboard(i + 2, k).Tag.ToString = "p1" AndAlso 
         Labelboard(i + 3, k).Tag.ToString = "p1" Then 
         MsgBox("Game Over Player 1 Wins.") 
        End If 
       Next 
      Next 
+0

@JohnSaunders - 我看了編輯歷史,是的,它原來是兩次。所以'對於k' - 這意味着外循環只會執行一次。 – Tim

+0

把這些事情弄清楚的一個很好的方法是在第一個外環出一個斷點,按F5,然後逐步執行代碼。您應該快速查看代碼中哪裏出錯。 – Tim

+0

我投票結束這個問題作爲題外話,因爲「不起作用」不是一個有用的問題陳述。 – paxdiablo

回答

0

您當前的張貼代碼不需要外For循環,你會得到一個索引出界For k As Integer = 0 To 6,因爲有6只在維度中的元素 - LabelBoard(7, 6)。它應該是For k As Integer = 0 To 5

考慮到這些變化,下面的代碼(未測試)應該做的伎倆:

If pturn = 1 Then tag = "p1" 
For i As Integer = 0 To 3 
    For k As Integer = 0 To 5 
     If LabelBoard(i, k).Tag.ToString() = tag AndAlso 
     LabelBoard(i + 1, k).Tag.ToString() = tag AndAlso 
     LableBoard(i + 2, k).Tag.ToString() = tag AndAlso 
     LabelBoard(i + 3, k).Tag.ToString() = tag Then 
      MsgBox("Game Over Player 1 Wins.") 
     End If 
    Next 
Next 

然而,這是一個非常暴力的方式來做到這一點,而你不下垂,遊戲結束,只是顯示一個消息框。另一種方法是使用幾個While循環(還有其他方法)。 While循環的優點是,一旦找到連接4,就可以退出循環(我喜歡效率,儘管這仍然是低效的)。

例如,假設標準的6行,第7列,你可以做這樣的事情:

Dim currentRow As Integer = 0 
Dim currentCol As Integer = 0 
Dim connectFour As Boolean = False 
Dim connectCount As Integer = 0 

If pturn = 1 Then tag = "p1" 

While Not connectFour And currentRow <= 5 
    currentCol = 0 
    connectCount = 0 
    While Not connectCount = 4 And currentCol <= 6 
     If labelBoard(currentCol, currentRow).Tag.ToString() = tag Then 
      connectCount = connectCount + 1 
     Else 
      connectCount = 0 
     End If 
     currentCol = currentCol + 1 
    End While 
    If connectCount = 4 Then 
     connectFour = True 
    Else 
     currentRow = currentRow + 1 
End While 

上面僅設置四個局部變量,一個是currentRow,一個用於currentColumn,一個用於連接標籤的數量以及是否找到連接四的標誌。

While迴路將運行只要connectFourFalsecurrentRow小於或等於5。

內環(因爲我們現在尋找一個特定行)第一復位當前列爲0並且連接計數爲0.

在內部循環期間,檢查每列。如果它匹配tag,那麼connectCount增加1.如果不匹配,則connectCount重置爲0. currentCol在內部循環的每次迭代結束時增加1。

當內循環結束後(無論是連接4個被發現或者我們已經達到當前行結束),那麼我們檢查connectCount值,如果是4,然後我們設置connectFourTrue,這將結束外部循環。

與原始代碼(已修改)沒有太大區別,但它不會檢查每行是否早期發現連接4。