Lauf - Wechsel mit Textbox

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Otti schrieb:

    habt ihr noch nie einen Spielautomat gesehen?
    Einen Automaten sehen ist das eine.
    Den Ablauf in Software zu gießen ist was völlig anderes,
    da muss schon präzise nachgefragt werden,
    sonnst kommt dann zurück:
    "So haben wir das aber nicht gewollt!"
    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!

    Otti schrieb:

    Wo wäre dein Ansatz für den Ablauf?
    Fang an und schreibe detailliert auf, was wann wo passiert, wie auf User-Eingaben reagiert werden soll und was dazu angezeigt werden soll.
    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!
    @RodFromGermany

    habe mal einen miserablen Anfang gestartet.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private wechsel1() As Label
    3. Private wechsel2() As Label
    4. Private wechsel3() As Label
    5. Private Index1 As Integer
    6. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    7. Me.wechsel1 = {Me.LStufe0, Me.LStufe1}
    8. Me.wechsel2 = {Me.LStufe0, Me.LStufe2}
    9. Me.wechsel3 = {Me.LStufe0, Me.LStufe3}
    10. End Sub
    11. Private Sub BStart_Click(sender As System.Object, e As System.EventArgs) Handles BStart.Click
    12. LSumme.Text = "0"
    13. TStufe1.Start()
    14. End Sub
    15. Private Sub BStop_Click(sender As System.Object, e As System.EventArgs) Handles BStop.Click
    16. TStufe1.Stop()
    17. TStufe2.Stop()
    18. TStufe3.Stop()
    19. LStufe0.ForeColor = Color.Black
    20. LStufe1.ForeColor = Color.Black
    21. LStufe2.ForeColor = Color.Black
    22. LStufe3.ForeColor = Color.Black
    23. LGewinn.Text = LSumme.Text
    24. End Sub
    25. Private Sub BRisiko_Click(sender As System.Object, e As System.EventArgs) Handles BRisiko.Click
    26. If Me.Index1 = 0 Then
    27. TStufe1.Stop()
    28. TStufe2.Stop()
    29. TStufe3.Stop()
    30. LSumme.Text = "Verloren"
    31. End If
    32. If Me.Index1 = 1 And Me.LStufe1.ForeColor = Color.Red Then
    33. LSumme.Text = "100"
    34. TStufe1.Stop()
    35. TStufe2.Start()
    36. If Me.Index1 = 1 And Me.LStufe2.ForeColor = Color.Red Then
    37. LSumme.Text = "200"
    38. TStufe2.Stop()
    39. TStufe3.Start()
    40. If Me.Index1 = 1 And Me.LStufe3.ForeColor = Color.Red Then
    41. LSumme.Text = "500"
    42. TStufe3.Stop()
    43. 'TStufe4.Start()
    44. End If
    45. End If
    46. End If
    47. End Sub
    48. Private Sub TStufe1_Tick(sender As System.Object, e As System.EventArgs) Handles TStufe1.Tick
    49. Dim indexNew = Me.Index1 + 1
    50. If indexNew >= Me.wechsel1.Length Then
    51. indexNew = 0
    52. End If
    53. Me.wechsel1(indexNew).ForeColor = Color.Red
    54. Me.wechsel1(Me.Index1).ForeColor = Color.Black
    55. Me.Index1 = indexNew
    56. End Sub
    57. Private Sub TStufe2_Tick(sender As System.Object, e As System.EventArgs) Handles TStufe2.Tick
    58. Dim indexNew = Me.Index1 + 1
    59. If indexNew >= Me.wechsel2.Length Then
    60. indexNew = 0
    61. End If
    62. Me.wechsel2(indexNew).ForeColor = Color.Red
    63. Me.wechsel2(Me.Index1).ForeColor = Color.Black
    64. Me.Index1 = indexNew
    65. End Sub
    66. Private Sub TStufe3_Tick(sender As System.Object, e As System.EventArgs) Handles TStufe3.Tick
    67. Dim indexNew = Me.Index1 + 1
    68. If indexNew >= Me.wechsel3.Length Then
    69. indexNew = 0
    70. End If
    71. Me.wechsel3(indexNew).ForeColor = Color.Red
    72. Me.wechsel3(Me.Index1).ForeColor = Color.Black
    73. Me.Index1 = indexNew
    74. End Sub
    75. End Class


    Kannst dir vorstellen wie ich mir es vorstelle ???

    Würde natürlich gerne nur einen Timer nutzen und und den Vergleich natürlich auch anderes gestalten, nicht wie aktuell über die Farbe
    Dateien

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

    Otti schrieb:

    Kannst dir vorstellen wie ich mir es vorstelle ???
    Ich sprach von detailliertem Aufschreiben, nicht von programmieren.
    Ich habe nämlich keine Lust, Dein Programm zu analysieren, ohne zu wissen, was es tun soll.
    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!
    @RodFromGermany

    Vorhanden sind:
    3 Button (Button1=Start, Button2=Stop, Button3=Risiko)
    9 Labels für Ausspielung (0, 100, 200, 500, 800, 1000, 1500, 3000, 5000 Punkte)
    1 Label für Aktueller Gewinn (Label10)
    1 Label für letzter Gewinn (Label11)

    Button1_Click -> ein farblicher Wechsel (rot, standart ist schwarz) der Label 1 und 2, solange bis Button3_Click erfolgt. Wenn Button3_Click und im Vorfeld Label2 , das Label war welches rot war, dann -> farblicher Wechsel zwischen Label 1 und 3, (Label2 muss dann rot bleiben, gleichzeitig soll der aktuelle Punktestand in Label10 angezeit werden, sprich 100Punkte). Wenn Button3_Click erneut und Label3 ebenfalls wieder rot war dann -> farblicher Wechsel zwischen Label 1 und 4,(Label2 und 3 müssen dann rot bleiben, gleichzeitig soll der aktuelle Punktestand in Label10 angezeit werden, sprich 200Punkte).
    Der Vorgang sollte dann bis Label1 und 9 gehen.
    Sollte in diesen ablauf, beim Button3_Click, Label0 Rot sein, soll in Label10 der aktuelle Punktestand angezeigt werden, der dann 0Punkte wären und der Vorgang ist zu Ende, ein neuer Start müsste wieder mit Button1_Click erfolgen.
    Bei Button2_Click soll der letzte aktuelle Punktestand sofort angenommen werden und auf Label11 angezeigt werden. Der letzte aktuelle Stand ist das Label, welches zuletzt dauerthaft rot ist. Beispiel Label1 und 6 würden wechselblinken, sprich zwischen 0 Punkte und 1000Punkte, sollte dann auf Label11 = 800 Punkte angezeigt werden und der Vorgang ist zu Ende und beginnt erst wieder mit Button1_Click.
    @Otti
    Warum tust du dir nicht selbst den gefallen und benamst erstmal die Steuerelemente. Label10 und Button3 ist doch quatsch.
    Nutze doch die möglichkeit den Steuerelementen Namen geben zu können. btnChangeColor ist doch einfacher zu finden und anzusprechen wie Button1 findest du nicht?

    Weiters wäre eine ordentliche Formatierung deines Antworttextes von Vorteil, so hätten sicherlich mehr Leute Lust dir zu Helfen, dein text liest sich nämlich sehr schwer muss ich sagen.

    Otti schrieb:

    das Label war welches rot war, dann -> farblicher Wechsel zwischen Label 1 und 3

    What? Im erst. Versetze dich in unsere Lage....

    Im Grunde musst du ja auch nur selbst den Ablauf kennen. Willst du den Text eines Labels ändern schreibst du Labelname.Text = "blabla" Willst du ihn in eine Variable auslesen dann Dim meinText as String = Labelname.Text. Und nach diesem Schema kannst du alles machen was du für dein Vorhaben so brauchst.

    Die Logik musst du dann nur Schritt für Schritt unterbringen. Ein fertiges Programm werden wir dir hier vermutlich nicht präsentieren.
    Hoffe du fühlst dich jetzt nicht gleich auf den Schlips getreten - es ist ein gut gemeinter Rat.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m

    Hey. Fühle mich nicht auf den Schlips getreten.
    Habe ja absichtlich mein Programm gepostet, das man versteht wie ich es meine und was ich gerne umsetzten möchte.
    Soweit klappt es ja, ist nur nicht so schön mit den ganzen Timern.
    Würde ja nur gerne wissen wollen, wie ich dies einfacher und kompakter schreiben kann.

    Danke
    Was Grundsätzliches: Da hier gar keine Objektklassen verwendet werden, wird alles in die Formularklasse gehauen. Das ist ein Vorgehen, welchem nicht wenige User folgen. Daran scheitert aber leider auch die erfolgreiche Weiterentwicklung, weil man irgendwann die Übersicht verliert, da man sich keine ausreichende Abstraktion vorstellen und einbauen kann. Und dann werden Daten mit der Anzeige vermischt und irgendwann blickt man nicht mehr durch. Diesem Punkt sind wir hier wieder gefährlich nahe. Du würdest gerne auf mehrere Timer verzichten. Warum geht das nicht? Weil Du strukturbedingt nicht erkennen kannst, was der eine Timer, den Du nur brauchst, eigentlich ausschließlich machen soll: Er soll nur den Farbwechsel zwischen 2 Gewinnmarken anregen. Aber welche Marken das sind, wie diese beschriftet sind und dass das überhaupt Labels sind: Das geht den Timer nix an. Das ist dem wurscht. So muss es zumindest sein. Letztenendes dürfte in dem einzigen Timer, den Du brauchst nur sowas stehen: Spielklasse: Kümmere Dich darum, dass die Farbe zwischen der aktuellen Gewinnmarke und der 0-Anzeige wechselt. Mehr nicht. Die Spielklasse (die es leider bei Dir noch nicht gibt), kümmert sich um den Wechsel an sich. Sie muss wissen, was die aktuelle Gewinnmarke ist und sie schaut selber, ob die Gewinnmarke gerade an ist und ausgeschaltet werden soll oder umgedreht.
    usw.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann denkst Du wahrscheinlich, dass es komplizierter ist, als es in Wirklichkeit ist.
    Alles beginnt mit einem Klassenrumpf, am besten in einer eigenen Datei:

    VB.NET-Quellcode

    1. Public Class Spielautomat
    2. End Class

    Obwohl ich meinen Code normalerweise in Englisch schreibe, mach ich es mal hier in Deutsch.
    Was muss die Klasse (erstmal für den Anfang) können? Die besagte Wechselfunktion:

    VB.NET-Quellcode

    1. Public Sub WechsleZwischenDenAktuellenAnzeigen()
    2. End Sub

    Was muss darin geschehen? Zwischen der 0-Anzeige und der aktuellen Gewinnstufenanzeige soll umgeschaltet werden. Dazu muss die Klasse vorher erstmal wissen, was die aktuelle Anzeige ist.

    VB.NET-Quellcode

    1. Private AktuelleGewinnstufe As Integer = 1
    2. Private AktuelleGewinnstufeIstErleuchtet As Boolean = False

    Die Umschaltprozedur sieht dann somit so aus.

    VB.NET-Quellcode

    1. Public Sub WechsleZwischenDenAktuellenAnzeigen()
    2. AktuelleGewinnstufeIstErleuchtet = Not AktuelleGewinnstufeIstErleuchtet
    3. End Sub

    Dann muss noch die Mainform-/GUI-Klasse die aktuellen Statusangaben der Spielautomatenklasse auslesen können:

    VB.NET-Quellcode

    1. Public Function HoleDieAktuelleGewinnstufe() As Integer
    2. Return AktuelleGewinnstufe
    3. End Function
    4. Public Function IstDieAktuelleGewinnStufeErleuchtet() As Boolean
    5. Return AktuelleGewinnstufeIstErleuchtet
    6. End Function
    Das reicht erstmal für den absoluten Anfang. Klar braucht es da noch mehr. Wechsel der Gewinnstufe z.B. Aber das sollte ja kein Problem sein, oder? Mancher wird sich vielleicht denken: Warum keine Properties nehmen? Weil keiner den Wert von AktuelleGewinnstufe von außen ändern soll. Da eine ReadOnly-Property ginge natürlich auch.

    Zusammengefasst für den Anfang also:

    VB.NET-Quellcode

    1. Public Class Spielautomat
    2. Private AktuelleGewinnstufe As Integer = 1
    3. Private AktuelleGewinnstufeIstErleuchtet As Boolean = False
    4. Public Sub WechsleZwischenDenAktuellenAnzeigen()
    5. AktuelleGewinnstufeIstErleuchtet = Not AktuelleGewinnstufeIstErleuchtet
    6. End Sub
    7. Public Function HoleDieAktuelleGewinnstufe() As Integer
    8. Return AktuelleGewinnstufe
    9. End Function
    10. Public Function IstDieAktuelleGewinnStufeErleuchtet() As Boolean
    11. Return AktuelleGewinnstufeIstErleuchtet
    12. End Function
    13. End Class

    Damit kann der Timer schon mal den Anzeigenwechsel veranlassen. Auch wenn das nur zu einer Umschaltung einer Boolean-Variable führt. Aber die GUI-Klasse kann dann eben diese Variable mithilfe der Funktion IstDieAktuelleGewinnStufeErleuchtet() und HoleDieAktuelleGewinnstufe() auslesen und entsprechend reagieren. Wie die GUI-Klasse darauf reagiert, ist dem Automaten ziemlich wurscht.

    ##########

    Jetzt liegt es an Dir, mal die Gewinnstufenänderung zu implementieren, d.h. v.a.: Was passiert, wenn man auf den [Risiko]-Knopf drückt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Otti schrieb:

    Entweder denke ich zu kompliziert
    ja. Denn es muss ja nur die Variable AktuelleGewinnstufe um 1 erhöht werden. Mehr nicht. Du könntest noch die Auswertung einbauen, ob gewonnen wurde oder nicht. Aber das wäre in einer anderen Prozedur. Das geht dann also so: Wenn der [Risiko-Button] gedrückt wird, soll die Spielautomatenklasse schauen, ob gewonnen oder verloren wurde. Wenn gewonnen, wird die genannte Prozedur zur Erhöhung der Gewinnstufe aufgerufen. Wenn verloren, dann entsprechend handeln. Das könnte z.B. so aussehen, dass die aktuelle Gewinnstufe dann Null ist. Dann wertet die GUI-Klasse aus, welche die aktuelle Gewinnstufe ist. Wenn Null, dann Abbruch, da verloren, wenn > Null, dann wird das entsprechende Label ausgewertet.*
    Wie gesagt, es ist alles teilweise sehr einfach implementiert. Und das ist auch gut so! Je simpler der Code, desto besser!
    Aber!!! Nicht auf die Idee kommen, Code aufgrund der Einfachheit zusammenzufassen, was nicht zusammengehört. Das ist der Weg, der später wieder ins Chaos führt. Oder noch schlimmer: Was dazu führt, dass alles wieder in der GUI-Klasse ist.

    ##########

    *nicht ausgewertet, sondern mit dem Label wird dann weitergearbeitet. Wenn also die Spielautomatenklasseninstanz sagt, dass die aktuelle Gewinnstufe 1 ist, dann schaltet dei GUI-Klasse zwischen Gewinnstufenlabel 1 und 0 hin- und her. Wenn der Automat sagt: 2, dann eben zwichen 2 und 0 usw.
    Es ist mit den Klassen grundsätzlich so: Jede Klasse kümmert sich nur um eine Sache (die Du festlegst): Die Spielautomatenklasse kümmert sich um die Gewinnstufen, also allgemein um die "Spielmechanik", die GUI-Klasse um die Anzeige. Und die eine pfuscht/grätscht der anderen nicht rein. (SRP)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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