2015-05-26 2 views
0

Я создаю подключить четыре игры, и у меня возникают проблемы с горизонтальной петлей. Цикл ниже работает, и для вертикальной победы. У меня есть две метки для каждой строки и две метки для каждого столбца для синего цвета и один для красного цвета. Когда я добавляю в свои другие ярлыки, я не могу найти, где я делаю шаг-1, чтобы сменить метки и перейти вверх со следующей меткой. Я также попробовал добавить целый новый цикл ниже, который был выделен только для горизонтальных выигрышей.Connect Four Горизонтальный победитель

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 
+2

Вы понимаете, _why_ работает существующий код? Горизонтальный цикл мог работать так же, как и цикл в столбцах/строках в обратном порядке. –

+0

@DStanley Я понимаю, как работает существующий код. Однако горизонтальный цикл я не понимаю, потому что каждый раз, когда я нажимаю кнопку, он должен двигаться вверх до следующей метки. – Jason

ответ

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 
+0

Я забыл, что вы на самом деле не попросили диагональных побед. Если вы не хотите их разрешать, измените 'If v = 1 Или h = 1 Then' to' If v + h = 1 Then' – Josh

Смежные вопросы