2013-11-15 4 views
0
Sub left() 

Dim m As Integer 
Dim n As Integer 
For m = 0 To 3 
    For n = 0 To 3 
    If j < 3 Then 
     GoTo end 
    End If 
    If board(m + i - 1, n + j) = 1 Then 
     If board(i + m - 1, j + n - 1) = 2 Then 
     GoTo end 
     End If 
    End If 
    Next n 
Next m 
j = j - 1 
end: 
End Sub 

так что им пытаются сделать тетрис игру на первенствует и мой «moveleft» функция не работает правильно, когда я нажимаю влево 2 или 3 раза очень быстро он пропускает проверку, если есть ячейка со значением из 2 (полная ячейка) и проходит через полные ячейки. какие-либо предложения?делает тетрис в УВА

+1

Какова ценность 'j'? Я рекомендую передать переменную в качестве аргумента, если вы собираетесь использовать переменные извне. Если нет, поместите ему начальное значение. Кроме того, вместо использования 'GoTo end' вы можете использовать' Exit Sub' и удалить метку 'end'. –

+0

j и i - глобальные переменные, и они описывают «адрес» первой ячейки массива цифр 4x4. –

ответ

3

Во-первых, я рекомендую проверить код, чтобы увидеть, где вы прыгаете из команды. Например, debug.print "j<3" в вашей первой команде if скажет вам, откуда это происходит. Поместите другую строку в несколько точек и посмотрите свое ближайшее окно, чтобы увидеть, что обрабатывается. Возможно, вы захотите распечатать свои глобальные переменные, чтобы убедиться, что они предназначены.

Во-вторых, не используйте end как точка перехода с end - это ключевое слово в VBA. Я изменил его endleft

Если скорость является проблемой, то следующие две точки могут помочь:

В-третьих, поскольку j не меняется внутри для петель, вытащить его наружу. Это один из немногих, что вы делаете в каждом цикле.

В-четвертых, положите ваши два других, если вместе, и используйте логический AND. Теперь вы делаете один менее eval в каждом цикле, когда первое условие ложно.


Sub left() 
    Dim m As Integer 
    Dim n As Integer 
    If Not (j < 3) Then 
    For m = 0 To 3 
     For n = 0 To 3 
     If ((board(m + i - 1, n + j) = 1) And (board(i + m - 1, j + n - 1) = 2)) Then 
      GoTo endleft 
     End If 
     Next n 
    Next m 
    j = j - 1 
    End If 
endleft: 
End Sub 

В-пятых, прохладный проект. Вы поделитесь им, когда закончите?

+0

. Вы можете быть заинтересованы в моей игре в тетрисе, которую я только что опубликовал на CodeReview: [Excel VBA Multiplayer Tetris Game Loop Repaint Rate] (https : //codereview.stackexchange.com/questions/184727/excel-vba-multiplayer-tetris-game-loop-repaint-rate). Вот ссылка для загрузки моей книги: [Многопользовательский тетрис 2.0] (https://drive.google.com/open?id=1ENKZPoI6yq2NRQLCdv0ykEKvHTgJctZC). –

+0

@ ТомасИнзина - Выглядит очень хорошо! Хорошая работа. –

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