您當前的張貼代碼不需要外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
迴路將運行只要connectFour
是False
和currentRow
小於或等於5。
內環(因爲我們現在尋找一個特定行)第一復位當前列爲0並且連接計數爲0.
在內部循環期間,檢查每列。如果它匹配tag
,那麼connectCount
增加1.如果不匹配,則connectCount
重置爲0. currentCol
在內部循環的每次迭代結束時增加1。
當內循環結束後(無論是連接4個被發現或者我們已經達到當前行結束),那麼我們檢查connectCount
值,如果是4,然後我們設置connectFour
到True
,這將結束外部循環。
與原始代碼(已修改)沒有太大區別,但它不會檢查每行是否早期發現連接4。
來源
2015-05-12 05:51:48
Tim
@JohnSaunders - 我看了編輯歷史,是的,它原來是兩次。所以'對於k' - 這意味着外循環只會執行一次。 – Tim
把這些事情弄清楚的一個很好的方法是在第一個外環出一個斷點,按F5,然後逐步執行代碼。您應該快速查看代碼中哪裏出錯。 – Tim
我投票結束這個問題作爲題外話,因爲「不起作用」不是一個有用的問題陳述。 – paxdiablo