Spiel tetris

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Bin gerade dabei ein Spiel " Tetris" zu Programmieren.

    Den grundstein habe Ich aus einen Buch und jetzt möchte ich es für meine Bedürfnise änder.

    Kann leider nur drei gleiche Panel(Steine) entfernen, möchte aber fünf gleiche entfernen können, als besondere Zusatz von Punkten.

    Diese ist der Code, der die Steine entfernen soll, wenn es fünf gleiche sind:

    (Meine Idee)

    VB.NET-Quellcode

    1. If F(Z, S) <> Leer And
    2. F(Z, S + 1) <> Leer And
    3. F(Z, S - 1) <> Leer And
    4. F(Z, S - 2) <> Leer Then
    5. If PL(F(Z, S)).BackColor = PL(F(Z, S + 1)).BackColor And
    6. PL(F(Z, S)).Backcolor = PL(F(Z, S + 2)).BackColor And
    7. PL(F(Z, S)).BackColor = PL(F(Z, S - 1)).BackColor And
    8. PL(F(Z, S)).BackColor = PL(F(Z, S - 2)).BackColor Then
    9. For SX = S To S + 2
    10. Controls.Remove(PL(F(Z, SX)))
    11. F(Z, SX) = Leer
    12. ZX = Z - 1Do While F(ZX, SX) <> Leer
    13. PL(F(ZX, SX)).Top = PL(F(ZX, SX)).Top + 20
    14. F(ZX + 1, SX) = F(ZX, SX)
    15. F(ZX, SX) = Leer
    16. ZX = ZX - 1
    17. Loop
    18. Next
    19. '##########
    20. For SX = S To S - 2
    21. Controls.Remove(PL(F(Z, SX)))
    22. F(Z, SX) = Leer
    23. ZX = Z + 1Do While F(ZX, SX) <> Leer
    24. PL(F(ZX, SX)).Top = PL(F(ZX, SX)).Top - 20
    25. F(ZX - 1, SX) = F(ZX, SX)
    26. F(ZX, SX) = Leer
    27. ZX = ZX + 1
    28. Loop
    29. Next
    30. NebenPrfen = True
    31. End If
    32. End If




    kann mir jemand sagen wo da mein fehler ist, als Meldung bekomme ich immer "Auserhalb des defnierten Bereich"


    der orginal Code für drei Steine geht so:

    VB.NET-Quellcode

    1. If F(Z, S) <> Leer And
    2. F(Z, S + 1) <> Leer Then
    3. If PL(F(Z, S)).BackColor = PL(F(Z, S + 1)).BackColor And
    4. PL(F(Z, S)).Backcolor = PL(F(Z, S + 2)).BackColor Then
    5. For SX = S To S + 2
    6. Controls.Remove(PL(F(Z, SX)))
    7. F(Z, SX) = Leer
    8. ZX = Z - 1Do While F(ZX, SX) <> Leer
    9. PL(F(ZX, SX)).Top = PL(F(ZX, SX)).Top + 20
    10. F(ZX + 1, SX) = F(ZX, SX)
    11. F(ZX, SX) = Leer
    12. ZX = ZX - 1
    13. Loop
    14. Next
    15. 'NebenPruefen = True
    16. End If
    17. End If



    code dazu

    VB.NET-Quellcode

    1. ' index des aktuellen Panel
    2. Dim PX As Integer
    3. ' Spielfeld
    4. Dim F(14, 9) As Integer
    5. ' Zeile
    6. Dim PZ As Integer
    7. ' Spalte
    8. Dim PS As Integer
    9. 'Level/Punkte/Steine
    10. Dim Level As Integer
    11. Dim punkte As Integer
    12. Dim Steine As Integer
    13. ' Farbenliste
    14. Dim FarbenFeld() As Color = {Color.Red, Color.Blue, Color.Yellow,
    15. Color.Pink, Color.Green, Color.Magenta, Color.Brown, Color.Black}
    16. ' Konstanten fuer Feldpunkte
    17. Const Rand = -2
    18. Const Leer = -1
    19. ' leere liste von Spiel-Panels
    20. Dim PL As New ArrayList

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Susi“ ()

    Ich würde erstmal anfangen, den Code sinnvoll aufzuhübschen, indem du klarer strukturierst zb durch eigene Funktionen. Ich verstehe auch nicht, warum du eine Liste brauchst und gleichzeitig direkt die Farben der Controls abfragst. Warum wird diese Info nicht gleich in der Liste gespeichert? Und warum eine ArrayList und kein simples Array? Das Spielfeld selbst ist doch komplett statisch ...

    Im übrigen ist es hilfreich, wenn man nicht nur den Fehler kennt, sondern auch in welcher Zeile er auftritt und welche Werte die betroffenen Variablen zu diesem Zeitpunkt haben.
    Die farben werden bei der erstellung eines neues Panel per zufall ausgewählt

    VB.NET-Quellcode

    1. Private Sub NaechstesPanel()
    2. Dim Farbe As IntegerDim p As New Panel
    3. ' Panel zur liste hinzufgen
    4. PL.Add(p)
    5. ' Position und grӇep.Location = New Point(220, 80)
    6. p.Size = New Point(20, 20)
    7. ' Farbe per zufallesgenerator gewaehlt
    8. Farbe = Math.Floor(Rnd() * 8)
    9. p.BackColor = FarbenFeld(Farbe)
    10. ' Panel zeigen
    11. Controls.Add(p)
    12. ' Nummer
    13. PX = PL.Count - 1
    14. 'Aktuelle Zeile/Spalte
    15. PZ = 1
    16. PS = 4End Sub

    Hat jemand noch andere Idee

    Bis jetzt habe ich es schon soweit hinbekommen, das entweder vier oder drei gleiche Steine gelöscht.
    Hier mal der Kommplete Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' index des aktuellen Panel
    3. Dim PX As Integer
    4. ' Spielfeld
    5. Dim F(14, 9) As Integer
    6. ' Zeile
    7. Dim PZ As Integer
    8. ' Spalte
    9. Dim PS As Integer
    10. 'Level/Punkte/Steine
    11. Dim Level As Integer
    12. Dim punkte As Integer
    13. Dim Steine As Integer
    14. ' Farbenliste
    15. Dim FarbenFeld() As Color = {Color.Red, Color.Blue,
    16. Color.Yellow, Color.Pink,
    17. Color.Green, Color.Magenta,
    18. Color.Brown, Color.Black}
    19. ' Konstanten fuer Feldpunkte
    20. Const Rand = -2
    21. Const Leer = -1
    22. ' leere liste von Spiel-Panels
    23. Dim PL As New ArrayList
    24. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    25. timBewegung.Enabled = True
    26. End Sub
    27. Private Sub NaechstesPanel()
    28. Dim Farbe As Integer
    29. Dim p As New Panel
    30. ' Panel zur liste hinzufgen
    31. PL.Add(p)
    32. ' Position und groesse
    33. p.Location = New Point(160, 80)
    34. p.Size = New Point(20, 20)
    35. ' Farbe
    36. Farbe = Math.Floor(Rnd() * 8)
    37. p.BackColor = FarbenFeld(Farbe)
    38. ' Panel zeigen
    39. Controls.Add(p)
    40. ' Nummer
    41. PX = PL.Count - 1
    42. 'Aktuelle Zeile/Spalte
    43. PZ = 1
    44. PS = 1
    45. End Sub
    46. Private Sub AllePruefen()
    47. Dim Z, S As Integer
    48. Dim Neben, šber As Boolean
    49. Neben = False
    50. šber = False
    51. 'Drei gleiche Panels nebeneinander?
    52. For Z = 13 To 1 Step -1
    53. For S = 1 To 6
    54. Neben = NebenPruefen(Z, S)
    55. If Neben Then
    56. Exit For
    57. Next S
    58. If Neben Then
    59. Exit For
    60. Next
    61. 'Drei gleiche Panels uebereinander?
    62. For Z = 13 To 3 Step -1
    63. For S = 1 To 8
    64. ueber = šberPruefen(Z, S)
    65. If ueber Then
    66. Exit For
    67. Next S
    68. If ueber Then
    69. Exit For
    70. Next
    71. If Neben Or ueber Then
    72. AllePruefen()
    73. End If
    74. End Sub
    75. Private Function NebenPruefen(ByVal Z As Integer, ByVal S As Integer) As Boolean
    76. Dim ZX, SX As Integer
    77. NebenPruefen = False
    78. 'Vier gleiche
    79. If S = 6 Then
    80. If F(Z, S) <> Leer And
    81. F(Z, S - 1) <> Leer And F(Z, S - 2) <> Leer And F(Z, S - 3) <> Leer Then
    82. If PL(F(Z, S)).BackColor = PL(F(Z, S - 1)).BackColor And PL(F(Z, S)).BackColor = PL(F(Z, S - 2)).BackColor And PL(F(Z, S)).BackColor = PL(F(Z, S - 3)).BackColor ThenFor SX = S To S + 3
    83. Controls.Remove(PL(F(Z, SX)))
    84. F(Z, SX) = Leer
    85. Steine = Steine + 1
    86. If Steine = 50 * Level Then
    87. Level = Level + 1
    88. timT.Interval = 5000 / (Level + 9)
    89. timT.Enabled = FalseMessageBox.Show("Sie sind im level " & Level, "Neues Level", MessageBoxButtons.OK, MessageBoxIcon.Information)
    90. End If
    91. ZX = Z - 1Do While F(ZX, SX) <> Leer
    92. PL(F(ZX, SX)).Top = PL(F(ZX, SX)).Top + 20
    93. F(ZX + 1, SX) = F(ZX, SX)
    94. F(ZX, SX) = Leer
    95. ZX = ZX - 1
    96. Loop
    97. Next
    98. punkte = punkte + 50
    99. NebenPrfen = True
    100. End If
    101. End If
    102. Else
    103. If F(Z, S) <> Leer And F(Z, S + 1) <> Leer And F(Z, S + 2) <> Leer And F(Z, S + 3) <> Leer Then
    104. If PL(F(Z, S)).BackColor = PL(F(Z, S + 1)).BackColor And PL(F(Z, S)).BackColor = PL(F(Z, S + 2)).BackColor And PL(F(Z, S)).BackColor = PL(F(Z, S + 3)).BackColor ThenFor SX = S To S + 3
    105. Controls.Remove(PL(F(Z, SX)))
    106. F(Z, SX) = Leer
    107. Steine = Steine + 1
    108. If Steine = 50 * Level Then
    109. Level = Level + 1
    110. timT.Interval = 500 + (Level * 100)
    111. timT.Enabled = FalseMessageBox.Show("Sie sind im level " & Level)
    112. End If
    113. ZX = Z - 1Do While F(ZX, SX) <> Leer
    114. PL(F(ZX, SX)).Top = PL(F(ZX, SX)).Top + 20
    115. F(ZX + 1, SX) = F(ZX, SX)
    116. F(ZX, SX) = Leer
    117. ZX = ZX - 1
    118. Loop
    119. Next
    120. punkte = punkte + 50
    121. NebenPrfen = True
    122. End If
    123. End If
    124. End If
    125. 'Drei kleiche
    126. If F(Z, S) <> Leer And F(Z, S + 1) <> Leer And F(Z, S + 2) <> Leer Then
    127. If PL(F(Z, S)).BackColor = PL(F(Z, S + 1)).BackColor And PL(F(Z, S)).BackColor = PL(F(Z, S + 2)).BackColor ThenFor SX = S To S + 2
    128. Controls.Remove(PL(F(Z, SX)))
    129. F(Z, SX) = Leer
    130. Steine = Steine + 1
    131. If Steine = 50 * Level Then
    132. Level = Level + 1
    133. timT.Interval = 5000 / (Level + 9)
    134. timT.Enabled = FalseMessageBox.Show("Sie sind im level " & Level)
    135. End If
    136. ZX = Z - 1Do While F(ZX, SX) <> Leer
    137. PL(F(ZX, SX)).Top = PL(F(ZX, SX)).Top + 20
    138. F(ZX + 1, SX) = F(ZX, SX)
    139. F(ZX, SX) = Leer
    140. ZX = ZX - 1
    141. Loop
    142. Next
    143. punkte = punkte + 20
    144. NebenPrfen = True
    145. End If
    146. End If
    147. tbSteine.Text = Steine
    148. tbPunkte.Text = punkte
    149. tblevel.Text = Level
    150. End Function
    151. Private Function šberPrfen(ByVal Z As Integer, ByVal S As Integer) As Boolean
    152. Dim ZX As Integer
    153. šberPrfen = False
    154. 'Vier gleiche
    155. If F(Z, S) <> Leer And F(Z - 1, S) <> Leer And F(Z - 2, S) <> Leer And F(Z - 3, S) <> Leer Then
    156. If PL(F(Z, S)).BackColor = PL(F(Z - 1, S)).BackColor And PL(F(Z, S)).BackColor = PL(F(Z - 2, S)).BackColor And PL(F(Z, S)).BackColor = PL(F(Z - 3, S)).BackColor ThenFor ZX = Z To Z - 3 Step -1
    157. Controls.Remove(PL(F(ZX, S)))
    158. F(ZX, S) = Leer
    159. Steine = Steine + 1
    160. If Steine = 50 * Level Then
    161. Level = Level + 1
    162. timT.Interval = 500 / (Level + 9)
    163. timT.Enabled = FalseMessageBox.Show("Sie sind im level " & Level)
    164. End If
    165. Next
    166. punkte = punkte + 50
    167. šberPrfen = True
    168. End If
    169. 'Drei kleiche
    170. ElseIf F(Z, S) <> Leer And F(Z - 1, S) <> Leer And F(Z - 2, S) <> Leer Then
    171. If PL(F(Z, S)).BackColor = PL(F(Z - 1, S)).BackColor And PL(F(Z, S)).BackColor = PL(F(Z - 2, S)).BackColor ThenFor ZX = Z To Z - 2 Step -1
    172. Controls.Remove(PL(F(ZX, S)))
    173. F(ZX, S) = Leer
    174. Steine = Steine + 1
    175. If Steine = 50 * Level Then
    176. Level = Level + 1
    177. timT.Interval = 500 / (Level + 9)
    178. timT.Enabled = FalseMessageBox.Show("Sie sind im level " & Level)
    179. End If
    180. Next
    181. punkte = punkte + 20
    182. šberPrfen = True
    183. End If
    184. End If
    185. tbSteine.Text = Steine
    186. tbPunkte.Text = punkte
    187. tblevel.Text = Level
    188. End FunctionPrivate Sub Links()
    189. If F(PZ, PS - 1) = Leer Then
    190. PL(PX).Left = PL(PX).Left - 20
    191. PS = PS - 1
    192. End If
    193. End SubPrivate Sub Rechts()
    194. If F(PZ, PS + 1) = Leer Then
    195. PL(PX).Left = PL(PX).Left + 20
    196. PS = PS + 1
    197. End If
    198. End SubPrivate Sub Unten()Do While F(PZ + 1, PS) = Leer
    199. PL(PX).Top = PL(PX).Top + 20
    200. PZ = PZ + 1
    201. Loop
    202. F(PZ, PS) = PX
    203. AllePrfen()
    204. N„chstesPanel()
    205. End SubPrivate Sub timT_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timT.Tick
    206. ' Fals es nicht weiter geht
    207. If F(PZ + 1, PS) <> Leer Then
    208. 'Oberste Zeile erreicht
    209. If PZ = 1 Then
    210. timT.Enabled = FalseMessageBox.Show("Spiel zu ende", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    211. Exit Sub
    212. End If
    213. F(PZ, PS) = PX
    214. AllePrfen()
    215. N„chstesPanel()
    216. Else
    217. PL(PX).Top = PL(PX).Top + 20
    218. PZ = PZ + 1
    219. End If
    220. End Sub
    221. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerPrivate Sub timBewegung_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timBewegung.Tick
    222. Dim r As Boolean
    223. Dim l As Boolean
    224. Dim u As Boolean
    225. Dim esc As Boolean
    226. Dim F2 As Boolean
    227. Dim F1 As Boolean
    228. r = GetAsyncKeyState(Keys.Right)
    229. l = GetAsyncKeyState(Keys.Left)
    230. u = GetAsyncKeyState(Keys.Space)
    231. esc = GetAsyncKeyState(Keys.Escape)
    232. F2 = GetAsyncKeyState(Keys.F2)
    233. F1 = GetAsyncKeyState(Keys.F1)
    234. If r = True Then
    235. Rechts()
    236. ElseIf esc = True ThenMe.Close()
    237. ElseIf l = True Then
    238. Links()
    239. ElseIf u = True Then
    240. Unten()
    241. ElseIf F2 = True Then
    242. timT.Enabled = False
    243. ElseIf F1 = True Then
    244. timT.Enabled = True
    245. End If
    246. End SubPrivate Sub timSpielzeit_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timSpielzeit.Tick
    247. Dim Start As Date = tbStartzeit.TextDim h As Integer = DateDiff(DateInterval.Hour, Start, TimeOfDay)
    248. Dim m As Integer = DateDiff(DateInterval.Minute, Start, TimeOfDay)Dim s As Integer = DateDiff(DateInterval.Second, Start, TimeOfDay)
    249. If s >= 60 Then
    250. s = s - (m * 60)
    251. ElseIf m >= 60 Then
    252. s = s - (m * 60)
    253. m = m - (h * 60)
    254. End If
    255. tbspielzeitS.Text = s
    256. tbspielzeitM.Text = m
    257. tbspielzeitH.Text = h
    258. tbaktuelleZeit.Text = TimeOfDay
    259. End SubPrivate Sub StartenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartenToolStripMenuItem.Click
    260. Dim Z, S As Integer
    261. ' Farbenwahl
    262. Randomize()
    263. ' Feld besetzenFor Z = 1 To 13
    264. F(Z, 0) = RandFor S = 1 To 8
    265. F(Z, S) = LeerNext S
    266. F(Z, 9) = RandNext ZFor S = 0 To 9
    267. F(14, S) = Rand
    268. Next
    269. 'Spielstarten
    270. Level = 1
    271. N„chstesPanel()
    272. timT.Enabled = True
    273. tbStartzeit.Text = TimeOfDay
    274. timSpielzeit.Enabled = True
    275. '########
    276. tblevel.Text = Level
    277. tbPunkte.Text = 0End Sub
    278. End Class





    Nun bis jetzt läuft es supper, aber hat jemand noch idee was man verbessern könnte

    Susi schrieb:

    aber hat jemand noch idee was man verbessern könnte

    Du könntest auf (Beitrag) "bearbeiten" gehen, den VB Code löschen, dann den Editor auf "Quellcode" umschalten und dann den VB Code nochmal einfügen. Das würde die Lesbarkeit des Codes schon mal um rund 431% verbessern ... (andernfalls führt das Lesen des Codes leicht zu Bindehautentzündungen)

    GMT schrieb:

    Und noch was ein :

    Da der Code aus dem Galileobuch übelster Schrott ist, würde ich den erstmal "schön" machen, bevor ich anfange "features" einzubauen.

    Randomize() ? Würg!

    VB.NET-Quellcode

    1. ' Feld besetzen
    2. For Z = 1 To 13
    3. F(Z, 0) = Rand
    4. For S = 1 To 8
    5. F(Z, S) = Leer
    6. Next S
    7. F(Z, 9) = Rand
    8. Next Z

    A B C die Katze lief im Schnee?

    Wenn schon nur Buchstaben, dann aber bitte "x" für die "Spalte" und "y" für die "Zeile". Aber auch mit "Spalte" und "Zeile" bricht man sich nix ab.
    F(,) ? -> Feld(,) !
    Rand? Random.Next(Von_inkl, Bis_exkl) !

    Ich muss dem Erfinder des Rades zustimmen: Das Buch ist K*cke ;)
    Hallo,

    zuerst möchte ich sagen, dass ich ein absoluter Anfänger bin und eigentlich nichts kann...
    Ich hab mit einem Kumpel ein Tetris light Programm geschrieben jedoch kommen wir nicht drauf, wie wir die steine löschen.
    Ziel ist es 3 gleiche steine übereinander zu löschen.
    Bitte um HILFE !!!!

    Hier unser Programm:

    Public Class Form1
    Public brickCount As Integer = 0
    Public aHi As Integer = 0 'aktuelle Höhe
    Public aBrick As Object 'aktueller stein
    Public rowH(14) As Integer
    Public bCheck As Boolean = False
    Public labar() As Label
    Dim ueber As Boolean


    Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Left Then
    If aBrick.Left > 0 Then
    aBrick.Left = aBrick.Left - 25
    End If
    ElseIf e.KeyCode = Keys.Right Then
    If aBrick.Left < Me.Width - aBrick.Width Then
    aBrick.Left = aBrick.Left + 25
    End If
    End If
    End Sub

    Function CheckLoose(ByVal i As Integer) As Boolean 'game over
    If rowH(i) <= 0 Then
    MsgBox("Verloren")
    Return True
    Else
    Return False
    End If
    End Function

    Function SetHeight(ByVal sender As Object, ByVal rowI As Integer, ByVal lohi As Boolean) 'Höhe setzen
    If lohi = True Then
    rowH(rowI) = rowH(rowI) - sender.Height
    Else
    If rowH(rowI) <> Me.Height Then
    rowH(rowI) = rowH(rowI) + sender.Height
    Else
    rowH(rowI) = 0
    End If
    End If

    End Function

    Function GetRandom() As Integer 'zufall
    Randomize()
    Dim upperbound As Integer = 3
    Dim lowerbound As Integer = 1
    Return CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd())) + lowerbound
    End Function

    Function DoAnimation(ByVal obj As Object) 'runter fallen
    obj.Top = obj.Top + 5
    If rowH(GetRow(aBrick)) = 0 Then
    rowH(GetRow(aBrick)) = 550
    End If
    If obj.Top + obj.Height >= rowH(GetRow(aBrick)) Then
    Timer1.Stop()
    SetHeight(aBrick, GetRow(aBrick), True)
    If CheckLoose(GetRow(aBrick)) = True Then
    Timer1.Stop()
    bCheck = True
    Button1.Enabled = True
    Button1.Visible = True
    Else
    aBrick = GetBrick(GetRandom())
    Timer1.Start()
    End If
    End If
    End Function

    Function GetRow(ByVal obj As Object) As Integer 'reihen überprüfen
    Dim row As Integer
    Select Case obj.Left
    Case 0 To 24
    row = 1
    Case 25 To 49
    row = 2
    Case 50 To 74
    row = 3
    Case 75 To 99
    row = 4
    Case 100 To 124
    row = 5
    Case 125 To 149
    row = 6
    Case 150 To 174
    row = 7
    Case 175 To 199
    row = 8
    Case 200 To 224
    row = 9
    Case 225 To 249
    row = 10
    Case 250 To 274
    row = 11
    Case 275 To 299
    row = 12
    Case 300 To 324
    row = 13
    Case 325 To 350
    row = 14
    End Select
    Return row
    End Function

    Function GetBrick(ByVal i As Integer) As Object 'steine
    Dim newLabel As New Label
    If i = 1 Then
    newLabel.Size = New Size(25, 25)
    newLabel.BackColor = Color.Red
    ElseIf i = 2 Then
    newLabel.Size = New Size(25, 50)
    newLabel.BackColor = Color.Blue
    ElseIf i = 3 Then
    newLabel.Size = New Size(25, 75)
    newLabel.BackColor = Color.Green
    End If
    newLabel.Name = "brick" & brickCount
    newLabel.Location = New Drawing.Point(Me.Width / 2 - newLabel.Width, 0) 'me bezieht sich auf form1
    Array.Resize(labar, brickCount + 1)
    labar(brickCount) = newLabel
    brickCount = brickCount + 1 'das immer ein neuer kommt
    newLabel.BringToFront() 'sichtbar
    Me.Controls.Add(newLabel) 'zu form1 hinzufügen, spielfeld
    Return (newLabel)
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If bCheck = True Then
    sender.Text = "Spiel beenden"
    Application.Exit()
    Else
    aBrick = GetBrick(GetRandom())
    Timer1.Start()
    sender.Hide()
    sender.Enabled = False 'gleiche wie visible.false
    End If
    End Sub




    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    DoAnimation(aBrick)
    End Sub



    End Class
    Scheint mir sowieso der falsche Ansatz. Schnapp Dir GDI+ oder ne gescheite Engine (z. B. Sharpex2D oder GameUtils) und mach das dann.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    EDIT: Huch, der ist ja alt.

    EDIT2: Mist, jetzt habe ich alles gelöscht :( War doch aktuell.

    Also nochmal: statt Select Case für row:

    VB.NET-Quellcode

    1. row=obj.Left\25 +1 '\ ist eine Ganzzahldivision


    aBrick sollte ein Objekt der Klasse "Brick" sein, die du selbst schreibst, und die alle nötigen Methoden und Eigenschaften hat.

    Und den Code in VB-Tags einfügen (auf VB.NET klicken, rechts oben)
    Nö, hier gibt es gar keinen Code, nur Tipps. Wenn Du Code willst musst Du zum Marktplatz.
    Da der Thread 3 Jahre alt ist, #closerequest.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public brickCount As Integer = 0
    3. Public aHi As Integer = 0 'aktuelle Höhe
    4. Public aBrick As Object 'aktueller stein
    5. Public rowH(14) As Integer
    6. Public bCheck As Boolean = False
    7. Public labar() As Label
    8. Dim ueber As Boolean
    9. Public Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    10. If e.KeyCode = Keys.Left Then
    11. If aBrick.Left > 0 Then
    12. aBrick.Left = aBrick.Left - 25
    13. End If
    14. ElseIf e.KeyCode = Keys.Right Then
    15. If aBrick.Left < Me.Width - aBrick.Width Then
    16. aBrick.Left = aBrick.Left + 25
    17. End If
    18. End If
    19. End Sub
    20. Function CheckLoose(ByVal i As Integer) As Boolean 'game over
    21. If rowH(i) <= 0 Then
    22. MsgBox("Verloren")
    23. Return True
    24. Else
    25. Return False
    26. End If
    27. End Function
    28. Function SetHeight(ByVal sender As Object, ByVal rowI As Integer, ByVal lohi As Boolean) 'Höhe setzen
    29. If lohi = True Then
    30. rowH(rowI) = rowH(rowI) - sender.Height
    31. Else
    32. If rowH(rowI) <> Me.Height Then
    33. rowH(rowI) = rowH(rowI) + sender.Height
    34. Else
    35. rowH(rowI) = 0
    36. End If
    37. End If
    38. End Function
    39. Function GetRandom() As Integer 'zufall
    40. Randomize()
    41. Dim upperbound As Integer = 3
    42. Dim lowerbound As Integer = 1
    43. Return CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd())) + lowerbound
    44. End Function
    45. Function DoAnimation(ByVal obj As Object) 'runter fallen
    46. obj.Top = obj.Top + 5
    47. If rowH(GetRow(aBrick)) = 0 Then
    48. rowH(GetRow(aBrick)) = 550
    49. End If
    50. If obj.Top + obj.Height >= rowH(GetRow(aBrick)) Then
    51. Timer1.Stop()
    52. SetHeight(aBrick, GetRow(aBrick), True)
    53. If CheckLoose(GetRow(aBrick)) = True Then
    54. Timer1.Stop()
    55. bCheck = True
    56. Button1.Enabled = True
    57. Button1.Visible = True
    58. Else
    59. aBrick = GetBrick(GetRandom())
    60. Timer1.Start()
    61. End If
    62. End If
    63. End Function
    64. Function GetRow(ByVal obj As Object) As Integer 'reihen überprüfen
    65. Dim row As Integer
    66. Select Case obj.Left
    67. Case 0 To 24
    68. row = 1
    69. Case 25 To 49
    70. row = 2
    71. Case 50 To 74
    72. row = 3
    73. Case 75 To 99
    74. row = 4
    75. Case 100 To 124
    76. row = 5
    77. Case 125 To 149
    78. row = 6
    79. Case 150 To 174
    80. row = 7
    81. Case 175 To 199
    82. row = 8
    83. Case 200 To 224
    84. row = 9
    85. Case 225 To 249
    86. row = 10
    87. Case 250 To 274
    88. row = 11
    89. Case 275 To 299
    90. row = 12
    91. Case 300 To 324
    92. row = 13
    93. Case 325 To 350
    94. row = 14
    95. End Select
    96. Return row
    97. End Function
    98. Function GetBrick(ByVal i As Integer) As Object 'steine
    99. Dim newLabel As New Label
    100. If i = 1 Then
    101. newLabel.Size = New Size(25, 25)
    102. newLabel.BackColor = Color.Red
    103. ElseIf i = 2 Then
    104. newLabel.Size = New Size(25, 50)
    105. newLabel.BackColor = Color.Blue
    106. ElseIf i = 3 Then
    107. newLabel.Size = New Size(25, 75)
    108. newLabel.BackColor = Color.Green
    109. End If
    110. newLabel.Name = "brick" & brickCount
    111. newLabel.Location = New Drawing.Point(Me.Width / 2 - newLabel.Width, 0) 'me bezieht sich auf form1
    112. Array.Resize(labar, brickCount + 1)
    113. labar(brickCount) = newLabel
    114. brickCount = brickCount + 1 'das immer ein neuer kommt
    115. newLabel.BringToFront() 'sichtbar
    116. Me.Controls.Add(newLabel) 'zu form1 hinzufügen, spielfeld
    117. Return (newLabel)
    118. End Function
    119. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    120. If bCheck = True Then
    121. sender.Text = "Spiel beenden"
    122. Application.Exit()
    123. Else
    124. aBrick = GetBrick(GetRandom())
    125. Timer1.Start()
    126. sender.Hide()
    127. sender.Enabled = False 'gleiche wie visible.false
    128. End If
    129. End Sub
    130. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    131. DoAnimation(aBrick)
    132. End Sub
    133. Private Sub Deleted(ByVal aBrick As Object)
    134. Throw New NotImplementedException
    135. End Sub
    136. End Class