Я не совсем понимаю вашу установку, но, надеюсь, это позволит вам приблизиться к вам, чтобы вы могли работать. Мне нужно сделать несколько предположений, но я пытался декларировать константу каждый раз, когда мне нужно сделать код более понятным и легким для вас, чтобы адаптироваться к тому, что вы уже написали.
Что я написал, это функция, которая позволяет вам узнать, является ли конкретное пространство частью выигрышной полосы. Предполагается, что 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
Вы понимаете, _why_ работает существующий код? Горизонтальный цикл мог работать так же, как и цикл в столбцах/строках в обратном порядке. –
@DStanley Я понимаю, как работает существующий код. Однако горизонтальный цикл я не понимаю, потому что каждый раз, когда я нажимаю кнопку, он должен двигаться вверх до следующей метки. – Jason