Erzeugen eines Kartenspiels

8

Ich versuche ein einfaches Blackjack-Programm zu machen. Leider habe ich Probleme mit der Erstellung eines Kartenspiels.

%Vor%

Ich weiß, dass mein Problem darin besteht, dass ich versuche, einem Char den Wert '10' zuzuweisen. Natürlich konnte ich das nicht zum Kompilieren bringen, aber ich bin sicher, wenn ich versuche, die Kartenwerte dem Vektordeck zuzuordnen, erhalte ich auch einen Fehler, da ich den Variablentyp 'char' verwendet habe. Zu wissen, welche Art von Variablentyp verwendet wird, scheint mich zu töten. Außerdem würde 'deck.push_back (card [j] suit [i]);' sei der richtige Code, um die Karte und den Anzug zu kombinieren, oder musst du etwas zwischen Karte [j] und Anzug [i] legen? Ich würde es begrüßen, wenn einer von euch mich in die richtige Richtung führen könnte. Auch als kleine Randnotiz ist dies Teil einer Hausaufgabe, bitte geben Sie mir nicht nur ganze Code-Blöcke. Danke für deine Hilfe.

    
blcArmadillo 24.10.2008, 17:00
quelle

12 Antworten

12

Versuchen Sie, die Klasse der Karte mit Farbe und Karte als Mitglied zu erstellen, und legen Sie sie als Vektorart fest. Wie

%Vor%

auch enums anstelle von Zeichen in Anzug und Karte würde es klarer machen.

    
JtR 24.10.2008, 17:05
quelle
31

Ich denke, was Sie suchen, ist eine Aufzählung. Es macht Ihren Code klarer und löst Ihr Problem.

%Vor%     
Kevin 24.10.2008 17:08
quelle
9

Die Art und Weise, wie Sie es modellieren, hängt davon ab, was Sie tun möchten.

Erstellen Sie ein echtes Spiel und die Datenstrukturen müssen nur das Gameplay unterstützen?

Wenn ja, würde ich eine Kartenklasse erstellen, mit einem Aufzählungsfeld für die Klage und einem numerischen Typ (mit den Werten 1 - 13) für den Nennwert.

Wenn Sie andererseits eine Analyseanwendung oder einen KI-Player erstellen, ist das Modell möglicherweise ein wenig anders.

Vor ein paar Jahren schrieb ich einen Simulator, um Wahrscheinlichkeiten in verschiedenen Texas Hold'em-Szenarien zu berechnen, und ich wollte, dass er Zahlen wirklich schnell knackt. Ich begann mit einem sehr einfachen Modell (Kartenklasse, Suit Enum, etc), aber nach viel Profiling und Optimierung, endete ich mit einer bitweisen Darstellung.

Jede Karte war ein 16-Bit-Wert, wobei die dreizehn höherwertigen Bits den Nennwert, die zwei niedrigwertigen Bits die Farbe und das Bit [2] ein spezielles Flag darstellten, das ein Ass anzeigte (nur in Fälle, in denen das Ass in einer A2345-Gerade erscheint).

Hier sind ein paar Beispiele:

%Vor%

Man kann sich vorstellen, wie schnell man mit einem Design wie diesem nach Paaren, Dreiecken und Geraden sucht (Flushes sind etwas komplizierter).

Ich werde nicht auf die einzelnen Operationen eingehen, aber es genügt zu sagen, dass diese Art von Modell Millionen von Operationen pro Sekunde unterstützt ...

Bedenken Sie natürlich, ich befürworte nicht, dass Sie ein Design wie dieses in einer einfachen Spielimplementierung verwenden. Der einzige Grund, warum ich mit diesem Design endete, ist, weil ich massive statistische Simulationen durchführen musste.

Denken Sie also genau darüber nach, wie Sie modellieren möchten:

  • Jede Karte
  • Die Hand eines Spielers
  • Das gesamte Deck
  • Der Zustand des Tisches ... einschließlich aller Spielerhände (einschließlich der Spieler, die ihre Starthand geteilt haben), vielleicht eines Schuhs mit sechs Decks, des Ablagestapels usw.

Das gesamte Anwendungsmodell und die Ziele der Anwendung im Allgemeinen bestimmen weitgehend die Arten von Datenstrukturen, die am besten geeignet sind.

Viel Spaß !!!

    
benjismith 24.10.2008 17:34
quelle
6

Verwenden Sie "T" anstelle von 10.

    
Dave 24.10.2008 17:02
quelle
5

Haben Sie versucht, J durch 11, Q durch 12 und K durch 13 zu ersetzen? Dann könnten Sie int egers anstatt char acters verwenden. Ersetzen Sie 11-13 später durch den entsprechenden Buchstaben.

    
Ross 24.10.2008 17:02
quelle
3

Nun, zunächst ist Deck [0] ein Char, aber Sie versuchen, "2h" hineinzustopfen. (Für den Moment werden wir das ignorieren, wie Sie das tun, ist falsch.)

Im Grunde musst du ein Deck erstellen vector<std::string> . Machen Sie eine Karte mit einem Array von const char * s und konvertieren Sie die Elemente in string.

verwende dann:

%Vor%     
James Curran 24.10.2008 17:06
quelle
2

Wie von anderen erwähnt, können Sie für die Figuren "T" für zehn, J, Q und K verwenden. Soweit push_back .. da deck ist ein Vektor von Zeichen, können Sie nur ein Zeichen an push_back als Argument übergeben. Das Übergeben des Kartenwerts (1 ... 9, T, J, Q, K) und seiner Suite funktioniert nicht.

Ich persönlich würde eine kleine Struktur erstellen, um eine Karte mit einer Value- und einer Suite-Eigenschaft darzustellen. Dann können Sie Ihr Kartenspiel zu einem Vektor von Karten machen.

Bearbeitet: letztes Wort seit Vektor (kleiner als) behoben Karte (größer als) wurde als Vektor gerendert (nichts).

    
FOR 24.10.2008 17:06
quelle
2

Dies könnte nicht kompiliert werden, aber hier ist der Ansatz, den ich hätte (und verwendet haben). Sie werden ints verwenden, um Ihre Karten zu repräsentieren, aber Sie können dies leicht in einer Klasse abstrahieren. Was ich für dich schreiben werde.

%Vor%

Jetzt ist es sehr einfach, zu dieser Klasse hinzuzufügen, um alles, was Sie wollen, daraus zu machen. Um die Liste zu erstellen, ist es so einfach wie unten.

%Vor%

Müssen Sie mischen?

%Vor%

Wie sieht es mit dem Wert der ersten Karte aus?

%Vor%

Ich habe nichts davon kompiliert, aber es sollte in der Nähe sein.

    
RCornelius 25.10.2008 02:04
quelle
1

Da dies ein Blackjack-Programm ist, werden Sie den Wert der Karten hinzufügen und vergleichen.

Wenn das der Fall ist, können Sie sich zusätzliche Programmierung und Schmerzen ersparen, indem Sie die Werte int (1-13) anstelle von char -Werten angeben.

    
Drek 24.10.2008 17:13
quelle
1

Als ich mein C ++ Kartenspiel erstellte, stieß ich auf ein paar eigene Probleme. Zuerst versuchte ich meine PHP-Kartenspiel-Klasse nach C ++ zu konvertieren, mit minimalem Aufwand Glück. Ich beschloss, mich hinzusetzen und es einfach zu Papier zu bringen. Ich entschied mich für ein objektorientiertes Setup, hauptsächlich weil ich denke, dass es am einfachsten zu verwenden ist. Ich benutze die Objekte Karte und Deck . Wenn du zum Beispiel 10 Decks in den Schuh deines Blackjack-Spiels legen willst, dann musst du könnte 10 Decks erstellen, was einfach genug wäre, weil ich beschlossen habe, alles selbst zu machen. In der Tat ist es so eigenständig, um deinen Schuh zu erschaffen, wäre der Code:

%Vor%

Aber das war für die Einfachheit, nicht unbedingt notwendig in kleineren Spielen, wo Sie nur ein einziges Deck brauchen.

Wie auch immer das generiert hat , habe ich ein Array mit 52 Karten-Objekten erstellt Decks sind einfach genug, weil du weißt, dass du 4 Suits und 13 Karten in jeder Farbe hast, du weißt auch, dass du 2,3,4,5 hast , 6,7,8,9,10, Jack, Königin, König, Ass in jedem einzelnen Anzug . Diese werden sich nie ändern. Also habe ich zwei Loops verwendet, einen für den Suit und den anderen für den Value .

Es war so etwas:

%Vor%

Nun werden Sie feststellen, dass ich in jeder einzelnen dieser Schleifen einen ganzzahligen Wert verwende. Der Grund ist einfach, Karten sind Zahlen. 4 Anzüge. 13 Werte. Sogar der numerische Wert im Spiel Blackjack. Nenne den Wert, bis du auf Bildkarten triffst, die den numerischen Wert 10 haben, bis du Ace triffst, was der Zahlenwert 1 oder 11 ist. Alles ist Zahlen. Sie können also diese Zahlen verwenden, um nicht nur den Wert der Karte, sondern auch die Farbe der Karte und die Nummer in der numerischen Reihenfolge zuzuweisen.

Eine Idee wäre es, eine Map in der Card-Klasse mit den char- oder String-Namen der Karten zu speichern, wobei 1,2,3 ... die Indizes für jedes sind.

    
Travis Weston 07.05.2012 01:37
quelle
0

Ich würde mit Ross 'Vorschlag gehen, Ganzzahlen zu verwenden. Die meisten Kartenspiele werden einige Mathe-Zahlen beinhalten, so dass es eine bessere Darstellung ist.

Konvertiere bei der Ausgabe in 'A' oder 'ACE' usw.

    
Steve Fallows 24.10.2008 17:19
quelle
0

Da dies Hausaufgaben für C ++ sind, werde ich raten, dass von Ihnen erwartet wird, Klassen zu benutzen. Ansonsten benutze die Enums, und wenn dies C ist, benutze eine Struktur oder etwas.

Und für einige Spiele, abgesehen vom Punktewert, solltest du einen Rang für die Karte speichern, der vom aktuellen Spielmodus abhängt.

Ich habe nicht für immer C klar gemacht, aber ich meine so etwas:

%Vor%

Die Ausgabe sieht folgendermaßen aus:

%Vor%

Blackjack ist langweilig. Dieser Code wird kompiliert.

    
dlamblin 24.10.2008 18:41
quelle

Tags und Links