Programma su gioco
Ho scritto il programma su un gioco chiamato craps .
Al primo lancio di dadi si vince se la somma è 7 o 11.
Si perde se è 2,3,12.Altro valore è detto punto.Se nel successivo lancio si realizza il punto nuovamente , si vince , se si realizza 7 si perde.
Ma succede che va in loop e non so gestirlo.
Al primo lancio di dadi si vince se la somma è 7 o 11.
Si perde se è 2,3,12.Altro valore è detto punto.Se nel successivo lancio si realizza il punto nuovamente , si vince , se si realizza 7 si perde.
Ma succede che va in loop e non so gestirlo.
#include <stdio.h> #include <time.h> #include <stdbool.h> int roll_dice(void); bool play_game (void); int main (void) { int c; int d; int s; char f; int perso=0; int vinto=0; srand((unsigned)time(NULL)); do{ c=1+rand()%6; d=1+rand()%6; s=c+d; if ( s==7 || s==11) { printf ("Tuo Lancio:%d\n",s); printf("Hai Vinto!\n"); vinto=vinto+1; goto L; }else{ if (s==2||s==3||s==12) { printf ("Tuo Lancio:%d\n",s); printf("Hai Perso!\n"); perso=perso+1; goto L; } else printf("Il punto e':%d\n",s); } if (play_game()==true){ printf("Hai Vinto!\n"); vinto=vinto+1; } if (play_game() == false){ printf("Hai Perso!\n"); perso=perso+1; } L: printf("\n"); printf("Se vuoi continuare premi y : "); scanf("%c",&f); printf("\n"); }while (f=='y'); printf("Vinte:%d Perse:%d",vinto,perso); return 0; } int roll_dice(void) { int a; int b; srand((unsigned)time(NULL)); a=1+rand()%6; b=1+rand()%6; return a+b; } bool play_game (void) { int s; if (roll_dice() == s){ printf("%d" ,roll_dice()); return true; } else if (roll_dice() == 7){ printf("%d" ,roll_dice()); return false; } else return play_game(); }
Risposte
"nadia89":
Ho scritto il programma su un gioco chiamato craps .
Al primo lancio di dadi si vince se la somma è 7 o 11.
Si perde se è 2,3,12.Altro valore è detto punto.Se nel successivo lancio si realizza il punto nuovamente , si vince , se si realizza 7 si perde.
Ma succede che va in loop e non so gestirlo.
#include <stdio.h> #include <time.h> #include <stdbool.h> int roll_dice(void); bool play_game (void); int main (void) { int c; int d; int s; char f; int perso=0; int vinto=0; srand((unsigned)time(NULL)); do{ c=1+rand()%6; d=1+rand()%6; s=c+d; if ( s==7 || s==11) { printf ("Tuo Lancio:%d\n",s); printf("Hai Vinto!\n"); vinto=vinto+1; goto L; }else{ if (s==2||s==3||s==12) { printf ("Tuo Lancio:%d\n",s); printf("Hai Perso!\n"); perso=perso+1; goto L; } else printf("Il punto e':%d\n",s); } if (play_game()==true){ printf("Hai Vinto!\n"); vinto=vinto+1; } if (play_game() == false){ printf("Hai Perso!\n"); perso=perso+1; } L: printf("\n"); printf("Se vuoi continuare premi y : "); printf("\n"); }while ( (f=getchar())=='y' ); printf("Vinte:%d Perse:%d",vinto,perso); return 0; } int roll_dice(void) { int a; int b; srand((unsigned)time(NULL)); a=1+rand()%6; b=1+rand()%6; return a+b; } bool play_game (void) { int s; if (roll_dice() == s){ printf("%d" ,roll_dice()); return true; } else if (roll_dice() == 7){ printf("%d" ,roll_dice()); return false; } else return play_game(); }
Io la prima cosa che cambierei sarebbe il controllo su char f per vedere se è y oppure no, ma anche così facendo ho notato che il programma funziona quando ad esempio il numero generato è 11.. se decido di continuare e mi genera ad esempio 8 il programma " esplode"...
Forse dovresti rivederlo tutto da capo...
si e proprio questa esplosione non riesco a capirla, anche perchè ho anche seguito i consigli del libro quindi vorrei capire perchè avviene il loop
Che compilatore usi? Perché su ogni mio compilatore mi dice chiaramente che manca la libreria in cui sono contenuti srand e rand, che sarebbe stdlib.
Sinceramente non comprendo il tuo amore per i goto: rendono il codice molto più difficile da leggere, correggere e mantenere. Trovo tra l'altro non capisco la ragione di usare funzioni che fanno cose che hai già messo nel ciclo.
Comunque in play_game c'é un roll_dice() == s che ha poco senso dato che s non è inizializzata.
Sinceramente non comprendo il tuo amore per i goto: rendono il codice molto più difficile da leggere, correggere e mantenere. Trovo tra l'altro non capisco la ragione di usare funzioni che fanno cose che hai già messo nel ciclo.
Comunque in play_game c'é un roll_dice() == s che ha poco senso dato che s non è inizializzata.
non l'ho inizializzata perchè credevo che il valore di s nel main si conservasse nelle funzioni.
s ha un valore acquisito nel main, quando chiamo la funzione play_game questo valore non si conserva?
come devo inizializzarla?
s ha un valore acquisito nel main, quando chiamo la funzione play_game questo valore non si conserva?
come devo inizializzarla?
"nadia89":
non l'ho inizializzata perchè credevo che il valore di s nel main si conservasse nelle funzioni.
s ha un valore acquisito nel main, quando chiamo la funzione play_game questo valore non si conserva?
come devo inizializzarla?
s non è una funzione globale e quindi le due s sono variabili diverse con lo stesso nome. Ma che libro stai usando? Mi sembra che abbia uno stile, per lo meno eccentrico, e che spieghi piuttosto male vari aspetti centrali.
Per quanto riguarda il programma immagino tu volessi fare qualcosa di questo tipo:
#include <stdio.h> #include <time.h> #include <stdbool.h> #include <stdlib.h> int roll_dice(void); bool play_game(int s); int main (void) { int s; char f; int perso=0; int vinto=0; srand((unsigned)time(NULL)); do { s = roll_dice(); if ( s==7 || s==11) { printf ("Tuo Lancio:%d\n",s); printf("Hai Vinto!\n"); vinto=vinto+1; } else if (s==2||s==3||s==12) { printf ("Tuo Lancio:%d\n",s); printf("Hai Perso!\n"); perso=perso+1; } else { printf("Il punto e':%d\n",s); if (play_game(s)==true) { printf("Hai Vinto!\n"); vinto=vinto+1; } else { printf("Hai Perso!\n"); perso=perso+1; } } printf("Se vuoi continuare premi y: "); f = getchar(); getchar(); } while (f == 'y'); printf("Vinte:%d Perse:%d",vinto,perso); return 0; } int roll_dice(void) { int a; int b; /*srand((unsigned)time(NULL));*/ a=1+rand()%6; b=1+rand()%6; return a+b; } bool play_game(int s) { int a = roll_dice(); if (a == s) { printf("%d\n", a); return true; } else if (a == 7) { printf("%d\n", a); return false; } else return play_game(s); }
Non so come mai su code::block ti funziona anche se esplicitare stdlib. Ma non farlo è contro lo standard e il codice non funziona con gli altri compilatori.
c'è solo un piccolo problema,quando esce un punto il lancio successivo è sempre il punto come se la rand non cambi..
La prima risposta sicuramente inefficace sarebbe creare una roll_dice2() di questo tipo ed usarla nel caso in cui sia punto:
int roll_dice2(void) { int s; /*srand((unsigned)time(NULL));*/ s=7+rand()%6; return s; }
Sinceramente non dovrebbe venire lo stesso risultato.
Tieni comunque conto che la somma di due variabili uniformi non è una variabile uniforme.
Le relative probabilità in questo caso sono:
\(\displaystyle f_2 = 1/36 \approx 2,8%\)
\(\displaystyle f_3 = 2/36 = 1/18 \approx 5,6%\)
\(\displaystyle f_4 = 3/36 = 1/12 \approx 8,3%\)
\(\displaystyle f_5 = 4/36 = 1/9 \approx 11,1%\)
\(\displaystyle f_6 = 5/36 \approx 13,9%\)
\(\displaystyle f_7 = 6/36 = 1/6 \approx 16,7%\)
\(\displaystyle f_8 = 5/36 \approx 13,9%\)
\(\displaystyle f_9 = 4/36 = 1/9 \approx 11,1%\)
\(\displaystyle f_{10} = 3/36 = 1/12 \approx 8,3%\)
\(\displaystyle f_{11} = 2/36 = 1/18 \approx 5,6%\)
\(\displaystyle f_{12} = 1/36 \approx 2,8%\)
La probabilità che due risultati si ripetano è:
\(\displaystyle p = \sum_{n=2}^{12} f_n^2 = \frac{1}{1296}\biggl(36 + 2\sum_{n=1}^{5} n^2\biggr) = \frac{1}{1296}\bigl(36 + 110\bigr) = \frac{146}{1296} \approx 22,26%\) che è quasi una probabilità su 4 a dire il vero...
Nel tuo caso specifico il risultato richiede un po' più di calcoli perché solo in alcuni casi si raddoppia il lancio.
Tieni comunque conto che la somma di due variabili uniformi non è una variabile uniforme.
Le relative probabilità in questo caso sono:
\(\displaystyle f_2 = 1/36 \approx 2,8%\)
\(\displaystyle f_3 = 2/36 = 1/18 \approx 5,6%\)
\(\displaystyle f_4 = 3/36 = 1/12 \approx 8,3%\)
\(\displaystyle f_5 = 4/36 = 1/9 \approx 11,1%\)
\(\displaystyle f_6 = 5/36 \approx 13,9%\)
\(\displaystyle f_7 = 6/36 = 1/6 \approx 16,7%\)
\(\displaystyle f_8 = 5/36 \approx 13,9%\)
\(\displaystyle f_9 = 4/36 = 1/9 \approx 11,1%\)
\(\displaystyle f_{10} = 3/36 = 1/12 \approx 8,3%\)
\(\displaystyle f_{11} = 2/36 = 1/18 \approx 5,6%\)
\(\displaystyle f_{12} = 1/36 \approx 2,8%\)
La probabilità che due risultati si ripetano è:
\(\displaystyle p = \sum_{n=2}^{12} f_n^2 = \frac{1}{1296}\biggl(36 + 2\sum_{n=1}^{5} n^2\biggr) = \frac{1}{1296}\bigl(36 + 110\bigr) = \frac{146}{1296} \approx 22,26%\) che è quasi una probabilità su 4 a dire il vero...
Nel tuo caso specifico il risultato richiede un po' più di calcoli perché solo in alcuni casi si raddoppia il lancio.
Ma riconosco che il programma dovrebbe andare bene ma quando compilo succede che esce il punto e subito dopo di nuovo punto.
Può essere un problema di compilatore?
Poi perchè nel modo in cui l'ho fatto io andava in loop?
Può essere un problema di compilatore?
Poi perchè nel modo in cui l'ho fatto io andava in loop?