If-Anweisung verkleinern?

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    If-Anweisung verkleinern?

    Hallo ich bins nochmal :D

    Gibt es eine schlanke Methode eine Große If-Anweisung zu verkleinern? Habe evtl überlegt mit Select Case aber wirklich kleiner werde ich damit auch nicht...
    Geht wieder mal um meine kleine Slotmaschine xD

    Hier mal der Ausschnitt:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If (Feld1 = 7 AndAlso Feld2 = 7 AndAlso Feld3 = 7) OrElse
    2. (Feld1 = 0 AndAlso Feld2 = 7 AndAlso Feld3 = 7) OrElse
    3. (Feld1 = 7 AndAlso Feld2 = 0 AndAlso Feld3 = 7) OrElse
    4. (Feld1 = 7 AndAlso Feld2 = 7 AndAlso Feld3 = 0) OrElse
    5. (Feld1 = 0 AndAlso Feld2 = 7 AndAlso Feld3 = 0) OrElse
    6. (Feld1 = 0 AndAlso Feld2 = 0 AndAlso Feld3 = 7) OrElse
    7. (Feld1 = 7 AndAlso Feld2 = 0 AndAlso Feld3 = 0) Then
    8. 'Ausführender Code
    9. 'Erdbeere
    10. ElseIf (Feld1 = 8 AndAlso Feld2 = 8 AndAlso Feld3 = 8) OrElse
    11. (Feld1 = 0 AndAlso Feld2 = 8 AndAlso Feld3 = 8) OrElse
    12. (Feld1 = 8 AndAlso Feld2 = 0 AndAlso Feld3 = 8) OrElse
    13. (Feld1 = 8 AndAlso Feld2 = 8 AndAlso Feld3 = 0) OrElse
    14. (Feld1 = 0 AndAlso Feld2 = 8 AndAlso Feld3 = 0) OrElse
    15. (Feld1 = 0 AndAlso Feld2 = 0 AndAlso Feld3 = 8) OrElse
    16. (Feld1 = 8 AndAlso Feld2 = 0 AndAlso Feld3 = 0) Then
    17. 'Ausführender Code
    18. End If


    Das soll praktisch die Gewinnermittlung sein wobei die Zahl die Frucht ist und 0 gleicht dem Stern als "Bonus"-Feld
    Klar könnte man. Dazu müssten wir wissen, was mit den Feldern 4-9 ist. Sollen die später auch ausgewertet werden? Ich hab da so bunte Linien aus Deinem anderen Thread im Kopf, die diverse Gewinnmöglichkeiten suggerieren. Daher musst Du uns erstmal sagen, wann da gleiche Gewinne auftreten können. Und was ist mit Feld 1-3 = Stern? Was soll dann passieren?
    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.
    Also Grundsätzlich gibt es bei mir 5 Lininen und 3 "Walzen". Jede Linie von den 5 kann gewinnen mit jeweils 7 verschiedenen kombinationen. Das ganze bei 9 Früchten macht bei mir 315 möglichkeiten...

    Es werden alle Felder ausgewertet die im zusammenhang mit den Linien stehen. ich Poste mal den Ansatz den ich bis jetzt hatte, in der nur 1 Frucht gewonnen hat ^^

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub Gewinn()
    2. 'Obere Linie
    3. 'Zitrone
    4. If (Feld1 = 7 AndAlso Feld2 = 7 AndAlso Feld3 = 7) OrElse
    5. (Feld1 = 0 AndAlso Feld2 = 7 AndAlso Feld3 = 7) OrElse
    6. (Feld1 = 7 AndAlso Feld2 = 0 AndAlso Feld3 = 7) OrElse
    7. (Feld1 = 7 AndAlso Feld2 = 7 AndAlso Feld3 = 0) OrElse
    8. (Feld1 = 0 AndAlso Feld2 = 7 AndAlso Feld3 = 0) OrElse
    9. (Feld1 = 0 AndAlso Feld2 = 0 AndAlso Feld3 = 7) OrElse
    10. (Feld1 = 7 AndAlso Feld2 = 0 AndAlso Feld3 = 0) Then
    11. Oben = FrmHaupt.NUD_Einsatz.Value * 2
    12. FrmHaupt.TB_Gewinn.Text = CType(Oben, String)
    13. FrmHaupt.NUD_Guthaben.Value += Oben
    14. 'Erdbeere
    15. ElseIf (Feld1 = 8 AndAlso Feld2 = 8 AndAlso Feld3 = 8) OrElse
    16. (Feld1 = 0 AndAlso Feld2 = 8 AndAlso Feld3 = 8) OrElse
    17. (Feld1 = 8 AndAlso Feld2 = 0 AndAlso Feld3 = 8) OrElse
    18. (Feld1 = 8 AndAlso Feld2 = 8 AndAlso Feld3 = 0) OrElse
    19. (Feld1 = 0 AndAlso Feld2 = 8 AndAlso Feld3 = 0) OrElse
    20. (Feld1 = 0 AndAlso Feld2 = 0 AndAlso Feld3 = 8) OrElse
    21. (Feld1 = 8 AndAlso Feld2 = 0 AndAlso Feld3 = 0) Then
    22. Oben = FrmHaupt.NUD_Einsatz.Value * 1
    23. FrmHaupt.TB_Gewinn.Text = CType(Oben, String)
    24. FrmHaupt.NUD_Guthaben.Value += Oben
    25. End If
    26. 'Mittellinie
    27. If (Feld4 = 7 AndAlso Feld5 = 7 AndAlso Feld6 = 7) OrElse
    28. (Feld4 = 0 AndAlso Feld5 = 7 AndAlso Feld6 = 7) OrElse
    29. (Feld4 = 7 AndAlso Feld5 = 0 AndAlso Feld6 = 7) OrElse
    30. (Feld4 = 7 AndAlso Feld5 = 7 AndAlso Feld6 = 0) OrElse
    31. (Feld4 = 0 AndAlso Feld5 = 7 AndAlso Feld6 = 0) OrElse
    32. (Feld4 = 0 AndAlso Feld5 = 0 AndAlso Feld6 = 7) OrElse
    33. (Feld4 = 7 AndAlso Feld5 = 0 AndAlso Feld6 = 0) Then
    34. Mitte = CType(FrmHaupt.NUD_Einsatz.Value * 2.3, Decimal)
    35. FrmHaupt.TB_Gewinn.Text = CType(Mitte, String)
    36. FrmHaupt.NUD_Guthaben.Value += Mitte
    37. End If
    38. 'Untere Linie
    39. If (Feld7 = 7 AndAlso Feld8 = 7 AndAlso Feld9 = 7) OrElse
    40. (Feld7 = 0 AndAlso Feld8 = 7 AndAlso Feld9 = 7) OrElse
    41. (Feld7 = 7 AndAlso Feld8 = 0 AndAlso Feld9 = 7) OrElse
    42. (Feld7 = 7 AndAlso Feld8 = 7 AndAlso Feld9 = 0) OrElse
    43. (Feld7 = 0 AndAlso Feld8 = 7 AndAlso Feld9 = 0) OrElse
    44. (Feld7 = 0 AndAlso Feld8 = 0 AndAlso Feld9 = 7) OrElse
    45. (Feld7 = 7 AndAlso Feld8 = 0 AndAlso Feld9 = 0) Then
    46. Unten = CType((FrmHaupt.NUD_Einsatz.Value * 2.4), Decimal)
    47. FrmHaupt.TB_Gewinn.Text = CType(Unten, String)
    48. FrmHaupt.NUD_Guthaben.Value += Unten
    49. End If
    50. 'Diagonal oben links
    51. If (Feld1 = 7 AndAlso Feld5 = 7 AndAlso Feld9 = 7) OrElse
    52. (Feld1 = 0 AndAlso Feld5 = 7 AndAlso Feld9 = 7) OrElse
    53. (Feld1 = 7 AndAlso Feld5 = 0 AndAlso Feld9 = 7) OrElse
    54. (Feld1 = 7 AndAlso Feld5 = 7 AndAlso Feld9 = 0) OrElse
    55. (Feld1 = 0 AndAlso Feld5 = 7 AndAlso Feld9 = 0) OrElse
    56. (Feld1 = 0 AndAlso Feld5 = 0 AndAlso Feld9 = 7) OrElse
    57. (Feld1 = 7 AndAlso Feld5 = 0 AndAlso Feld9 = 0) Then
    58. LinksOben = CType((FrmHaupt.NUD_Einsatz.Value * 1.6), Decimal)
    59. FrmHaupt.TB_Gewinn.Text = CType(LinksOben, String)
    60. FrmHaupt.NUD_Guthaben.Value += LinksOben
    61. End If
    62. 'Diagonal unten links
    63. If (Feld7 = 7 AndAlso Feld5 = 7 AndAlso Feld3 = 7) OrElse
    64. (Feld7 = 0 AndAlso Feld5 = 7 AndAlso Feld3 = 7) OrElse
    65. (Feld7 = 7 AndAlso Feld5 = 0 AndAlso Feld3 = 7) OrElse
    66. (Feld7 = 7 AndAlso Feld5 = 7 AndAlso Feld3 = 0) OrElse
    67. (Feld7 = 0 AndAlso Feld5 = 7 AndAlso Feld3 = 0) OrElse
    68. (Feld7 = 0 AndAlso Feld5 = 0 AndAlso Feld3 = 7) OrElse
    69. (Feld7 = 7 AndAlso Feld5 = 0 AndAlso Feld3 = 0) Then
    70. LinksUnten = CType((FrmHaupt.NUD_Einsatz.Value * 1.4), Decimal)
    71. FrmHaupt.TB_Gewinn.Text = CType(LinksUnten, String)
    72. FrmHaupt.NUD_Guthaben.Value += LinksUnten
    73. End If


    Das ganze müsste jetzt für jede Linie -> 9 mal gemacht werden. Daher die Frage ob man das verkürzen kann oder ob ich bei jeder Linie 9 Große If-Abfragen machen muss ;/

    VaporiZed schrieb:

    was ist mit Feld 1-3 = Stern?
    will heißen: Was passiert, wenn in einer Linie alles Sterne sind?
    In dem anderen Thread hattest Du noch nicht geantwortet, wie Du den Zufallsgenerator einstellen willst? Denn bisher kann es ja so sein, dass alle 9 Felder zufälligerweise Erdbeeren sind. Ist das eigentlich gewünscht? (Aber vielleicht hätte ich die Frage dort stellen sollen)
    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.

    VaporiZed schrieb:

    will heißen: Was passiert, wenn in einer Linie alles Sterne sind?


    Dann gibt es einen Mega Bonus anhand von Freispielen oder ähnlichem... das ist aber noch nicht eingefügt.


    Wenn alle 9 Felder das selbe anzeigen hat man halt einen Mega Gewinn :D Ja ist antürlich in Ordnung wenn das passiert :)

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

    Aber wie sind die Bedingungen? Horizontal in der oberen Walze 3 gleiche, in der mittleren und unteren und diagonal? Was ist wenn ich oben 3 Zitronen habe und unten 3 Kirschen? Müsstest mal alles aufzählen....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Noch zuviele Unbekannte, aber hier für den Anfang:

    VB.NET-Quellcode

    1. Private Sub Drehen()
    2. For i = 1 To 9
    3. CheckForWin({Feld1, Feld2, Feld3}, i, 1.3) 'letzterer ist vollkommen willkürlich und muss auch ggf. fruchtabhängig geändert werden
    4. CheckForWin({Feld4, Feld5, Feld6}, i, 2.3)
    5. CheckForWin({Feld7, Feld8, Feld9}, i, 1.6)
    6. CheckForWin({Feld1, Feld5, Feld9}, i, 1.1)
    7. CheckForWin({Feld7, Feld5, Feld3}, i, 1.4)
    8. Next
    9. End Sub
    10. Private Sub CheckForWin(PicturesToCheck As Integer(), FruitIndex As Integer, Bonus As Double)
    11. For Each PictureToCheck In PicturesToCheck
    12. If Not PictureToCheck.IsOneOf(0, FruitIndex) Then Return
    13. Next
    14. Guthaben += Bonus
    15. End Sub
    16. 'an besten in Extradatei:
    17. Public Module Extensions
    18. <Runtime.CompilerServices.Extension>
    19. Public Function IsOneOf(Of T)(ActualValue As T, ParamArray ListOfPossibleValues As T()) As Boolean
    20. Return ListOfPossibleValues.Contains(ActualValue)
    21. End Function
    22. End Module


    btw: Ich glaub, ich habe in dem anderen Begriff mit dem Begriff Walze angefangen. Aber da es 9 identische Bilder geben kann, ist der Begriff "Walze" falsch/irreführend, da es nicht (mehr) der Realität entspricht.
    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.
    Grundsätzlich sind alle Kombinationen möglich. Bedeutet ich kann sowohl oben 3 Kirschen haben in der mitte 3 zitronen und unten 3 bananen. Das ganze kann auch durch sterne ausgefüllt sein.

    Kirsche
    Stern
    Stern
    Melone
    Stern
    Melone
    Stern
    Kokusnuss
    Kirsche

    Hier hätte man jetzt in jeder Reihe ein Gewinn außer der unteren und würde dann zusammen addiert das Gewonnene "Geld" erhalten. Wie hoch der Gewinn sein wird habe ich noch nicht komplett festgelegt, da ich das auswahlverfahren erstmal überarbeiten wollte :)


    Ich hoffe ich konnte deine Frage beantworten ^^


    Edit:

    VaporiZed schrieb:

    VB.NET-Quellcode

    1. 'an besten in Extradatei:
    2. Public Module Extensions
    3. <Runtime.CompilerServices.Extension>
    4. Public Function IsOneOf(Of T)(ActualValue As T, ParamArray ListOfPossibleValues As T()) As Boolean
    5. Return ListOfPossibleValues.Contains(ActualValue)
    6. End Function
    7. End Module


    Das versteh ich nicht ganz :/ Entweder zu Spät oder noch zu kompliziert für mich :(

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

    Das ist eine Extension, also eine Erweiterungsmethode. Sie tut so, als ob sie eine Methode einer Klasse wäre, was sie aber nicht ist. Der erste Parameter gibt an, welchen Typ sie manipuliert. Hat man z.B. eine Extension

    VB.NET-Quellcode

    1. Public Function IsNullOrEmpty(Text As String) As Boolean
    2. Return String.IsNullOrEmpty
    3. End Function

    kann man später schreiben:

    VB.NET-Quellcode

    1. If "TestText".IsNullOrEmpty() Then
    anstatt das etwas dämliche

    VB.NET-Quellcode

    1. If String.IsNullOrEmpty("TestText") Then
    Macht das ganze besser lesbar. Damit kann man noch viele andere Sachen machen und vereinfachen. Aber für den Moment reicht es wohl, wenn Du das ggf. einfach erstmal hinnimmst und ggf. einbaust.
    Schau auch mal in den entsprechenden MSDN-Beitrag. Ach, und EdR schrieb auch mal was längeres darüber.
    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.
    @Gurke258 Vielleicht lässt sich da mit nem Flag-Enum was machen, wenn die Werte ver-And-et und ver-Or-t werden.
    Nimm Dir nur 2er-Potenzen als Werte und probier die Logik.
    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!
    @VaporiZed
    Ich habe mir das jetzt nochmal angeschaut und auch das mit den Extensions ein bisschen besser verstanden ;)
    Hab dein Code mal Testweise eingefügt und muss sagen es sieht bis jetzt ganz gut aus mit der Funktion. Werde jetzt noch ein bisschen was anpassen was die Gewinne beträgt.

    Muss es erstmal weiter testen und mein Wissen dahingehend ausbauen.

    @RodFromGermany
    Das mit dem Flag-Enum hab ich mir mal angesehen, allerdings weiß ich jetzt noch nicht wie ich das ganze genau auf meinen Fall anwenden kann, werde es mir aber nochmal genauer ansehen wie es genau funktioniert. Vielleicht kann man ja was draus basteln :)

    Gurke258 schrieb:

    Das mit dem Flag-Enum hab ich mir mal angesehen
    Wo haste dir das denn "angesehen"?
    Mir zB ist nur eine Stelle bekannt, wo das vernünftig erläutert wird, und zwar im Löffelmann-Buch von 2005.
    ok, jetzt habich gegoogelt, auf englisch scheints durchaus vernünftige Artikel dazu zu geben (neben allem möglichem Mist).
    Aber sag doch: Welche Fundstelle hat dich schlau gemacht bezüglich "flag-enums"?
    Hmm - also ich finde diese Fundstellen nicht sehr erhellend.
    Aber ich verstehe auch nicht, wie geflaggte Enums dir bei deim Problem helfen können sollten.
    Auch das Problem habich nicht wirklich verstanden, am ehesten klingelt hierbei was bei mir:

    Gurke258 schrieb:

    Also Grundsätzlich gibt es bei mir 5 Lininen und 3 "Walzen". Jede Linie von den 5 kann gewinnen mit jeweils 7 verschiedenen kombinationen. Das ganze bei 9 Früchten macht bei mir 315 möglichkeiten...
    Da entsteht in meinem Kopf das Bild einer 3 * 3 - Matrix - da könnte man 5 Linien sehen: 3 Horizontale + 2 Diagonale.
    woraus sich die 7 Kombinationen ergeben verstehe ich aber nicht.
    Ergibt das 7 Kombinationen, wenn 3 Werte gleich sein müssen, und es sind an jeder Position auch Joker möglich?
    Ja, ich glaub ja - hat was mit Permutation zu tun, (da bin ich eiglich Spezialist für).

    Schön - dann habich schliesslich das Problem doch noch verstanden - aber ihr seid da ja bereits gut unterwegs - muss ich nicht auch noch mittm Vorschlag kommen.
    Nur was du mit den Flag-Enums anstellen sollst ist mir nicht klar. Vielleicht um verschiedene Gewinn-Bonusse zu definieren
    • Kein Gewinn (verschiedene Obste)
    • Gemischt (Linie aus ein Obst + Joker)
    • Rein (Linie aus ein Obst)
    • Joker-Linie
    Jo, so ein Enum könnte man machen, aber da wäre nix zu flaggen, weil eine Linie kann ja nur eines davon sein.
    Flags haben ja nur Sinn, wenn mehrere Zustände gleichzeitig zutreffen könnnen (hast du diese Weisheit schon gewusst, anhand deiner Enum-Fundstücke?).
    Ich beziehe mich da auf den Code im Spoiler in Post #4.
    Zunächst lässt sich eine Funktion für den 7er und eine für den 8er Test machen.
    7 und 8 sind Bit-mäßig disjunkt (0111 bzw. 1000), da kam die Flag-Enum-Idee auf.
    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!