2015-05-12 41 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。