连接四个水平冠军

时间:2015-05-26 13:00:22

标签: vb.net

我创建了一个连接四游戏,我在水平循环方面遇到了一些麻烦。下面的循环起作用,它可以获得垂直胜利。我每行有两个标签,每列有两个标签,一个用于蓝色,一个用于红色。当我添加其他标签时,我似乎无法找到我采取步骤1的位置,以便更改标签并向上移动下一个标签。我还尝试在下面添加一个专门用于水平奖金的全新循环。

    For i = 5 To 0 Step -1`
        If board(i, 0) = 0 Then
            board(i, 0) = pturn
            If pturn = 1 Then
                Labelboard(i, 0).BackColor = Color.Red
                CounterB = 0
                lblcounterBlue.Text = "Matches = " & CounterB

                CounterR = CounterR + 1
                lblCounterRed.Text = "Matches = " & CounterR


            ElseIf pturn = 2 Then
                Labelboard(i, 0).BackColor = Color.Blue
                CounterR = 0
                lblCounterRed.Text = "Matches = " & CounterR

                CounterB = CounterB + 1
                lblcounterBlue.Text = "Matches = " & CounterB

            End If

            pturn = pturn + 1

            If pturn = 3 Then pturn = 1
            If CounterR = 4 Then
                MsgBox("Game Over")
            End If
            If CounterB = 4 Then
                MsgBox("Game Over")
            End If

            Exit Sub
        End If
    Next

1 个答案:

答案 0 :(得分:0)

我不太了解您的设置,但希望这会让您足够接近让您的工作正常进行。我不得不做一些假设,但每次我必须使代码更易读,更容易适应你已经写好的内容时,我试图声明一个常量。

我写的是一个功能,让你知道特定空间是否是连胜的一部分。假设board()是公开的。如果pturn也是公开的,只要你在每个回合中调用它,你就可以使它更高效,如评论中所述。如果您知道最后一个空间是哪个空间,您可以通过仅调用该空间的函数来最大化效率(假设您在每个玩家转弯结束时调用它)。如果你不知道最后播放了哪个空格,你可以遍历board()中的每个空格并测试每个空格。

Function winner(rowNum As Integer, colNum As Integer) As Integer
'Returns 0 if space does not create a win, or the winning player number if it does
'Change to winner(...) As Boolean <--To only test current player

    Dim minRow As Integer = LBound(board, 0)
    Dim maxRow As Integer = UBound(board, 0)
    Dim minColumn As Integer = LBound(board, 1)
    Dim maxColumn As Integer = UBound(board, 1)

    'These are the values I assume are in board()
    '(I don't actually use them in the code)
    Const emptySpace As Integer = 0
    Const red As Integer = 1
    Const blue As Integer = 2

    Dim player As Integer
    Dim streak As Integer
    Dim r As Integer, c As Integer 'loop placeholders
    Dim v As Integer, h As Integer 'control search direction

    For v = 0 To 1
        For h = -1 To 1
            If v = 1 Or h = 1 Then
            'These loops and test check each direction (vertical, horizontal and
            'both diagonals) for a win exactly once.

                player = board(rowNum, colNum)
                If player > 0 Then 'If player = pturn  <-- to only check current player
                    streak = 1

                    'check positive direction
                    r = rowNum + h
                    c = colNum + v
                    Do While r >= minRow And r <= maxRow And c >= minColumn And c <= maxColumn
                        If board(r, c) = player Then
                            streak = streak + 1
                            If streak = 4 Then
                                Return player 'True <--If testing only current player
                            Else
                                r = r + h
                                c = c + v
                            End If
                        Else
                            Exit Do
                        End If
                    Loop

                    'check negative direction
                    r = rowNum - h
                    c = colNum - v
                    Do While r >= minRow And r <= maxRow And c >= minColumn And c <= maxColumn
                        If board(r, c) = player Then
                            streak = streak + 1
                            If streak = 4 Then
                                Return player 'True <--If testing only current player
                            Else
                                r = r - h
                                c = c - v
                            End If
                        Else
                            Exit Do
                        End If
                    Loop
                End If
            End If
        Next h
    Next v

    Return 0 'Function has completed and no winner was found
    'Return False <-- If only testing current player
End Function