blackjackprogramm |
hosenboy244 unregistriert
|
|
#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
|
|
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 |
|
|
|
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 |
|
|
hosenboy244 unregistriert
|
|
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;
}
|
|
10.01.2016 19:22 |
|
|
|