Kartenspiel ohne graphische Oberfläche

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

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Plexian.

    typolexikon.de/zahlengliederung/
    Mach deinen Eigenen Datentyp und verwene für jeden Abschnitt eine eigene Variable(String ist die richtige Wahl aufgrund von führenden Nullen), allerdings braucht die Landesvorwahl keine führenden Nullen:
    de.wikipedia.org/wiki/L%C3%A4n…ste_sortiert_nach_Nummern
    somit würde hier ein short genügen.
    Implementiere Dinge wie Parse/TryParse um einen Input String zu konvertieren, ebenso ToString zum formatieren bei einer Ausgabe.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich glaub... String hätte ihm gereicht ^^
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    MemoAnMichSelbst schrieb:

    hätte ihm gereicht
    Jein.
    Wichtig ist hier, die Aufgabenstellung präzise zu verstehen und umzusetzen.
    @Visual_Prog Was ganz genau willst oder musst Du tun?
    "+49" passt ja auch in einen String, aber bei der Telefonie ist es ggf. sinnvoll zu wissen, dass diese Nummer eine Orst- oder Landesvorwahl ist, wo wir bei unserem Lieblingskind der Datenbänkerei wären.
    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!
    ja also ich muss gestehen es handelt sich nicht wirklich um eine Telefonvorwahl, das hatte ich nur gesagt um den Datentypen zu verdeutlichen das ich verwende.
    Was ich wirklich mache ist ein Kartenspiel, jedoch sind die deklarierten karten erstmal stark vereinfacht, das heisst es gibt keine
    Koenig_Pik oder aehnliches sondern nur zahlen, das reicht mir erstmal volkommen.

    hier die bisherige Deklaration:

    VB.NET-Quellcode

    1. Dim kartenzahlencaro() As String = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "010", "011", "012", "013"}
    2. Dim kartenzahlenpik() As String = {"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "110", "111", "112", "113"}
    3. Dim kartenzahlenkreuz() As String = {"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "210", "211", "212", "213"}
    4. Dim kartenzahlenherz() As String = {"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "310", "311", "312", "313"}
    5. Dim kartengesamt() As String = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "010", "011", "012", "013" & vbCrLf &
    6. "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "110", "111", "112", "113" & vbCrLf &
    7. "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "210", "211", "212", "213" & vbCrLf &
    8. "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "310", "311", "312", "313"}
    Dann hast du schonmal die falsche Herangehensweise.
    Du brauchst eine Architektur. Stell es dir vor wie in echt: Du hast mehrere Karten(Objekte), alle Karten sind vom Prinzip her ähnlich, gleiche Form/Größe/Material, schließlich sind es alles Karten. d.h. du machst dir einen Datentypen für die Karten, Wertigkeit und ähnliches kannst du dann jeder Karte einzeln vergeben(wovon auch immer das später abhängt). Eine feste Nummerierung brauchen die Karten dann womöglich gar nicht mehr, da schließlich jede Karte durch ein Objekt repräsentiert wird.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hier das aktuelle Problem:

    VB.NET-Quellcode

    1. Dim Kartendeck As New List(Of String)
    2. Dim kartengesamt() As String = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "010", "011", "012", "013" & vbCrLf &
    3. "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "110", "111", "112", "113" & vbCrLf &
    4. "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "210", "211", "212", "213" & vbCrLf &
    5. "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "310", "311", "312", "313"}
    6. Private Sub Spiel_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Kartendeck.Add(kartengesamt) ' hier der Fehler bei kartengesamt
    8. End Sub


    "Der Wert vom Typ "1-dimensionales Array von String" kann nicht in "String" konvertiert werden."
    jvbsl hat doch schon erwähnt das du falsch da dran gehst. Mach dir eine Klasse Karte, davon führst du dann deine Liste.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Card
    2. Public Color As Colors
    3. Public Value As Values
    4. Private ColorStrings() As String = {"Images/Heart", "Images/Diamond", "Images/Spade", "Images/Club"}
    5. Public Sub New(CardColor As Colors, value As Values)
    6. Color = CardColor
    7. Me.Value = value
    8. End Sub
    9. Public Enum Colors
    10. Heart = 0
    11. Diamond = 1
    12. Spade = 2
    13. Club = 3
    14. End Enum
    15. Public Enum Values
    16. Two = 0
    17. Tree = 1
    18. Four = 2
    19. Fife = 3
    20. Six = 4
    21. Seven = 5
    22. Eight = 6
    23. Nine = 7
    24. Ten = 8
    25. Jack = 9
    26. Queen = 10
    27. King = 11
    28. Ace = 12
    29. End Enum
    30. Public Overloads Function ToString() As String
    31. Return String.Format("{0} : {1}", Value.ToString, Color.ToString)
    32. End Function
    33. Public Function GetValue() As Integer
    34. Return CInt(Value)
    35. End Function
    36. Public Function GetColor() As Integer
    37. Return CInt(Color)
    38. End Function
    39. Public Sub DrawCard(g As Graphics, p As Point, s As Size)
    40. Dim bmp As Image = Image.FromFile(String.Format("{0}{1}.png", ColorStrings(Color), CInt(Value)))
    41. g.DrawImage(bmp, New Rectangle(p, s))
    42. End Sub
    43. End Class


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

    über Visual_Prog reg ich mich grad bischen auf.
    Erst fragt er was, was nicht die Bohne mit seim Problem zu tun hat, statt sein Prob gleich zu Anfang richtig zu schildern.

    Und dann ignoriert er vollkommen jvbsl's Hinweis, dass er um Spielkarten abzubilden ein Datenmodell braucht (eine Klasse ist ja auch ein Datenmodell), und labert einfach weiter sein Selbstgespräch.

    :(
    oh ich hatte den Post von jvbsl einfach überlesen...

    VB.NET-Quellcode

    1. Public Sub New(CardColor As Colors, value As Values)
    2. Color = CardColor
    3. Me.Value = value ' Was macht diese Sub genau??
    4. End Sub


    VB.NET-Quellcode

    1. Public Overloads Function ToString() As String
    2. Return String.Format("{0} : {1}", Value.ToString, Color.ToString) ' Was passiert hier? Ich weiss das eine überladund dazu da ist, Prozeduren mit gleichen namen und unterschiedlichen Datentypen zu behandeln, aber was genau macht das string.format und die zeile dahinter?




    ich möchte mein kartenspiel ohne grafiken machen, kann ich das hier deleten?

    VB.NET-Quellcode

    1. Public Sub DrawCard(g As Graphics, p As Point, s As Size)
    2. Dim bmp As Image = Image.FromFile(String.Format("{0}{1}.png", ColorStrings(Color), CInt(Value)))
    3. g.DrawImage(bmp, New Rectangle(p, s))
    4. End Sub
    5. End Function

    1. da ist keine Sub, die was genau macht - jedenfalls nicht in der Zeile, wo die Frage steht. Falls du die ganze Sub meinst, das ist eine Sub New, also ein Konstruktor. Grundlagen: Fachbegriffe
    2. ToString() ist falsch modifiziert - es muss OverRides heissen, nicht OverLoads
      Ansonsten passiert da genau, was da steht: Es wird ein String gebildet, in dem Value und Color der Karte aufgeführt werden, und dieser String wird returnt
    3. Ja, mach dir das zum Prinzip: Was du nicht brauchst - löschen. Mit Vorsicht, und evtl. vorher Backup machen, aber was man nicht braucht - löschen. Kaum etwas macht ein Proggi schwerer verständlich als unnötiger Code darin.

    Dankbar wäre ich auch, wenn du den Thread-Titel ändertest - "Telefonvorwahl" ist das absolut irreführendste, was ich mir vorstellen kann.

    Es geht ( wenn es denn darum geht ) um ein Kartenspiel ohne grafische Oberfläche.

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

    Visual_Prog schrieb:

    VB.NET-Quellcode

    1. Dim bmp As Image = Image.FromFile(String.Format("{0}{1}.png", ColorStrings(Color), CInt(Value)))
    Das CInt() kannst Du in diesem Kontext weglassen.
    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!
    Jo, man kann so einiges weglassen an Murdocks Code:

    VB.NET-Quellcode

    1. Public Class Card
    2. Public Enum Colors : Heart : Diamond : Spade : Club : End Enum
    3. Public Enum Values : Two : Tree : Four : Fife : Six : Seven : Eight : Nine : Ten : Jack : Queen : King : Ace : End Enum
    4. Public ReadOnly Color As Colors
    5. Public ReadOnly Value As Values
    6. Public Sub New(CardColor As Colors, value As Values)
    7. Color = CardColor
    8. Me.Value = value
    9. End Sub
    10. Public Overrides Function ToString() As String
    11. Return String.Format("{0} : {1}", Value, Color)
    12. End Function
    13. End Class
    So ists recht hübscher und selbsterklärnder Code eines Karten-Datenmodells:
    Die Karte hat eine Farbe und einen Wert.
    Es gibt 4 Farben, und 13 Werte - ganz wie im richtigen Leben :D

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

    ErfinderDesRades schrieb:

    Public Sub New(CardColor As Colors, value As Values)
    Color = CardColor
    Me.Value = value
    End Sub
    Hätte ich aus rein ästhetischen Gründen konsequenter codiert:

    Visual Basic-Quellcode

    1. ​Public Sub New(CardColor As Colors, CardValue As Values)
    2. Color = CardColor
    3. Value = CardValue
    4. End Sub

    Wahrscheinlich hätte ich auch für Colors und Values ein Singular gemacht.
    Damit man eine Kartenfarbe z.B. mit CardColor.Heart angeben kann.
    Aber das ist jetzt schon recht pingelig und wahrscheinlich auch Ansichtssache.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    VB.NET-Quellcode

    1. 'Ich raffe diese Zeilen leider immer noch nicht ganz.
    2. Public Sub New(CardColor As Colors, CardValue As Values) ' Jetzt wurde ein konstruktor erstellt. Also ein neue Objekt des Datentyp ja? Dann wird CardColor als Colors definiert, was vorher als Enumeration definiert wurde. Ebenso mit CardValue / Values. Heisst das jetzt einfach, dass z.B. die Variable CardColor dem vorher definierten Datentyp Colors entspricht?
    3. Color = CardColor ' Wieso wird hier nun Color = CardColor gesetzt? Das ist doch unnoetig doer nicht? Was bringt denn das ?^^
    4. Value = CardValue
    5. End Sub

    naja, ich denke, einiges wird klarer, wenn du mal ein Kartenspiel damit zusammenstellst:

    VB.NET-Quellcode

    1. Private _Deck As New List(Of Card)
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. For col = Card.Colors.Heart To Card.Colors.Club
    4. For value = Card.Values.Two To Card.Values.Ace
    5. _Deck.Add(New Card(col, value))
    6. Next
    7. Next
    8. For Each card In _Deck
    9. MessageBox.Show(card.ToString)
    10. Next
    11. End Sub
    Zähl nach - es sind 52 - wie im richtigen Leben :D

    Visual_Prog schrieb:

    Color = CardColor ' Wieso wird hier nun Color = CardColor gesetzt? Das ist doch unnoetig doer nicht?
    CardColor ist ein Parameter des Konstruktors.
    Der ist flüchtig und existiert nach Beendigung des Konstruktor-Codes nicht mehr.
    Erst durch die Zuweisung an die auf Klassenebene definierte Property Color bleibt er für die Lebenszeit des Objekts erhalten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Visual_Prog schrieb:

    immer noch nicht ganz
    Du solltest Dir mal ansehen, welche Daten in welchen Varioablen im Programm hinterlegt sind.
    Setz nen Haltepunkt rein, klick auf eine Variable und drück Shift+F9.
    Gugst Du auch hier.
    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!

    VB.NET-Quellcode

    1. Public Sub New(CardColor As Colors, CardValue As Values)
    2. Color = CardColor
    3. Value = CardValue
    4. End Sub


    Kann man das obige nicht einfach so schreiben? Wenn Color = CardColor kann man das doch gleich im Konstruktoren so schreiben oder nicht?

    VB.NET-Quellcode

    1. Public Sub New(Color As Colors, CardValue As Values)
    2. Value = CardValue
    3. End Sub