blackjackprogramm |
10.01.2016, 17:50 | Auf diesen Beitrag antworten » | ||||||||||
hosenboy244 | blackjackprogramm #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:51 | Auf diesen Beitrag antworten » | ||||||||||
hosenboy244 | 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, 18:13 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl |
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:
|
||||||||||
10.01.2016, 19:22 | Auf diesen Beitrag antworten » | ||||||||||
hosenboy244 | habe es jetzt so gemacht, aber es stürzt immer ab, weiß jemand rat? #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; } |
||||||||||
Anzeige | |||||||||||
|
|||||||||||
10.01.2016, 20:04 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Wie bereits geschrieben:
ist falsch. Richtig wäre
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. |
|