2015-12-18 82 views
0

因此,我正在學習visual basic,並且試圖製作一個移動橢圓形的計時器,並檢查是否觸及任何其他橢圓形,它會將一個整數。所以我有這個代碼,這有效,但我想知道如果我可以縮短它。如果你可以解釋你的代碼,因爲我很新,這將是偉大的!提前致謝!如何檢查橢圓形是否觸及任何其他橢圓形VB

Private Sub Timer4_Tick(sender As System.Object, e As System.EventArgs) Handles Timer4.Tick, Timer4.Tick 
    Dim Pos As Integer 
    If bb.Bounds.IntersectsWith(OvalShape1.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape2.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape3.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape4.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape5.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape6.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape7.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape8.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape9.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape10.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape11.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape12.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape13.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape14.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape15.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape16.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape17.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape18.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape19.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape20.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape21.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape22.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape23.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape24.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape25.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    If bb.Bounds.IntersectsWith(OvalShape26.Bounds) Then 
     Pos = -20 
    Else 
     Pos = 20 
    End If 
    bb.Top -= Pos 
End Sub 
+0

縮短它的一種可能的方法是將所有的OvalShapes放入數組或List中並使用循環。 –

+0

編程提示:*從不*複製和粘貼代碼。把它放在一個函數或變量中。 – buffjape

回答

1

你應該重構重碼出到一個方法,併爲您的常量,以便更好地解釋他們的意思是:

Shared Function GetIntersection(Shape first, Shape second) 
    Const IntersectionValue = -20 
    Const NonIntersectionValue = 20 

    If first.Bounds.IntersectsWith(second.Bounds) Then 
     return IntersectionValue 
    Else 
     return NonIntersectionValue 
    End If 
End Function 

然後你會這樣稱呼它:

Dim Pos As Integer = GetIntersection(bb, OvalShape1) 

這是良好軟件設計的重要原則之一:Don't Repeat Yourself (D.R.Y)

儘管你的代碼存在問題 - 不管你是按照你的方式還是按照我的建議,你都不會對值做任何事情 - 你用每個值覆蓋值隨後的操作。例如:

If bb.Bounds.IntersectsWith(OvalShape1.Bounds) Then 
    Pos = -20 
Else 
    Pos = 20 
End If 

' you should at least do something with `Pos` assigned in the 
' above if-else block before you overwrite it with the following if-else: 

If bb.Bounds.IntersectsWith(OvalShape2.Bounds) Then 
    Pos = -20 
Else 
    Pos = 20 
End If 

事情是這樣的,但是,它只是以往任何時候都採取價值的Pos最後的if-else塊

If bb.Bounds.IntersectsWith(OvalShape26.Bounds) Then '... 

,那麼什麼是點在它之前的其他塊?它們只是浪費在頭頂上。

+0

我意識到這一點,就在我問完這個問題時,它會被覆蓋,你有什麼想法做到這一點嗎? – gomilksolgo

+0

數組呢? – charliefox2

+0

什麼是數組?對不起,我真的很新。 – gomilksolgo