连接四名获胜者

时间:2015-05-12 02:32:19

标签: vb.net

我试图在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

1 个答案:

答案 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,一个用于连接标签的计数,以及一个用于是否找到连接四的标志。

只要WhileconnectFourFalse小于或等于5,外部currentRow循环就会运行。

内循环(因为我们现在正在查看特定行)首先将当前列重置为0,并将连接计数重置为0.

在内循环期间,检查每列。如果它与tag匹配,则connectCount会增加1.如果它不是,则connectCount将重置为0. currentCol增加1内循环每次迭代的结束。

当内循环结束时(找到连接4或者我们已经到达当前行的末尾)然后我们检查connectCount的值,如果它是4然后我们将connectFour设置为True,这将结束外部操作。

与原始代码(已修改)没有太大区别,但如果在早期找到连接4,则不会检查每一行。