2013-11-15 110 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 

所以我尝试让俄罗斯方块游戏Excel和我的“moveleft”功能不工作正常,当我按下左2或3次很快就跳过检查是否有与值的单元格2(全细胞),并通过全细胞。有什么建议么?使得俄罗斯方块

+1

'j'的价值是什么?如果您要使用外部变量,我建议您将变量作为参数传递。如果不是,则给它一个初始值。另外,不要使用'GoTo end',你可以使用'Exit Sub'并移除'end'标签。 –

+0

j和我是一个全局变量,他们描述了4x4图形阵列的第一个单元格的“地址” –

回答

3

首先,我建议探测一下代码,看看你跳出命令的位置。例如,在您的第一个if命令内部的debug.print "j<3"会告诉您这是代码的退出位置。在不同的地方放置一条不同的线路,并观察您的直接窗口以查看正在处理的内容。您可能还想打印出您的全局变量,以确保它们是预期的。

其次,不要使用end作为goto点,因为end是VBA中的关键字。我把它改成endleft

如果速度是一个问题,那么以下两点可能会帮助:

第三,由于j内不会改变for循环,外面拉。这是你在每个循环内进行的少一点评估。

第四,把你的另外两个如果合在一起并且使用逻辑AND。现在,当第一个条件为假时,您在每个循环中做一个更少的评估。


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多人俄罗斯方块游戏循环重绘速率](https ://codereview.stackexchange.com/questions/184727/excel-vba-multiplayer-tetris-game-loop-repaint-rate)。这是我的工作簿的下载链接:[Multiplayer Tetris 2.0](https://drive.google.com/open?id=1ENKZPoI6yq2NRQLCdv0ykEKvHTgJctZC)。 – 2018-01-10 07:49:53

+0

@ThomasInzina - 看起来非常棒!工作很好。 –