Mehrdimensionales Array in Textbox - ausgewählte Inhalte überschreiben & anzeigen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von xph4nt4syx.

    Mehrdimensionales Array in Textbox - ausgewählte Inhalte überschreiben & anzeigen

    Hallo zusammen,

    ich habe eine Frage bezüglich eines mehrdimensionalen Arrays in einer TextBox.
    Durch diesen Code lass ich in der TextBox das sogenannte "Spielfeld" anzeigen (Spiel: französisches Solitair - Nein, nicht das Kartenspiel, sondern das Brettspiel)

    Spoiler anzeigen


    VB.NET-Quellcode

    1. s = ""
    2. For i As Integer = 0 To maxZeilen - 1
    3. For j As Integer = 0 To maxSpalten - 1
    4. Spielfeld(i, j) = "O" & " "
    5. If i = 3 And j = 3 Then
    6. Spielfeld(i, j) = " "
    7. End If
    8. For k As Integer = 0 To 1
    9. For l As Integer = 0 To 1
    10. Spielfeld(k, l) = " "
    11. Next
    12. Next
    13. For k As Integer = 5 To 6
    14. For l As Integer = 5 To 6
    15. Spielfeld(k, l) = " "
    16. Next
    17. Next
    18. For k As Integer = 5 To 6
    19. For l As Integer = 0 To 1
    20. Spielfeld(k, l) = " "
    21. Next
    22. Next
    23. For k As Integer = 0 To 1
    24. For l As Integer = 5 To 6
    25. Spielfeld(k, l) = " "
    26. Next
    27. Next
    28. s = s & Spielfeld(i, j)
    29. Next
    30. s = s & vbCrLf
    31. Next
    32. TextBox1.Text = s



    Als nächsten Schritt möchte ich nun einen Spielzug implementieren.
    Das bedeutet:
    - Abfrage Stein Zeile
    - Abfrage Stein Spalte
    - Abfrage Richtung

    Nachdem ich diese Elemente mit einer Inputbox abgefragt habe ist nun meine Frage, wie ich es hinbekomme, dass mir genau dieser Wert überschrieben wird?
    Also aus z.B. Spielfeld(3,4) ["O"] soll [" "] werden, da dieser Stein bewegt wird und das Feld, bzw. das Array " " als Inhalt bekommt.

    Versuch:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. SpielsteinX = InputBox("x?")
    2. SpielsteinY = InputBox("y?")
    3. Richtung = InputBox("links, rechts, oben, unten?")
    4. If Richtung = "rechts" Then
    5. Spielfeld(SpielsteinX, SpielsteinY) = " "
    6. Spielfeld(SpielsteinX + 1, SpielsteinY) = " "
    7. Spielfeld(SpielsteinX + 2, SpielsteinY) = "O"
    8. End If
    9. TextBox1.Text = s & Spielfeld(SpielsteinX, SpielsteinY) & Spielfeld(SpielsteinX + 1, SpielsteinY) & Spielfeld(SpielsteinX + 2, SpielsteinY)




    Der Inhalt der TextBox bleibt der gleiche. Lediglich ein weiteres "O" wird am Ende der TextBox hinzugefügt.
    Daher meine Frage, wie kann ich ein einzelner Array-Inhalt eines mehrdimensionales Array "überschreiben"?


    Danke für die Hilfe!

    Beste Grüße,
    xph4nt4syx

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xph4nt4syx“ ()

    @xph4nt4syx Willkommen im Forum. :thumbup:
    Trenne Daten und GUI :!:
    Mach Dir ein Integer-Array in Spielfeldgröße und belege die Elemente mit Deinen Werten.
    Da weißt Du immer genau, was wo steht und kannst entsprechend reagieren.
    Mach Dir eine Prozedur, die Dir dieses Array wie auch immer anzeigt.
    Nützlich wäre da z.B. ein DataGridView oder ein TableLayoutPanel, da hast Du die Zeilen und Spalten von Hause aus gegeben und kannst mit arbeiten.
    Dann lass die Input-Box und mach Dir eine Tastensteuerung, das ist wesentlich eleganter.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich hab einen globalen String-Array wie folgt deklariert:

    VB.NET-Quellcode

    1. Const maxZeilen = 7
    2. Const maxSpalten = 7
    3. Dim Spielfeld (maxZeilen, maxSpalten) as String


    Ich programmiere das Spiel nach Vorgabe einer Aufgabe, in der es heißt, dass "Spielfeld" global deklariert werden muss und das Spielfeld in einer TextBox angezeigt werden soll.

    Bin leider Laie und hab mit DataGridView und TableLayoutPanel noch nie gearbeitet. Ich programmiere eigentlich nur aufgrund dessen, da ich eine Prüfung schaffen muss...

    Die Werte sind auch nach Vorgabe via Inputbox abzufragen.
    Willkommen im Forum.
    Aha. Prüfungsvorbereitung, soso. Welches Fach?
    Soweit ich das abschätzen kann, führen die ganzen genannten Vorgaben zu Müll. Aber naja.

    Warum hat Dein Spielfeld 8x8 Plätze (Index jeweils 0-7)? Das Spiel hat doch nur 7x7. Obwohl, selbst das nicht, aber es genügt ein 7x7-Feld.
    Was soll denn in der TextBox effektiv drinstehen?
    Spielfeld(i, j) = "O" & " "? Warum nicht einfach nur Spielfeld(i, j) = "O "?
    Was sollen die ganzen Leerzeichen in den Spielfeldern. Also, eines ergibt Sinn (= freies Feld). Aber Du hast ja im Initialisierungscode pro Spielfeld mehrere Leerzeichen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    xph4nt4syx schrieb:

    Die Werte sind auch nach Vorgabe via Inputbox abzufragen.
    Dan poste zunächst mal die komplette Vorgabe.
    Da ich allerdings das Gefühl habe, dass Du hier lediglich eine fertige Lösung abgreifen willst, um dann, ohne was verstanden zu haben, einen Einser zu bekommen. ;(
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo zusammen,

    @VaporiZed
    in der Vorlesung Informatik - in einem Mechatronik Studium.
    Das diese Vorgaben "Müll" sind, kann gut sein, allerdings mit 3 Monate a 2h Vorlesung pro Woche kommen nicht viele Befehle und die Denkweise zustande. Aber ist ja nicht das Thema.
    Stimmt, mit dem Spielfeld hast du Recht. Aber das sind nur kleine Dinge, die zur Feinarbeit gehören und nicht Antwort meiner Frage sind...
    Es war vorgegeben, dass das Spielfeld mit einem "O" angezeigt werden soll und sich zwischen den einzelnen "O" eine Leerstelle befindet.

    @RodFromGermany
    *Dann
    Darum hab ich mit mir gerungen, mich hier anzumelden. Direkt Kritik bekommen und dann nicht mal gerechtfertigt... Hab geschrieben, dass ich Laie bin und das nicht mein Hobby ist. Und nein, den Einser kann ich nicht abgreifen, da es eine mündliche Prüfung ist und ich die Aufgabe nicht kenne. Will das hier als Übung machen. Das wird nicht benotet.
    Eigentlich will ich wissen, wie ich in meiner Tetxbox ein Inhalt eines Arrays von "O" zu " " machen kann, wenn ein Stein gezogen wird.

    xph4nt4syx schrieb:

    Direkt Kritik bekommen und dann nicht mal gerechtfertigt.
    Ich habe Dich nicht kritisiert, sondern nur meine Meinung geäußert.
    Wenn das bei Dir als Kritik ankommt, war das nicht beabsichtigt. Sorry.
    Allerdings sind wir hier im Forum eher direkt und reden keinen Schmus. ;)
    ====
    Zu Deinem Problem hatte ich bereits geschrieben, dass Du Daten und GUI trennen sollst und wie Du das tun kannst.
    Da Du eine andere Herangehensweise aufgedrückt bekommen hast, bat ich Dich, mal die komplette Vorgabe zu posten.
    Da wir nicht wissen, wie Dein String-Array zur Anzeige gelangt, bleibt die Vermutung, dass Dein Code aus Post #1 dahingehend unvollständig ist.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ah, ok, zwischen den Steinchen sollen Leerzeichen stehen. Eine weitere Vorgabe ist geklärt.

    Das mit Trennung Daten - GUI geht z.B. in folgende Richtung: Im "Spielfeld" merkst Du Dir nur, ob auf einem Feld ein Stein ist oder nicht. Die Darstellung mit Leerzeichen etc. wird dann woanders gemacht. Das hilft, Dich bei der Logik auf die Logik zu konzentrieren. Und nicht noch darüber nachdenken zu müssen, wie was jetzt wo gezeichnet wird, wenn da ein Steinchen verschoben/übersprungen/entfernt wurde.

    btw:

    xph4nt4syx schrieb:

    *Dann
    Falls Du auf Rechschreibfehler hinweisen möchtest, setz ich gerne nach:

    xph4nt4syx schrieb:

    Tetxbox
    *Textbox :P


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    xph4nt4syx schrieb:

    Eigentlich will ich wissen, wie ich in meiner Tetxbox ein Inhalt eines Arrays von "O" zu " " machen kann, wenn ein Stein gezogen wird.
    In einer Textbox ist überhaupt kein Array drin - jedenfalls kein 2-dimensionales.
    Aber mit einem unperformanten Workaround kann man was ähnliches verzapfen:

    Nämlich man kann die Zeilen der Textbox abrufen - das ist schoma ein String-Array.
    Dann kann man jeden dieser Strings in ein Char-Array überführen - somit hat man gewissermassen dann ein 2-dimensionales Char-Array (wo man 0 zu machen kann).
    Und anschliessend den ganzen Weg zurück:
    Die Char-Arrays zu Strings umwandeln (ergibt ein String-Array), und die Strings dann der Textbox.Lines-Property zurück zuweisen.

    ach - ich mach mal:

    VB.NET-Quellcode

    1. Private Sub SetTextboxChar(row As Integer, column As Integer, value As Char)
    2. Dim lines = TextBox1.Lines
    3. Dim chars = lines.Select(Function(line) line.ToCharArray).ToArray
    4. chars(row)(column) = value
    5. lines = chars.Select(Function(charLine) New String(charLine)).ToArray
    6. TextBox1.Lines = lines
    7. End Sub

    Aufruf:

    VB.NET-Quellcode

    1. Private Sub Test()
    2. SetTextboxChar(5, 3, " "c)
    3. End Sub

    Vorraussetzung ist, dass die Textbox auch wirklich mindestens 6 rows enthält, und die 6. row muss mindestens 4 Chars enthalten - sonst greifen die Indizees ins Leere und's gibt den entsprechenden Fehler.

    VB.NET-Quellcode

    1. Private Sub SetTextboxChar(ByVal row As Integer, ByVal column As Integer, ByVal value As Char)
    2. Dim lines = Me.TextBox1.Lines
    3. lines(row - 1) = (lines(row - 1).Remove(column - 1, 1).Insert(column - 1, value))
    4. Me.TextBox1.Lines = lines
    5. End Sub


    Freundliche Grüsse


    exc-jdbi
    Danke an alle für die Hilfe und die Vorschläge / Ideen.
    Momentan bin ich leider noch nicht dazu gekommen, den Thread genau zu lesen und den Code entsprechend auszubessern etc.

    Wollte mich nur mal schnell melden, dass ich noch dabei bin!

    Edit: Also, ich hab mir das mal soweit durchgelesen und ich bin zum Entschluss gekommen, dass das alles weit meine Kenntnisse übersteigt. Leider
    Ich kann nicht mal die Codes nachvollziehen, die hier gepostet wurden... Daher hab ich mich entschlossen aufzugeben und auf eine andere Aufgabe zu hoffen. ^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xph4nt4syx“ ()