Conways "Spiel des Lebens"

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Eistee.

    Conways "Spiel des Lebens"

    Hallo und erstma Frohe Ostern an alle ^^

    bin grade dabei Conways Spiel des Lebens in Vb.net nach-zu-basteln bin auch eig. fertig nur es leuft nicht so wie es soll.
    Es muss an der Nachbar erkennung liegen doch den fehler hab ich noch nicht gefunden.

    Spätestens in der 3. Runde sind alle "tot" und der Maler malt auch nicht nach jeder runde weiß.

    Hier mal der komplette Code
    Die Unterlinien habe ich hier nur der Übersicht halber reinkopiert klappe bei mir immer alles ein (siehe Bild)


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Stift As New Pen(Color.Blue) 'NUR für Linien
    3. Dim Pinsel As New SolidBrush(Color.Blue) 'Zum Ausmalen
    4. Dim Papier As New Bitmap(800, 800)
    5. Dim Maler As Graphics '= Me.CreateGraphics
    6. Dim X As Integer = 99
    7. Dim Y As Integer = 99
    8. Dim Feld(X, Y) As Zelle
    9. Dim Kopie(X, Y) As Zelle
    10. Dim Nachbarzähler As Integer
    11. '_____________________________________
    12. Structure Zelle
    13. Dim Status As Boolean
    14. End Structure
    15. '_____________________________________
    16. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    17. Call Prüfen()
    18. Call Zeichnen()
    19. Button1.PerformClick()
    20. End Sub
    21. '_____________________________________
    22. Private Sub Prüfen()
    23. 'Nachbar zählen
    24. For i = 0 To 99 'Y
    25. For t = 0 To 99 'X
    26. If i <> 0 And t > 0 Then
    27. If Feld(i - 1, t - 1).Status = True Then ' Oben links | GESICHERT
    28. Nachbarzähler = Nachbarzähler + 1
    29. End If
    30. End If
    31. If i <> 0 Then
    32. If Feld(i - 1, t).Status = True Then ' Oben | GESICHERT
    33. Nachbarzähler = Nachbarzähler + 1
    34. End If
    35. End If
    36. If i <> 0 And t < 99 Then
    37. If Feld(i - 1, t + 1).Status = True Then ' Oben rechts | GESICHERT
    38. Nachbarzähler = Nachbarzähler + 1
    39. End If
    40. End If
    41. If t <> 0 Then
    42. If Feld(i, t - 1).Status = True Then ' Links | GESICHERT
    43. Nachbarzähler = Nachbarzähler + 1
    44. End If
    45. End If
    46. If t < 99 Then
    47. If Feld(i, t + 1).Status = True Then ' Rechts | GESICHERT
    48. Nachbarzähler = Nachbarzähler + 1
    49. End If
    50. End If
    51. If i < 99 And t <> 0 Then
    52. If Feld(i + 1, t - 1).Status = True Then ' Unten links | GESICHERT
    53. Nachbarzähler = Nachbarzähler + 1
    54. End If
    55. End If
    56. If i < 99 Then
    57. If Feld(i + 1, t).Status = True Then ' Unten | GESICHERT
    58. Nachbarzähler = Nachbarzähler + 1
    59. End If
    60. End If
    61. If i < 99 And t < 99 Then
    62. If Feld(i + 1, t + 1).Status = True Then ' Unten rechts | GESICHERT
    63. Nachbarzähler = Nachbarzähler + 1
    64. End If
    65. End If
    66. 'Überlebt?
    67. If Nachbarzähler = 3 Then
    68. Kopie(i, t).Status = True
    69. Else
    70. Kopie(i, t).Status = False
    71. End If
    72. Nachbarzähler = 0
    73. Next
    74. Next
    75. For g = 0 To 99
    76. For h = 0 To 99
    77. Feld(h, g).Status = Kopie(h, g).Status
    78. Next
    79. Next
    80. End Sub
    81. '_____________________________________
    82. Private Sub Zeichnen()
    83. Using Maler As Graphics = Graphics.FromImage(Papier)
    84. Maler.Clear(Color.White)
    85. End Using
    86. For i = 0 To 99 'Y
    87. For t = 0 To 99 'X
    88. If Feld(i, t).Status = True Then
    89. Using Maler As Graphics = Graphics.FromImage(Papier)
    90. Maler.FillRectangle(Pinsel, New Rectangle(i * 6, t * 6, 5, 5))
    91. End Using
    92. End If
    93. Next
    94. Next
    95. End Sub
    96. '_____________________________________
    97. 'Steuerung + Load + Paint
    98. '_____________________________________
    99. Private Sub cmd_Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_Start.Click
    100. Timer1.Enabled = True
    101. End Sub
    102. '_____________________________________
    103. Private Sub cmd_Stop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_Stop.Click
    104. Timer1.Enabled = False
    105. End Sub
    106. '_____________________________________
    107. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    108. MsgBox("Wert von Feld Nr. 9801: " & Feld(99, 99).Status)
    109. For sX = 0 To 99
    110. For sY = 0 To 99
    111. Feld(sX, sY).Status = False
    112. Kopie(sX, sY).Status = False
    113. Next
    114. Next
    115. Feld(1, 1).Status = True
    116. Feld(1, 2).Status = True
    117. Feld(2, 1).Status = True
    118. Feld(3, 3).Status = True
    119. Feld(3, 4).Status = True
    120. Feld(4, 3).Status = True
    121. Feld(4, 4).Status = True
    122. Feld(4, 4).Status = True
    123. Feld(4, 5).Status = True
    124. Feld(23, 20).Status = True
    125. Feld(23, 21).Status = True
    126. Feld(24, 20).Status = True
    127. Feld(49, 49).Status = True
    128. Feld(10, 10).Status = True
    129. Feld(10, 20).Status = True
    130. Feld(10, 30).Status = True
    131. Feld(10, 40).Status = True
    132. Feld(10, 49).Status = True
    133. Call Zeichnen()
    134. End Sub
    135. '_____________________________________
    136. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    137. e.Graphics.DrawImage(Papier, 0, 0)
    138. End Sub
    139. ' Array Kontrolle/Visualisierung
    140. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    141. ListBox1.Items.Clear()
    142. ListBox2.Items.Clear()
    143. Dim line1 As String = ""
    144. For i As Integer = 0 To Feld.GetUpperBound(0)
    145. For j As Integer = 0 To Feld.GetUpperBound(1)
    146. line1 = line1 & Feld(i, j).Status & vbTab
    147. Next
    148. ListBox1.Items.Add(line1)
    149. line1 = ""
    150. Next
    151. Dim line2 As String = ""
    152. For i As Integer = 0 To Kopie.GetUpperBound(0)
    153. For j As Integer = 0 To Kopie.GetUpperBound(1)
    154. line2 = line2 & Kopie(i, j).Status & vbTab
    155. Next
    156. ListBox2.Items.Add(line2)
    157. line2 = ""
    158. Next
    159. End Sub
    160. End Class


    Bild:


    PS: Sorry für den "Chaos Code" bin zu blöd um ordentlichen Code zu schreiben :rolleyes:

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

    Also ich habe da mal auszusweise dran rumgepopelt:
    Using und End Using außerhalb der Schleife wegen Performance, hab ich dir schonma gepostet :rolleyes:. Und meines Erachtens ganz wichtich: Mit Invalidate das Paint aufrufen, damit dein aktuelles Bild auch gezeichnet wird.

    VB.NET-Quellcode

    1. Private Sub Zeichnen()
    2. 'Papier = New Bitmap(800, 800) alternativ zu Maler.clear(...)
    3. Using Maler As Graphics = Graphics.FromImage(Papier)
    4. Maler.Clear(Color.White)
    5. For i = 0 To 99 'Y
    6. For t = 0 To 99 'X
    7. If Feld(i, t).Status = True Then
    8. Maler.FillRectangle(Pinsel, New Rectangle(i * 6, t * 6, 5, 5))
    9. End If
    10. Next
    11. Next
    12. End Using
    13. Me.Invalidate()
    14. 'Form Paint aufrufen, deshalb wird wahrscheinlich
    15. 'nicht jeder Schritt dargeatellt
    16. End Sub

    und dann noch bei Sub Prüfen abkürzen:

    VB.NET-Quellcode

    1. Private Sub Prüfen()
    2. If i <> 0 And t > 0 AndAlso Feld(i - 1, t - 1).Status Then ' Oben links | GESICHERT
    3. Nachbarzähler += 1
    4. ElseIf i <> 0 AndAlso Feld(i - 1, t).Status Then ' Oben | GESICHERT
    5. Nachbarzähler += 1
    6. 'usw.
    7. End If

    Und als letztes empfehle ich dir im Load noch folgende Attribute reinzunehmen:

    VB.NET-Quellcode

    1. Me.SetStyle(ControlStyles.DoubleBuffer Or ControlStyles.UserPaint Or _
    2. ControlStyles.AllPaintingInWmPaint Or _
    3. ControlStyles.ResizeRedraw, True)

    Damit bleibt die Darstellung auch sauber, wenn du die Form bewegst oder die Größe änderst.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hatte das mit dem Using wohl falsch verstanden.
    Me.Invalidate() hatte ich vollkommen vergessen :S
    Und an AndAlso & ElseIf hatte ich garnicht gedacht.

    Danke

    Jetzt muss ich die Nachbar erkennung noch etwas verbessern und es ist Fertig :)