Spielfeld dynamisch erstellen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Timonchen.

    Spielfeld dynamisch erstellen

    Hallo zusammen,
    ich versuche gerade ein Spielfeld dynamisch zu erstellen. Dafür benutze ich folgenden Quellcode
    Option Explicit On

    Imports Microsoft.VisualBasic.VBMath

    Public Class Form1
    Dim Spielfeld As New Microsoft.VisualBasic.PowerPacks.ShapeContainer

    Structure Feld
    Dim RectangleShape As Microsoft.VisualBasic.PowerPacks.RectangleShape
    Dim valid As Boolean

    End Structure

    Dim Feldliste(9, 9)

    Sub Felder_erzeugen()
    Spielfeld.Parent = Me

    For s = 0 To 9
    For z = 0 To 9
    Feldliste(s, z).RectangleShape = New Microsoft.VisualBasic.PowerPacks.RectangleShape With
    {
    .Size = New System.Drawing.Size(30, 30),
    .Location = New System.Drawing.Point(1, 1)
    }
    Feldliste(s, z).RectangleShape.parent = Spielfeld
    Feldliste(s, z).RectangleShape.Fillstyle = PowerPacks.FillStyle.Solid
    Feldliste(s, z).RectangleShape.fillcolor = Color.Navy
    Feldliste(s, z).valid = True
    Next

    Next

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Call Felder_erzeugen()

    End Sub
    End Class


    Aber ich bekomme immer den Fehler "Die Objektvariable oder die With-Blockvariable wurde nicht festgelegt. Nullreferenceexception wurde nicht behandelt". Kann mir da jemand weiter helfen?
    LG Timonchen
    1. Um Himmels Willen bitte mach den Code mindestens Linksbündig oder, der Königsweg, nutze die Code Formatierungsfunktion des Forums :)

    2. In welcher Zeile tritt der Fehler auf?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    VB.NET-Quellcode

    1. Option Explicit On
    2. Imports Microsoft.VisualBasic.VBMath
    3. Public Class Form1
    4. Dim Spielfeld As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
    5. Structure Feld
    6. Dim RectangleShape As Microsoft.VisualBasic.PowerPacks.RectangleShape
    7. Dim valid As Boolean
    8. End Structure
    9. Dim Feldliste(9, 9)
    10. Sub Felder_erzeugen()
    11. Spielfeld.Parent = Me
    12. For s = 0 To 9
    13. For z = 0 To 9
    14. Feldliste(s, z).RectangleShape = New Microsoft.VisualBasic.PowerPacks.RectangleShape With
    15. {
    16. .Size = New System.Drawing.Size(30, 30),
    17. .Location = New System.Drawing.Point(1, 1)
    18. }
    19. Feldliste(s, z).RectangleShape.parent = Spielfeld
    20. Feldliste(s, z).RectangleShape.Fillstyle = PowerPacks.FillStyle.Solid
    21. Feldliste(s, z).RectangleShape.fillcolor = Color.Navy
    22. Feldliste(s, z).valid = True
    23. Next
    24. Next
    25. End Sub
    26. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    27. Call Felder_erzeugen()
    28. End Sub
    29. End Class


    so schön kanns aussehen ;)
    Feldliste hat zum einen keinen Typ und wurde zum anderem nich instanziert. Solange du ein Objekt nicht instanzierst (erstellst) ist dieses NULL.

    Eine Instanzierung für ein 2-D Array dürfte in etwa so aussehen.
    Dim Feldliste As Integer()() = New Integer(3,3) {}
    @Timonchen Wenn Du die bekanntermaßen instabilen VisualBasic.PowerPacks weglässt und das ganze mit OwnerDrawing oder in einem TableLayoutContainer machst, wirst Du
    erstens hinterher mehr Freude an Deinem Projekt
    und zweitens vorher kompetentere Hilfe bekommen.
    Die VisualBasic.PowerPacks werden hier nicht gern verwendet.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kannst auch hier gucken: FightingSnakes
    Also es gibt viele Ansätze, und das verlinkte (es sind mehrere Lösungen) ist zugegebenermassen etwas exotisch, weil es ein DatagridView missbraucht.
    Dgv ist praktisch, weil man da nette Selektier-Funktionen gleich mitbekommt.

    Ich hatte auch iwo ein Spielfeld mit OwnerDrawing - ah, hier ists mit drin, Abschnitt "OwnerDrawnGrid":
    OwnerDrawing

    Also es gibt da mehrere Möglichkeiten, musste gucken, was deim Bedarf am besten entgegenkommt.
    Mein OwnerDrawing-Spielfeld ist zB direkt auf ein Control gezeichnet - ob ein TableLayoutPanel da günstiger wäre - wie gesagt: entscheidet der Einzelfall.

    Nur bitte fang nicht an, einen Haufen Pictureboxen zu generieren - das wäre der greulichste Lösungs-Ansatz. (ok, das mitte PowerPacks ist noch greulicher ;) )