Mehrmaliges Würfelereignis mehrerer Würfel simulieren

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Mehrmaliges Würfelereignis mehrerer Würfel simulieren

    Hallo,

    wie der Titel schon sagt möchte ich in einer Windows-Form einen mehrmaligen Würfelereignis simulieren. (Das Ganze soll ein Kniffelspiel werden).

    - es gibt 5 Würfel mit jeweils 6 Augenzahlen - es wird bis zu dreimal pro runde geworfen, dabei muss der Benutzer nach jedem Wurf mitHilfe der Buttons die Würfel auswählen, die er "behalten" möchte, also dessen Augenzahlen sich nicht verändern sollen

    Was ich bis jetzt gemacht habe:

    - ich habe eine klasse würfel mit den attributen würfelnr as integer, augenzahlen as integer und eingeloggt as boolean(eingeloggt erkläre ich später)

    VB.NET-Quellcode

    1. Public Class Würfel
    2. Public _würfelnr As Integer
    3. Public _augenzahl As Integer
    4. Public _eingeloggt As Boolean
    5. Public Sub New(Würfelnummer As Integer, Augenzahl As Integer, Eingeloggt As Boolean)
    6. _eingeloggt = False
    7. _würfelnr = Würfelnummer
    8. _augenzahl = Augenzahl
    9. _eingeloggt = Eingeloggt
    10. End Sub
    11. End Class


    - von den würfeln habe ich 5 instanziert und diese in eine list of würfel gepackt

    VB.NET-Quellcode

    1. Public w1 As New Würfel(1, zufall.Next(1, 7), False)
    2. Public w2 As New Würfel(2, zufall.Next(1, 7), False)
    3. Public w3 As New Würfel(3, zufall.Next(1, 7), False)
    4. Public w4 As New Würfel(4, zufall.Next(1, 7), False)
    5. Public w5 As New Würfel(5, zufall.Next(1, 7), False)
    6. Public würfelliste As New List(Of Würfel) From {w1, w2, w3, w4, w5}


    diese 5 würfel erhalten nun jeweils eine zufällige zahl von 1-6

    - zu jeden würfel habe ich einen zugehörigen button, der die gewürfelte zahl zeigt und den würfel darstellen soll

    - durch drücken eines entsprechenden buttons wird die boolean-varialbe des entsprechenden würfels (eingeloggt) auf true gesetzt, das heißt: diese ausgewählten würfel sollen beim nächsten Wurf NICHT berücksichtigt werden. Wähle ich zum Beispiel Würfel 1 aus und Würfel 3, so sollten dessen Zahlen aus dem ersten Wurf stehen bleiben, nur die anderen Würfel erhalten dann neue Zahlen

    hier zb für den ersten würfel in der liste:

    VB.NET-Quellcode

    1. würfelliste(0)._eingeloggt = True


    frage: ist das mit dieser list of (Würfel) realisierbar, die auf true gesetzten würfel stehen zu lassen und für alle mit false einen neuen würfelereignis zu generieren? Oder ist das ganze besser mit anderen Werkzeugen zu bewältigen?
    Danke schon mal
    @Visual_Prog Warum so kompliziert?
    Was ist statistisch gesehen der Unterschied, ob Du mit 5 Würfeln je ein Mal oder mit einem Würfel 5 Mal würfelst?
    Eine Random-Instanz in die Klasse, eine For-Schleife und feddich.
    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!
    Gegenfrage: Hattest Du schon mal die Gelegenheit, mein Konsolenkniffelvorschlag anzuschauen bzw. gar Teile davon nachzuvollziehen? Denn da sind ja quasi schon alle Spielablauffragen beantwortet.
    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.
    Ich find das - ohne jetzt das von Vaporized gesehen zu haben - nicht schlecht als Anfang eines Datenmodells.

    Insbesondere die Würfel-Eigenschaft "Eingeloggt" findich gut ausgedacht.
    Ein Becher-Wurf sind nun 5 Würfel, von denen aber nur die nicht-eingeloggten veränderlich sind.
    Ein Kniffel-Spielzug sind 1 - 3 Becher-Wurfe.
    Hinzu kommt noch die Bewertung eines Spielzugs. Das ist eigentlich das einzig kreative, was ein Kniffel-Spieler zu tun hat: Nämlich Würfel einloggen, und am Ende des Spielzugs dem Spielzug eine Bewertung zuordnen.

    Kommt folgendes Minimal-Datenmodell bei raus:

    VB.NET-Quellcode

    1. Public Class KniffelPlay
    2. Public BewertungsMatrix As New List(Of Bewertung)
    3. Public Sub New()
    4. Dim bewert = New Bewertung() With {.Name = "EinerPasch",
    5. .GetValue = Function(loggedIns) Aggregate w In loggedIns Where w.Augenzahl = 1 Into Sum(w.Augenzahl)}
    6. BewertungsMatrix.Add(bewert)
    7. bewert = New Bewertung() With {.Name = "ZweierPasch",
    8. .GetValue = Function(loggedIns) Aggregate w In loggedIns Where w.Augenzahl = 2 Into Sum(w.Augenzahl)}
    9. BewertungsMatrix.Add(bewert)
    10. End Sub
    11. Public Players As New List(Of Player)
    12. Public CurrentPlayer As Player
    13. Public Sub GameStart(playerCount As Integer)
    14. For i = 0 To playerCount - 1
    15. Players.Add(New Player With {.Name = "Player" & i})
    16. Next
    17. End Sub
    18. End Class
    19. Public Class Wuerfel
    20. Public Augenzahl As Integer = 1
    21. Public Eingeloggt As Boolean
    22. End Class
    23. Public Class BecherWurf
    24. Public Wuerfel As Wuerfel() = {New Wuerfel, New Wuerfel, New Wuerfel, New Wuerfel, New Wuerfel}
    25. End Class
    26. Public Class SpielZug
    27. Public BecherWuerfe As New List(Of BecherWurf)
    28. Public Bewertung As Bewertung
    29. End Class
    30. Public Class Player
    31. Public Name As String
    32. Public Zuege As New List(Of SpielZug)
    33. End Class
    34. Public Class Bewertung
    35. Public Name As String
    36. Public GetValue As Func(Of IEnumerable(Of Wuerfel), Integer)
    37. End Class
    Also wenn ein Player einen Spielzug macht, musser seine Becherwürfe tun, und am Ende des Zuges eine Bewertung auswählen. Das ist, was Programmlogik hinbringen muss.

    (Ich hoffe nur, dass ich hier nicht Vaprizeds Ansatz neu erfunden habe)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ALso über die Würfelliste scheint das zu klappen:
    nach jedem Wurf loggt der Benutzer die Würfel ein, die er behalten möchte (deren Boolean wird dann auf True gesetzt)
    - für die restlichen Würfel gilt dann:

    VB.NET-Quellcode

    1. Public Sub Augenzahlenanzeigen0()
    2. For Each e As Würfel In würfelliste
    3. If e._eingeloggt = False Then
    4. e._augenzahl = zufall.Next(1, 7)
    5. End If
    6. Next
    7. Try
    8. btn_würfel1.Text = CStr(würfelliste(0)._augenzahl)
    9. btn_würfel2.Text = CStr(würfelliste(1)._augenzahl)
    10. btn_würfel3.Text = CStr(würfelliste(2)._augenzahl)
    11. btn_würfel4.Text = CStr(würfelliste(3)._augenzahl)
    12. btn_würfel5.Text = CStr(würfelliste(4)._augenzahl)
    13. Catch ex As Exception
    14. End Try
    15. End Sub


    habe dann noch 4 Fälle definiert, nämlich 0 würfe(fall0), 1 wurf, 2 würfe, 3 würfe(fall3) (auswertung)

    VB.NET-Quellcode

    1. Public Sub Fälle()
    2. If fall0 = True Then
    3. fall1 = False
    4. fall2 = False
    5. fall3 = False
    6. ElseIf fall1 = True Then
    7. fall0 = False
    8. fall2 = False
    9. fall3 = False
    10. ElseIf fall2 = True Then
    11. fall0 = False
    12. fall1 = False
    13. fall3 = False
    14. ElseIf fall3 = True Then
    15. fall0 = False
    16. fall1 = False
    17. fall2 = False
    18. End If
    19. End Sub


    hier kann der Benutzer den Würfeln und es werden 3 Würfelereignise simuliert:

    VB.NET-Quellcode

    1. Private Sub btn_Würfeln_Click(sender As Object, e As EventArgs) Handles btn_Würfeln.Click
    2. If fall0 = True Then
    3. Augenzahlenanzeigen0()
    4. fall0 = False
    5. fall1 = True
    6. Fälle()
    7. Label1.Visible = True
    8. ElseIf fall1 = True Then
    9. Augenzahlenanzeigen0()
    10. fall1 = False
    11. fall2 = True
    12. Fälle()
    13. Label2.Visible = True
    14. ElseIf fall2 = True Then
    15. Augenzahlenanzeigen0()
    16. fall2 = False
    17. fall3 = True
    18. Fälle()
    19. Label3.Visible = True
    20. ElseIf fall3 = True Then
    21. 'Auswertung
    22. End If
    23. End Sub


    -> Die Auswertung ist dann nur noch Formsache :D!

    @RodFromGermany ja mit dem Ansatz kann man das auch machen, allerdings ist es glaube ich dann schwieriger, Würfel "einzuloggen" die man nicht neu würfeln möchte, weil man über den anderen Weg die Würfel einzeln ansprechen kann.

    @VaporiZed habe noch nicht alles lesen können, aber gut gefallen hat mir die RoundResultEvaluation für die Auswertung mit dice. Zum Beispiel:

    VB.NET-Quellcode

    1. Private Function GetPointsFromSmallStraight(Dice As IEnumerable(Of Integer)) As Integer
    2. If {1, 2, 3, 4}.All(Function(x) Dice.Contains(x)) Then Return 30
    3. If {2, 3, 4, 5}.All(Function(x) Dice.Contains(x)) Then Return 30
    4. If {3, 4, 5, 6}.All(Function(x) Dice.Contains(x)) Then Return 30
    5. Return 0
    6. End Function


    @ErfinderDesRades
    Vielen Dank für den Code kann mich da auf jeden Fall danach richten wie es dort aufgebaut wurde.

    Visual_Prog schrieb:

    allerdings ist es glaube ich dann schwieriger, Würfel "einzuloggen"
    So was:

    VB.NET-Quellcode

    1. For i = 0 To 4 ' Anzahl der Würfel
    2. If Not würfelliste(i).IsLocked Then
    3. würfelliste(i).DoWürfeln()
    4. End If
    5. Next
    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!
    hmm - wenn ich den Code aus post#5 sehe, dann denk ich wieder, da fehlen einfach die programmier-skills.
    Die Methode heisst Augenzahlenanzeigen0() - und was wird darin gemacht? gewürfelt.
    Und was ist das mit fall0 bis fall3?
    Der Author hat scheints immer noch nicht gelernt, eine Liste zu verwenden.
    Und auch nicht, eine Methode zu schreiben, der man Argumente übergeben kann.
    Ich fürchte, da gibt es auch noch Augenzahlenanzeigen1() bis Augenzahlenanzeigen4(), und noch weitere sind im Werden.
    Und was soll da nun auch noch der TryCatch zum Kuckuck?

    Also bitte höre auf mit dem fall-Kram. Was du da herum-fällst, das scheint mir jeweils ein BecherWurf zu sein (also Würfeln mit mehreren Würfeln) - jedenfalls die fälle fall0-fall2. fall3 soll nu wieder was ganz anneres machen, nämlich "Auswertung", aber nach einem Spielzug ist "Auswertung" noch garnet dran. "Auswertung" kommt zuletzt, wenn alle Spieler fertig sind.

    Stattdessen, wenn der Player seinen Becherwurf getan hat (was bei dir sinnigerweise Augenzahlenanzeigen0() heisst oder so), dann soll er diesen in einer geeigneten Datenstruktur abspeichern, und der Becherwurf-Liste seines Spielzuges zufügen.
    Enthält die Becherwurf-Liste drei Becherwürfe ist das Würfeln des Spielzug getan. Nun muss er eine Bewertung zuweisen, und dnnn ist erstmal der nächste Player dran.
    Auswertung ist, wenn alle Spieler alle Spielzüge (die Anzahl ist bei Kniffel ja fest vorgegeben) getan haben.