C++: Ausgabe der Hand beim Kartenspielen

Neue Frage »

Arigatoo Auf diesen Beitrag antworten »
C++: Ausgabe der Hand beim Kartenspielen
Meine Frage:
Hallo zusammen!

Ich versuche folgende Vorversion eines Blackjack-Spiels zu programmieren:

Ein Spieler erhält beim Kartenspielen zunächst 2 Karten aus einem Stapel, der unendlich oft die Karten enthält. Dann zieht er so lange weiter, bis der Handwert >=21 ist. Nach jedem Zug werden ihm seine aktuelle Hand und der Handwert angezeigt.

Die Karten sollen erzeugt werden mittels
code:
1:
2:
srand( time( NULL ) );
zufallszahl = rand();


Meine Ideen:
Ein Problem ist, dass man die Anzahl gezogener Karten nicht weiß, sonst könnte ich einfach die integer-Variablen k_1, k_2, ..., k_5 (oder so) definieren, die dann in die char-Variablen h_1, h_2, ..., h_5 umgewandelt werden.

Meine Idee ist, die Zufallszahlen aus sein zu lassen, die den Karten entsprechen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
int zufallszahl() {
    srand( time( NULL ) );
    zufallszahl = rand() % 14+1;    
}

char umwandeln {
    switch( zufallszahl ) {
        case 1 || 11:
            zufallszahl = 'A';
        case 12:
            zufallszahl = 'B';
        case 13:
            zufallszahl = 'D';
        case 14:
            zufallszahl = 'K'; 
    }
    return ???;
}

void startkarten() {
    zufallszahl();
    k_1 = zufallszahl;
    h_1 = umwandeln( k_1 ); 
    zufallszahl();
    k_2 = zufallszahl;
    h_2 = umwandeln( k_2 );
    return;
}

void naechste_karte() {
    zufallszahl();
    k_n = zufallszahl;
    h_n = umwandeln( k_n );
    return;
}

Die Handsumme ist ja noch recht einfach:
code:
1:
2:
3:
4:
5:
int handsumme( k_1, k_2, k_n ) {
    k_n = k_1 + k_2 + k_n;
    summe = k_n;
    return summe;
}

Aber ich habe keine Ahnung, wie ich die Hand ausgeben soll, da die "Länge" der Hand ja dynamisch ist (mit jedem Zug eine Karte mehr wird). Vielleicht über ein Array in der main-Funktion?:
code:
1:
2:
3:
char hand[i] = ???;
std::cout << "Deine Hand ist " << hand << "." std::endl;
i++;
HAL 9000 Auf diesen Beitrag antworten »

Mehrere Anmerkungen:

1) Es mutet ein wenig seltsam an, dass du mit der globalen Variable zufallszahl arbeitest, die noch dazu verwirrenderweise exakt denselben Namen trägt wie die Funktion, die dieser Variablen einen Wert zuweist. Für mich wäre es einleuchtender, ohne globale Variable zu arbeiten mittels

code:
1:
2:
3:
int zufallszahl() {
    return rand() % 14+1;
}
Der Initialisierungsaufruf srand(time(NULL)) sollte überdies nur einmal im gesamten Programmablauf geschehen, zweckmäßigerweise vor dem allerersten rand-Aufruf.

2) In C mag es ja so sein, dass char (für Zeichen) zuweisungskompatibel zu int-Variablen ist. Ist trotzdem in Hinblick Typenstrenge kein guter Stil.

3) k_1, k_2, k_n sind immer genau drei Werte, und nicht etwa Werte mit variabler Anzahl , wie der letzte Bezeichner suggeriert...

4) Willst du direkt die Werte 1..14 summieren? Ich bin zwar kein BlackJack-Experte, meine mich aber zu erinnern, dass Bube/Dame/König mitnichten die Werte 12,13,14 haben, sondern einheitlich 10,10,10. Insofern brauchst du eine "Übersetzung" zwischen Kartenindex und Kartenwert - das ist dir hoffentlich bewusst.


Generell solltest du mal darüber nachdenken, ob derlei Fragen nicht besser hier

http://www.informatikerboard.de

aufgehoben sind.
Finn_ Auf diesen Beitrag antworten »

Ich würde auch empfehlen, möglichst auf globale Variablen zu verzichten. Die Alternative dazu ist, den Programmzustand in einer struct zu speichern.

Ein kurzes Beispiel dazu:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
#include <iostream>

struct Zustand{
    unsigned int Zufallszahl;
};

void neue_Zufallszahl(Zustand* z){
    z->Zufallszahl = rand()%14+1;
}

unsigned int Zufallszahl(const Zustand* z){
    return z->Zufallszahl;
}

int main(){
    Zustand z;
    for(int i=0; i<10; i++){
        neue_Zufallszahl(&z);
        std::cout << Zufallszahl(&z) << std::endl;
    }
}
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »