2013-11-15 112 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 - 看起來非常棒!工作很好。 –