Sticker-Tauschbörsen Simulation in der Konsole erstellen

  • VB.NET
  • .NET 4.5

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

    Sticker-Tauschbörsen Simulation in der Konsole erstellen

    Neu

    Hallo liebes Forum, ich erstelle gerade eine kleine Simulation in der Konsole, die eine Art Sticker-Karten-Tauschbörse werden soll.
    Angenommen es ist ein Album da, das mit Stickern zu befüllen ist. Aus dieser Grundlagen soll in der Konsole folgendes geschehen:

    eine kleine Simulation:
    - sie legt die anzahl der teilnehmer fest (soll für die masse gelten also so 100 oder gar 1000 spieler sollen möglich sein)
    - es wird festgelegt wie viele Karten das Album hat
    - für jeden Spieler zufällig wie viele er von den Karten bereits hat
    - für jeden Spieler zufällig welche von den Karten er hat

    eine Abfrage der Konsole:
    - es wird abgefragt, welche Spieler verglichen werden sollen
    -es wir angezeigt, welche Karten die Spieler bereits gesammelt haben
    - es wird angezeigt, welche Karten die Spieler nicht gemeinsam haben

    Welche Schwierigkeiten ich hatte werde ich im Code als KOmmentar dazuschreiben. (werde versuchen überhaupt das ganze mit KOmmis zu versehen.)
    Würde mich über TIpps freuen. LG

    VB.NET-Quellcode

    1. Module Module1
    2. 'simulation
    3. 'festlegung der spieleranzahl
    4. 'festlegung der kartenanzahl
    5. ' für jeden spieler vorhandene karten
    6. ' für jeden spieler fehlende karten
    7. 'abfrage
    8. 'festlegung zweier spieler die verglichen werden
    9. 'wie viele karten hat man gemeinsam ? welche hat man gemeinsam?
    10. 'wie viele karten hat man nicht gemeinsam? welche hat man nicht gemeinsam?
    11. Class spieler
    12. Public zufallkarten As New Random
    13. Public kartenvorhanden As Integer = zufallkarten.Next(0, gesamtkarten - 1)
    14. Public kartennichtvorhanden As Integer = gesamtkarten - kartenvorhanden
    15. Public welchevorhanden As Integer
    16. Public welchekarten As New List(Of Integer)
    17. Public welchekarten02 As New List(Of Integer)
    18. Public welchekartennicht As New List(Of Integer)
    19. Public gesamtkartenliste As New List(Of Integer)
    20. End Class
    21. Public gesamtkarten As Integer
    22. Public spielercount As Integer = 4 ' hier die anzahl der spieler angeben
    23. Public spieleranzahl(spielercount) As spieler
    24. Sub Main()
    25. Console.Write("Hier die Anzahl der Karten angeben: ")
    26. gesamtkarten = Console.ReadLine()
    27. 'array für die spieleranzahl initialisieren
    28. For i = 0 To spielercount
    29. spieleranzahl(i) = New spieler
    30. Next
    31. 'Hinweis: hier wird für jeden spieler in einer list of integer "welchevorhanden" die karten festgelegt, die vorhanden sind
    32. 'PROBLEM: für alle Spieler wird die gleiche list of integer verwendet, wie kann man hier für jeden spieler eine eigene LIst of Integer erstellen?
    33. For Each element As spieler In spieleranzahl
    34. While element.welchekarten.Count + 1 <= element.kartenvorhanden
    35. element.welchevorhanden = element.zufallkarten.Next(1, gesamtkarten + 1)
    36. If Not element.welchekarten.Contains(element.welchevorhanden) Then
    37. element.welchekarten.Add(element.welchevorhanden)
    38. End If
    39. End While
    40. Next
    41. 'Abfrage: funktioniert zur zeit nur für einen spieler, da ja die list of integer immer die gleiche ist also ob man spieleranzahl(2) wählt oder spieleranzahl(3) es kommen die gleiche werte raus, das ist unter anderem das Problemchen.
    42. Console.WriteLine("Spielerangaben")
    43. Console.WriteLine("Diese Karten sind vorhanden")
    44. Console.WriteLine("Spieler02")
    45. spieleranzahl(2).welchekarten.Sort()
    46. For i = 0 To spieleranzahl(2).welchekarten.Count - 1
    47. Console.WriteLine(spieleranzahl(2).welchekarten(i))
    48. Next
    49. Console.WriteLine("Diese Karten sind nicht vorhanden")
    50. Dim TheOthers = spieleranzahl(2).gesamtkartenliste.Except(spieleranzahl(2).welchekarten)
    51. For i = 1 To gesamtkarten
    52. spieleranzahl(2).gesamtkartenliste.Add(i)
    53. Next
    54. For i = 0 To TheOthers.Count - 1
    55. Console.WriteLine(TheOthers(i))
    56. Next
    57. Console.ReadLine()
    58. End Sub
    59. End Module

    Neu

    Mach dir in einem typisiserten Dataaset ein relationales Datenmodell, mit Spielern, Bildern, Karten, Alben.
    Mit selbstgebastelten Klassen wird das vermutlich ein Krampf werden.

    Unklar ist, warums bei dir scheints nur ein Album gibt.
    In meiner Welt hat jeder Sticker-Sammler ein Album.
    Ok - kann man tatsächlich weglassen, und "Album" als etwas abstraktes auffassen - was einfach nur definiert, ob ein Spieler "vollständig" ist - also von jedem Bild mindestens eine Karte hat.

    Neu

    Das Problem bzgl. der gleichen Listen ist mal wieder Z#16: Da viele Spieler in kurzer Zeit erstellt werden, erzeugen die Zufallsgeneratoren auch gleiche Zufallszahlenfolgen. Schreib daher: Public Shared zufallkarten As New Random. Dann wird für alle Spielerklassen einmal ein Zufallsgenerator erzeugt, den alle Spieler nutzen können und die Zufallszahlen sind dann auch unterschiedlich.
    Sobald Du dann den hardccodierten Spielerindex 2 durch eine passende (Schleifen-?)Variable ersetzt, läuft es wie gewünscht.
    Du solltest bei der Variablenbenennung aber noch nacharbeiten.
    • spielercount: denglisch
    • welchekarten02: :huh:
    • welchekartennicht: schwache Aussagekraft
    • spieleranzahl: Name widerspricht Inhalt
    Und: Teile Deine Main auf, solange Du noch den Durchblick hast.
    ein Beispiel

    Dabei habe ich effektiv nur die einzelnen Abschnitte in Methoden ausgelagert und lasse diese in der Main aufrufen. Dadurch siehst Du, was genau wo passiert. Und wenn Du einen Abschnitt ändern willst, weißt Du auch, wo sich dieser befindet. Diese Aufteilung ist der Anfang vom Einstieg in Klassennutzung. Alias Objektorientierung.

    VB.NET-Quellcode

    1. Sub Main()
    2. gesamtkarten = GetTotalCardCount()
    3. CreatePlayers()
    4. GiveRandomCardsToAllPlayers()
    5. ShowCardDataOfAllPlayers()
    6. End Sub
    7. Private Function GetTotalCardCount() As Integer
    8. Console.Write("Hier die Anzahl der Karten angeben: ")
    9. Return CInt(Console.ReadLine())
    10. End Function
    11. Private Sub CreatePlayers()
    12. 'array für die spieleranzahl initialisieren
    13. For i = 0 To spielercount - 1
    14. spieleranzahl(i) = New spieler
    15. Next
    16. End Sub
    17. Private Sub GiveRandomCardsToAllPlayers()
    18. 'Hinweis: hier wird für jeden spieler in einer list of integer "welchevorhanden" die karten festgelegt, die vorhanden sind
    19. 'PROBLEM: für alle Spieler wird die gleiche list of integer verwendet, wie kann man hier für jeden spieler eine eigene LIst of Integer erstellen?
    20. For Each element As spieler In spieleranzahl
    21. While element.welchekarten.Count + 1 <= element.kartenvorhanden
    22. element.welchevorhanden = spieler.zufallkarten.Next(1, gesamtkarten + 1)
    23. If Not element.welchekarten.Contains(element.welchevorhanden) Then
    24. element.welchekarten.Add(element.welchevorhanden)
    25. End If
    26. End While
    27. Next
    28. End Sub
    29. Private Sub ShowCardDataOfAllPlayers()
    30. 'Abfrage: funktioniert zur zeit nur für einen spieler, da ja die list of integer immer die gleiche ist also ob man spieleranzahl(2) wählt oder spieleranzahl(3) es kommen die gleiche werte raus, das ist unter anderem das Problemchen.
    31. For j = 0 To spieleranzahl.Count - 1
    32. Console.WriteLine("Spielerangaben")
    33. Console.WriteLine("Diese Karten sind vorhanden")
    34. Console.WriteLine("Spieler02")
    35. spieleranzahl(j).welchekarten.Sort()
    36. For i = 0 To spieleranzahl(j).welchekarten.Count - 1
    37. Console.WriteLine(spieleranzahl(j).welchekarten(i))
    38. Next
    39. Console.WriteLine("Diese Karten sind nicht vorhanden")
    40. Dim TheOthers = spieleranzahl(j).gesamtkartenliste.Except(spieleranzahl(j).welchekarten)
    41. For i = 1 To gesamtkarten
    42. spieleranzahl(j).gesamtkartenliste.Add(i)
    43. Next
    44. For i = 0 To TheOthers.Count - 1
    45. Console.WriteLine(TheOthers(i))
    46. Next
    47. Console.ReadLine()
    48. Next
    49. End Sub



    Ach ja: Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Stichwort Option Strict On, da in Z#33 der ReadLine-String nicht in einen Integer umgewandelt werden kann. Bzw. sollte. Gegenbeispiel in meinem Code.

    Und noch was: Gib mal in Z#28 bei spielerCount eine 1 ein und führ Dein Programm aus. Merkste was? Nicht ganz wie erwartet.
    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.

    Neu

    Danke schon mal für die Tipps, habe es mir zu Herzen genommen. Es fehtl jedoch nicht viel damit es klappt, deswegen will ich noch bei der Konsolenanwendung bleiben.
    Ich hätte ein paar kleine Fragen, die noch nicht mit dem Code zu tun haben(zum Code komme ich dann später)

    - kann man Option Strict On dauerhaft anlassen, sodass man bei jeder neuen Projektmappe das nicht neu umstellen muss?
    - zu Windows Form: kann man Einstellungen wie textbox.multiline dauerhaft anlassen, ohne dass man sie bei jeder Projektmappe neu umstellen muss?
    - da die Simulation warscheinlich viele Spieler und Karten in Anspruch nimmt: kann man das Konsolenfenster in ihrer Kapazität vergrößern?
    in den standardeinstellungen passen ca 340 Zeilen oder so, es wär schön wenn man so die letzten 1000- 10000 Zeilen nachverfolgen könnte.

    Neu

    1. ja: Siehe empfohlene VS-Einstellungen
    2. nein
    3. weiß ich nicht, ist aber ziemlich userunfreundlich. Ich will nicht durch 10000 Zeilen blättern. Mach es doch so, dass nicht alle Spieler angezeigt werden, sondern man soll die ID des Spielers angeben, dessen Karten man sehen soll. Stichwort UI-Menü:

    Quellcode

    1. Bitte wählen Sie einen der folgenden Menüpunkte:
    2. (1) neues Spiel beginnen
    3. (2) Kartendeck eines Spielers anzeigen
    4. (3) Spieldaten speichern
    5. (4) Speildaten laden
    6. (5) Spielende
    7. Ihre Eingabe: _

    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.

    Neu

    ok danke ja die abfrage der daten sollte ich hinterher einigermaßen hinkriegen hoffe ich, jetzt habe ich jedoch noch fragen zum erstellungscode.
    poste hier eine version wo ingesamt 2 spieler ihre Karten bekommen, das ganze geschieht in der list of integer "welchekarten" bzw. "welchekarten02".

    VB.NET-Quellcode

    1. Dim anzahlkarten As Integer = 10
    2. Dim zufall01 As New Random
    3. Dim kartenvorhanden As Integer = zufall01.Next(0, anzahlkarten)
    4. Dim kartennichtvorhanden As Integer = anzahlkarten - kartenvorhanden
    5. Dim kartenvorhanden02 As Integer = zufall01.Next(anzahlkarten)
    6. Dim kartennichtvorhanden02 As Integer = anzahlkarten - kartenvorhanden02
    7. Dim zufall02 As New Random
    8. Dim welchevorhanden As Integer
    9. Dim welchevorhanden02 As Integer
    10. Dim spieler01karten As New List(Of Integer)
    11. Dim spieler02karten As New List(Of Integer)
    12. Console.WriteLine("Welche Karten sind vorhanden?")
    13. Console.WriteLine("Spieler1:")
    14. While spieler01karten.Count + 1 <= kartenvorhanden
    15. welchevorhanden = zufall02.Next(1, anzahlkarten + 1)
    16. If Not spieler01karten.Contains(welchevorhanden) Then
    17. spieler01karten.Add(welchevorhanden)
    18. End If
    19. End While
    20. Console.WriteLine("Spieler 2:")
    21. While spieler02karten.Count + 1 <= kartenvorhanden02
    22. welchevorhanden02 = zufall02.Next(1, anzahlkarten + 1)
    23. If Not spieler02karten.Contains(welchevorhanden02) Then
    24. spieler02karten.Add(welchevorhanden02)
    25. End If
    26. End While



    um nicht für jeden spieler einen code abschnitt schreiben zu müssen, kam dann die version mit der klasse spieler und dem array spieleranzahl:

    VB.NET-Quellcode

    1. Public spielercount As Integer = 4 ' hier die anzahl der spieler angeben
    2. Public spieleranzahl(spielercount) As spieler
    3. For i = 0 To spielercount
    4. spieleranzahl(i) = New spieler
    5. Next
    6. For Each element As spieler In spieleranzahl
    7. While element.welchekarten.Count + 1 <= element.kartenvorhanden
    8. element.welchevorhanden = spieler.zufallkarten.Next(1, gesamtkarten + 1)
    9. If Not element.welchekarten.Contains(element.welchevorhanden) Then
    10. element.welchekarten.Add(element.welchevorhanden)
    11. End If
    12. End While
    13. Next



    --> ich komme hier halt leider nicht wieter wie ich in einem einmaligen code-abschnitt mehrere spieler durchlaufen kann und für jeden spieler eine eigene list of integer in der schleife erstelle.

    hatte überlegt etwas in der art zu machen wie ein array einer list of integer und das da mit einbauen aber weiß nicht ob das überhaupt geht
    so etwas wie:

    VB.NET-Quellcode

    1. Public listefürallespieler() As List(Of Integer)
    2. 'initialisierung
    3. For i = 0 To spielercount
    4. listefürallespieler(i) = New List(Of Integer)
    5. Next

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

    Neu

    Visual_Prog schrieb:

    wie ich in einem einmaligen code-abschnitt mehrere spieler durchlaufen kann und für jeden spieler eine eigene list of integer in der schleife erstelle.
    Aber das hast Du doch schon.

    Jeder Spieler hat eine Auflistung der Karten, die er hat. Das hast Du schon in Post#1 drin:

    VB.NET-Quellcode

    1. Class spieler
    2. '…
    3. Public welchekarten As New List(Of Integer)
    4. '…
    5. End Class

    Und in Post6, Codeblock#2 befüllst Du doch auch schon die Kartenlisten jedes Spielers. Das genügt auch. So kannst Du derzeit über spieleranzahl(0).welchekarten auf die Karten(indizes) zugreifen, die eben der 1. Spieler hat. Was ist also das Problem? welchekarten02 brauchst Du somit genauso wenig wie den letzten Codeblock.

    btw: Die Spielervariable gesamtkartenliste brauchst Du auch nicht (dort). Nicht jeder Speiler hat eine gesamtkartenliste, sondern das Spiel hat eine Gesamtkartenliste. Ist doch so, oder?
    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.

    Neu

    ja also mein problem mit spieleranzahl(0).welchekarten liegt darin, dadurch dass es eine simulation ist, hat zwar das gesamte album die gleiche anzahl an karten, aber WELCHE Karten jeder Spieler hat, soll unterschiedlich sein.

    wenn zur zeit insgesamt 10 karten sind, haben alle spieler zum Beispiel die karten nr. 2,5,7

    aber das soll ja unterschiedlich sein also spieler 1 soll nr. 3,6,7 haben. Im gegenteil spieler 15 soll die karten 2,3,8,9 haben beispielsweise.

    will damit sagen: sie müssen doch auf unterschiedliche list of integer zugreifen, weil sie ja sonst immer alle die gleichen karten haben. Oder habe ich da was übersehen?

    Neu

    Ja, hast Du: Post#3. Da steht drin, warum mit Deinem Code jeder die gleichen Karten hat und was Du tun musst, damit sich das ändert.
    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.

    Neu

    joa es gibt ne frage :(

    wenn ich spieleranzahl in der sub simulation lokal deklariere funktiniert es, aber global funktiniert es nicht.
    Brauche es aber global, weil ich nachher mit einer anderen sub darauf zugreifen muss "sub: abfrage"

    VB.NET-Quellcode

    1. Public spielercount As Integer
    2. Public spielernummer as Integer
    3. Public spieleranzahl(spielercount) As spieler
    4. Public Sub simulation()
    5. Console.Write("Hier die Anzahl der Spieler festlegen: ")
    6. spielercount = CInt(Console.ReadLine())
    7. Console.WriteLine("Die Anzahl der Spieler beträgt:" & spieleranzahl(spielercount).ToString())
    8. Console.Write("Hier die Anzahl der Karten angeben: ")
    9. gesamtkarten = CInt(Console.ReadLine())
    10. 'array für die spieleranzahl initialisieren
    11. For i = 0 To spielercount
    12. spieleranzahl(i) = New spieler
    13. Next
    14. end sub
    15. Public Sub abfrage()
    16. Console.WriteLine("Sie können jetzt die Spieler abfragen, die maximale Anzahl an spieler beträgt: " & spielercount)
    17. Console.WriteLine("Bitte wählen Sie den Spieler aus, dessen Karten Sie wissen wollen")
    18. spielernummer = CInt(Console.ReadLine())
    19. Console.WriteLine("Spieler Nr: " & spielernummer)
    20. spieleranzahl(spielernummer).welchekarten.Sort()
    21. For i = 0 To spieleranzahl(spielernummer).welchekarten.Count - 1
    22. Console.WriteLine(spieleranzahl(spielernummer).welchekarten(i))
    23. Next
    24. End Sub


    Fehler: Ein Ausnahmefehler des Typs "System.IndexOutOfRangeException" ist in Uebungkonsole010.exe aufgetreten.

    Zusätzliche Informationen: Der Index war außerhalb des Arraybereichs.

    Danke

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

    Neu

    Naja, welchen Wert hat spielercount in Z#1? Daraus ergibt sich die Feldgröße von spieleranzahl in Z#3 automatisch. Spätere Änderungen von spielercount interessieren spieleranzahl dann nicht mehr.
    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.