Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Sonstige Fragen » blackjackprogramm » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen blackjackprogramm
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
hosenboy244
unregistriert
blackjackprogramm Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

// NOTE: Nehmen Sie an, dass die Karten eines Decks wie folgt nummeriert sind:
// 0="Karo 2", 1="Karo 3", ... 12="Karo Ass", 13="Herz 2", ... 51="Kreuz Ass".
char *farben[4] = {"Karo","Herz","Pik","Kreuz"};
char *werte[13] = {"2","3","4","5","6","7","8","9","10","Bube","Dame","Koenig","Ass"};

// Diese Funktion gibt für einen Index "i" die zugehörige Karte aus.
// NOTE: Diese Funktion ist fertig und braucht nicht modifiziert zu werden.
void gibKarteAus( int i ) {
printf("%s %s", farben[i/13], werte[i%13]);
}


// Mit dieser Funktion wird eine zufällige (noch nicht gezogene) Karte aus dem Deck gezogen.
// NOTE: Diese Funktion ist fertig und braucht nicht modifiziert zu werden.
int zieheKarte( int *gezogen ) {
int i = 52;
do {
i = (int) rand()*(52.0/RAND_MAX);
} while ( i==52 || gezogen[i]==1 );
gezogen[i] = 1;
return i;
}


// Diese Funktion gibt den Wert der Karte mit Index "i" aus.
int kartenwert( int i ) {

int wert=0;
switch(i){
case 0:
wert = 2;
break;
case 1:
wert = 3;
break;
case 2:
wert = 4;
break;
case 3:
wert = 5;
break;
case 4:
wert = 6;
break;
case 5:
wert = 7;
break;
case 6:
wert = 8;
break;
case 7:
wert = 9;
break;
case 8:
wert = 10;
break;
case 9:
wert = 10;
break;
case 10:
wert = 10;
break;
case 11:
wert = 10;
break;
case 12:
wert = 11;
break;
case 13:
wert = 2;
break;
case 14:
wert = 3;
break;
case 15:
wert = 4;
break;
case 16:
wert = 5;
break;
case 17:
wert = 6;
break;
case 18:
wert = 7;
break;
case 19:
wert = 8;
break;
case 20:
wert = 9;
break;
case 21:
wert = 10;
break;
case 22:
wert = 10;
break;
case 23:
wert = 10;
break;
case 24:
wert = 10;
break;
case 25:
wert = 11;
break;
case 26:
wert = 2;
break;
case 27:
wert = 3;
break;
case 28:
wert = 4;
break;
case 29:
wert = 5;
break;
case 30:
wert = 6;
break;
case 31:
wert = 7;
break;
case 32:
wert = 8;
break;
case 33:
wert = 9;
break;
case 34:
wert = 10;
break;
case 35:
wert = 10;
break;
case 36:
wert = 10;
break;
case 37:
wert = 10;
break;
case 38:
wert = 11;
break;
case 39:
wert = 2;
break;
case 40:
wert = 3;
break;
case 41:
wert = 4;
break;
case 42:
wert = 5;
break;
case 43:
wert = 6;
break;
case 44:
wert = 7;
break;
case 45:
wert = 8;
break;
case 46:
wert = 9;
break;
case 47:
wert = 10;
break;
case 48:
wert = 10;
break;
case 49:
wert = 10;
break;
case 50:
wert = 10;
break;
case 51:
wert = 11;
break;
}
// TODO: Berechnen Sie den Wert der Karte mit Index "i".
// Verwenden Sie eine switch-case Anweisung.
// NOTE: Bube, Dame, Koenig haben den Wert 10, Ass den Wert 11.
// Alle anderen Karten haben den darauf abgebildeten Wert.


return wert;
}


// Diese Funktion entscheidet, ob der Computer eine Karte zieht.
// Zieht er eine Karte, so wird der Wert der Karte zurückgegeben, sonst -1.
// NOTE: Diese Funktion ist fertig und braucht nicht modifiziert zu werden.
int computerEntscheidung( int *gezogen, int computerWert ) {
int i, anzNichtGezogen = 0, wertNichtGezogen = 0;
for ( i=0; i<52; i++ )
if ( gezogen[i] == 0 ) {
wertNichtGezogen += kartenwert(i);
anzNichtGezogen++;
}
double durchschnitt = wertNichtGezogen/anzNichtGezogen;
if ( durchschnitt <= 21-computerWert ) return zieheKarte( gezogen );
else return -1;
}


int main(void) {

int i, gezogen[52], n=1;
int meinZaehler=0, computerZaehler=0;
int meinWert=0, computerWert=0;
int jemandNimmt = 1;
char c;

srand(time(NULL));
int spieler[8];
int computer[8];

// TODO: Legen Sie zwei Felder an, in welchen jeweils die gezogenen Karten
// des Benutzers und Computers gespeichert werden.
// NOTE: Wählen Sie eine geeignete Feldlänge
// (wie viele Karten kann Spieler maximal ziehen ohne sich zu überkaufen?).


for ( i=0; i<52; i++ )
gezogen[i] = 0;

while ( jemandNimmt ) {
jemandNimmt = 0;

printf("Runde %d!\nMoechten Sie eine Karten ziehen? (j/n): ", n++ );
scanf("%c", &c );
getchar();
if ( c == 'j' ) {
jemandNimmt++;
i = zieheKarte(gezogen);
spieler[meinZaehler] = i;
meinWert = meinWert + kartenwert(spieler[meinZaehler]);


// TODO: Nehmen Sie mit der Funktion "zieheKarte" eine Karte aus dem Deck.
// Speichern Sie diese Karte im Feld, welches sich die Karten des Benutzers merkt.
// Addieren Sie den Wert der gezogenen Karte zur Summe der Kartenwerte des Benutzers.

printf("Sie haben die Karte \""); gibKarteAus(i);
printf("\" gezogen. Ihr Gesamtkartenwert lautet %d\n", meinWert );
if ( meinWert > 21 ) {
printf("Sie haben sich ueberkauft und somit leider verloren. :-(\n\n");
return 0;
}
meinZaehler++;
}

// NOTE: Der Computer Entscheidet ob er eine Karte zieht (siehe oben)
i = computerEntscheidung( gezogen, computerWert );

if ( i==-1 )
printf("Der Computer hat nicht gezogen\n");
else {
jemandNimmt++;
computer[computerZaehler] = i;
computerWert = computerWert + kartenwert(i);


// TODO: Fuegen Sie die Karte "i" in das Feld ein,
// welches sich die Karten merkt, die der Computer gezogen hat.
// Addieren Sie den Wert der Karte "i" zur Summe der Kartenwerte des Computers.

computerZaehler++;
printf("Der Computer hat eine Karte gezogen\n");

if ( computerWert > 21 ) {
printf("Der Computer hat sich ueberkauft, Sie haben gewonnen! :-)\n");
printf("Karten des Computers: ");
for (int g = 0; g <= computerZaehler; g++){
gibKarteAus(computer[g]);
}
printf("Summe der Kartenwerte Computer: %i,Summe der Kartenwerte Spieler: %i",computerWert, meinWert );

// TODO: Geben Sie alle Karten aus, die der Computer gezogen hat.
// Geben Sie auch die Summe der Kartenwerte aus.

return 0;
}
}
printf("\n");
}
for (int k = 0; k <= computerZaehler; k++){
gibKarteAus(computer[k]);
}
for (int j = 0; j <= meinZaehler; j++){
gibKarteAus(spieler[j]);
}
if ( meinWert > computerWert){
printf("Spieler hat gewonnen");
} else if (meinWert > computerWert){
printf("Computer hat gewonnen");
} else {
printf("unentschieden");
}
// TODO: Geben Sie alle Karten des Benutzers und des Computers aus.
// Geben Sie aus, wer gewonnen hat.

return 0;
}
10.01.2016 17:50
hosenboy244
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Wo ist hier der Fehler? Habe leider vergessen das an den anfang zu schreiben. Das ist ein Blackjackprogramm, doch es funktioniert nicht wie ich es will.

(Sorry für schlechtes deutsch.)
10.01.2016 17:51
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
2:
3:
4:
5:
6:
for (int k = 0; k <= computerZaehler; k++){
gibKarteAus(computer[k]);
}
for (int j = 0; j <= meinZaehler; j++){
gibKarteAus(spieler[j]);
}

mache aus dem <= jeweils ein <. Auch dann wenn der Computer sich überkauft hat.

Und weil es gar so schrecklich ist, hier nochmal der switch-case Teil:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
switch(i%13) {
	case 12: //ASS
		wert = 11;
		break;
	case 9: //BUBE
	case 10: //DAME
	case 11: //KOENIG
		wert = 10;
		break;
	default: //2-10
		wert = i%13 + 2;
		break;
}


__________________
Syntax Highlighting fürs Board (Link)
10.01.2016 18:13 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
hosenboy244
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

habe es jetzt so gemacht, aber es stürzt immer ab, weiß jemand rat? unglücklich

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

// NOTE: Nehmen Sie an, dass die Karten eines Decks wie folgt nummeriert sind:
// 0="Karo 2", 1="Karo 3", ... 12="Karo Ass", 13="Herz 2", ... 51="Kreuz Ass".
char *farben[4] = {"Karo","Herz","Pik","Kreuz"};
char *werte[13] = {"2","3","4","5","6","7","8","9","10","Bube","Dame","Koenig","Ass"};

// Diese Funktion gibt für einen Index "i" die zugehörige Karte aus.
// NOTE: Diese Funktion ist fertig und braucht nicht modifiziert zu werden.
void gibKarteAus( int i ) {
printf("%s %s", farben[i/13], werte[i%13]);
}


// Mit dieser Funktion wird eine zufällige (noch nicht gezogene) Karte aus dem Deck gezogen.
// NOTE: Diese Funktion ist fertig und braucht nicht modifiziert zu werden.
int zieheKarte( int *gezogen ) {
int i = 52;
do {
i = (int) rand()*(52.0/RAND_MAX);
} while ( i==52 || gezogen[i]==1 );
gezogen[i] = 1;
return i;
}


// Diese Funktion gibt den Wert der Karte mit Index "i" aus.
int kartenwert( int i ) {

int wert=0;
switch(i%13) {
case 12:
wert = 11;
break;
case 9:
case 10:
case 11:
wert = 10;
break;
default:
wert = i%13 + 2;
break;
}

// TODO: Berechnen Sie den Wert der Karte mit Index "i".
// Verwenden Sie eine switch-case Anweisung.
// NOTE: Bube, Dame, Koenig haben den Wert 10, Ass den Wert 11.
// Alle anderen Karten haben den darauf abgebildeten Wert.


return wert;
}


// Diese Funktion entscheidet, ob der Computer eine Karte zieht.
// Zieht er eine Karte, so wird der Wert der Karte zurückgegeben, sonst -1.
// NOTE: Diese Funktion ist fertig und braucht nicht modifiziert zu werden.
int computerEntscheidung( int *gezogen, int computerWert ) {
int i, anzNichtGezogen = 0, wertNichtGezogen = 0;
for ( i=0; i<52; i++ )
if ( gezogen[i] == 0 ) {
wertNichtGezogen += kartenwert(i);
anzNichtGezogen++;
}
double durchschnitt = wertNichtGezogen/anzNichtGezogen;
if ( durchschnitt <= 21-computerWert ) return zieheKarte( gezogen );
else return -1;
}


int main(void) {

int i, gezogen[52], n=1;
int meinZaehler=0, computerZaehler=0;
int meinWert=0, computerWert=0;
int jemandNimmt = 1;
char c;

srand(time(NULL));
int spieler[8];
int computer[8];

// TODO: Legen Sie zwei Felder an, in welchen jeweils die gezogenen Karten
// des Benutzers und Computers gespeichert werden.
// NOTE: Wählen Sie eine geeignete Feldlänge
// (wie viele Karten kann Spieler maximal ziehen ohne sich zu überkaufen?).


for ( i=0; i<52; i++ )
gezogen[i] = 0;

while ( jemandNimmt ) {
jemandNimmt = 0;

printf("Runde %d!\nMoechten Sie eine Karten ziehen? (j/n): ", n++ );
scanf("%c", &c );
getchar();
if ( c == 'j' ) {
jemandNimmt++;
i = zieheKarte(gezogen);
spieler[meinZaehler] = i;
meinWert = meinWert + kartenwert(spieler[meinZaehler]);


// TODO: Nehmen Sie mit der Funktion "zieheKarte" eine Karte aus dem Deck.
// Speichern Sie diese Karte im Feld, welches sich die Karten des Benutzers merkt.
// Addieren Sie den Wert der gezogenen Karte zur Summe der Kartenwerte des Benutzers.

printf("Sie haben die Karte \""); gibKarteAus(i);
printf("\" gezogen. Ihr Gesamtkartenwert lautet %d\n", meinWert );
if ( meinWert > 21 ) {
printf("Sie haben sich ueberkauft und somit leider verloren. :-(\n\n");
return 0;
}
meinZaehler++;
}

// NOTE: Der Computer Entscheidet ob er eine Karte zieht (siehe oben)
i = computerEntscheidung( gezogen, computerWert );

if ( i==-1 )
printf("Der Computer hat nicht gezogen\n");
else {
jemandNimmt++;
computer[computerZaehler] = i;
computerWert = computerWert + kartenwert(i);


// TODO: Fuegen Sie die Karte "i" in das Feld ein,
// welches sich die Karten merkt, die der Computer gezogen hat.
// Addieren Sie den Wert der Karte "i" zur Summe der Kartenwerte des Computers.

computerZaehler++;
printf("Der Computer hat eine Karte gezogen\n");

if ( computerWert > 21 ) {
printf("Der Computer hat sich ueberkauft, Sie haben gewonnen! :-)\n");
printf("Karten des Computers: ");
for (int g = 0; g <= computerZaehler; g++){
gibKarteAus(computer[g]);
}
printf("Summe der Kartenwerte Computer: %i,Summe der Kartenwerte Spieler: %i",computerWert, meinWert );

// TODO: Geben Sie alle Karten aus, die der Computer gezogen hat.
// Geben Sie auch die Summe der Kartenwerte aus.

return 0;
}
}
printf("\n");
}
printf("Karten des Computers:\n");
for (int k = 0; k <= computerZaehler; k++){
gibKarteAus(computer[k]);
}
printf("Karten des Spielers:\n");
for (int j = 0; j <= meinZaehler; j++){
gibKarteAus(spieler[j]);
}
if ( meinWert > computerWert){
printf("Spieler hat gewonnen");
} else if (meinWert < computerWert){
printf("Computer hat gewonnen");
} else {
printf("unentschieden");
}
// TODO: Geben Sie alle Karten des Benutzers und des Computers aus.
// Geben Sie aus, wer gewonnen hat.

return 0;
}
10.01.2016 19:22
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Wie bereits geschrieben:
code:
1:
2:
3:
for (int k = 0; k <= computerZaehler; k++){
    gibKarteAus(computer[k]);
}

ist falsch.
Richtig wäre
code:
1:
2:
3:
for (int k = 0; k < computerZaehler; k++){
    gibKarteAus(computer[k]);
}

Deine Schleife geht um 1 zu weit. Das bewirkt, dass du eine Karte ausgeben willst, die mit großer Wahrscheinlichkeit nicht im Bereich [0,...,51] liegt, was bei GibKarteAus zu einem Speicherzugriff außerhalb des Arrays mit den Kartenfarben führt.
Analog mit der Ausgabe der Spielerkarten.

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 10.01.2016 20:04.

10.01.2016 20:04 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Sonstige Fragen » blackjackprogramm