我试图在Connect 4中垂直和水平检查获胜者。当您单击更改标签颜色的按钮时,我有一个7,6的游戏板。标签是二维数组。我创建的循环是为了让每次点击按钮时都能看到赢家,但是不起作用。
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 :(得分: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
循环的优点是,一旦找到连接四,就可以退出循环(我喜欢效率,即使这仍然是低效的。)
例如,假设标准的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
小于或等于5,外部currentRow
循环就会运行。
内循环(因为我们现在正在查看特定行)首先将当前列重置为0,并将连接计数重置为0.
在内循环期间,检查每列。如果它与tag
匹配,则connectCount
会增加1.如果它不是,则connectCount
将重置为0. currentCol
增加1内循环每次迭代的结束。
当内循环结束时(找到连接4或者我们已经到达当前行的末尾)然后我们检查connectCount
的值,如果它是4然后我们将connectFour
设置为True
,这将结束外部操作。
与原始代码(已修改)没有太大区别,但如果在早期找到连接4,则不会检查每一行。