您当前的张贴代码不需要外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