Programma in C sulla roulette

di Nexus99 il
8 risposte

Cattura.PNG
Cattura.PNG

Il programma da realizzare è questo. Non badate al fatto che debba essere svolto a partire da un altro programma, il prof ha scritto cosi perchè quell'altro programma contiene le funzioni rand() e altre cose simili, niente di più.
Il mio svolgimento è questo:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    int resto =100,puntata,mani,scommessa,X,seed,puntate=0;
    seed=time(NULL);
    srand(seed);
    for(mani=0;(mani<=10) ;mani++){
    
    X=rand()%37+1;
    do
    {
    printf("Inserire una quantita' valida di denaro da puntare\n");
    scanf("%d",&puntata);
    }
    while((puntata <= 0)||(puntata > resto));
    if ((puntata >0)&&(puntata <=resto))
    {
    printf("Hai puntato %d euro\n",puntata);
    printf("Se vuoi scommettere su Pari premi 1\n");
    printf("Se vuoi scommettere su Dispari premi 2\n");
    printf("Se vuoi scommettere che esca un numero maggiore uguale di 18  premi 3\n");
    printf("Se vuoi scommettere che esca un numero minore di 18  premi 4\n");
    puntate++;
    do{
    scanf("%d",&scommessa);
    }while((scommessa < 1)||(scommessa > 4));
    
    if(scommessa==1)
    {
    printf("Hai scommesso che esca un pari\n");
    }
    if(scommessa==2)
    {
    printf("Hai scommesso che esca un dispari\n");
    }
    if(scommessa==3)
    {
    printf("Hai scommesso che esca un numero maggiore uguale di 18\n");   
    }
    if(scommessa==4)
    {
    printf("Hai scommesso che esca un numero minore di 18\n");
    }

    printf("%d\n",X);
    if((scommessa==1)&&((X%2)==0))
    {
    printf("Hai vinto\n");
    puntata=puntata*2;
    resto = puntata+resto;
    printf("Ti rimangono %d euro\n",resto);
    }
    if((scommessa==1)&&((X%2)!=0))
    {
    printf("Hai perso\n");
    resto = resto - puntata;
    printf("Ti rimangono %d euro\n",resto);
    }
    if((scommessa==2)&&((X%2)!=0))
    {
    printf("Hai vinto\n");
    puntata = puntata*2;
    resto = puntata+resto;
    printf("Ti rimangono %d euro\n",resto);
    }
    if((scommessa==2)&&((X%2)==0))
    {
    printf("Hai perso\n");
    resto=resto-puntata;
    printf("Ti rimangono %d euro\n",resto);
    }
   if((scommessa==3)&&(X>=18))
    {
    printf("Hai vinto\n");
    puntata=puntata*2;
    resto = puntata+resto;
    printf("Ti rimangono %d euro\n",resto);
    }
    if((scommessa==3)&&(X<18))
    {
    printf("Hai perso\n");
    resto = resto - puntata;
    printf("Ti rimangono %d euro\n",resto);
    }
    if((scommessa==4)&&(X>=18))
    {
    printf("Hai perso\n");
    resto = resto - puntata;
    printf("Ti rimangono %d euro\n",resto);
    }
    if((scommessa==4)&&(X<18))
    {
    printf("Hai vinto\n");
    puntata=puntata*2;
    resto= resto+puntata;
    printf("Ti rimangono %d euro\n",resto);
    }
    if(resto <=0)
    {
    printf("Hai esaurito il denaro\n");
     printf("Hai giocato %d mani\n",mani);
    printf("Hai fatto %d puntate\n",puntate);
    exit(0);
    }
   }
}

     if(resto > 0)
    {
    printf("Hai vinto %d euro\n",resto);
    printf("Hai giocato %d mani\n",mani);
    printf("Hai fatto %d puntate\n",puntate);
    }

    return 0;
}
Mi chiedevo se ci fosse qualche modo di ottimizzarlo, o anche sistemare eventuali errori che a me sembrano non esserci

8 Risposte

  • Allora:
    - innanzitutto al fine di rendere il codice più chiaro e leggibile, ti consiglio di rispettare la spaziatura e l'indentazione e di scrivere una sola istruzione per riga;
    - ti conviene ripassare un po' la precedenza fra gli operatori in modo da evitare di mettere parentesi tonde lì dove non servono;
    - se ti capita dai anche una ripassatina agli operatori in notazione compatta (per esempio +=);
    - per quanto riguarda invece la parte logica del programma, anche se "funzionante", andrebbe rivista tutta a mio parere... fondamentalmente ci sono parecchie variabili e condizioni praticamente inutili;
    - relativamente alle vincite credo che la tua implementazione non sia "equa". Per esempio se ho 100 e punto 20, alla fine dovrò avere 80 se perdo e 120 (e non 140) se vinco. Forse hai male interpretato la traccia perché non consideri il fatto che i soldi puntati sono ormai sul "tavolo" e quindi non appartengono più al giocatore.

    In base a quanto detto in precedenza io farei qualcosa del genere:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    #define CREDITO 100
    #define MANI 10
    
    int main()
    {
        srand(time(NULL));
        int credito = CREDITO;
        int scommessa;
        int puntata;
        int mani;
        int flag;
        int n;
        for(mani = 0; mani < MANI && credito > 0; ++mani)
        {
            n = rand() % 37 + 1;
            printf("Il tuo credito e' %d\n", credito);
            do
            {
                printf("PUNTATA: ");
                scanf("%d", &puntata);
            }
            while(puntata <= 0 || puntata > credito);
            printf("Se vuoi scommettere su pari premi '0'\n");
            printf("Se vuoi scommettere su dispari premi '1'\n");
            printf("Se vuoi scommettere che esca un numero maggiore o uguale di 18 premi '2'\n");
            printf("Se vuoi scommettere che esca un numero minore di 18 premi '3'\n");
            do
            {
                printf("SCOMMESSA: ");
                scanf("%d", &scommessa);
            }
            while(scommessa < 0 || scommessa > 3);
            printf("Numero %d\n", n);
            if(scommessa < 2)
            {
                flag = scommessa == n % 2;
            }
            else
            {
                flag = scommessa == 2 && n >= 18 || scommessa == 3 && n < 18;
            }
            if(flag)
            {
                printf("HAI VINTO!\n");
                credito += puntata;
            }
            else
            {
                printf("HAI PERSO!\n");
                credito -= puntata;
            }
        }
        printf("Dopo %d mani il tuo credito e' %d", mani, credito);
        return 0;
    }
    
    P.S.
    Non sono un esperto del settore, ma questa roulette quanti numeri dovrebbe avere? E da quanto parte la numerazione?
  • Perfetto grazie mille dei consigli. Comunque la numerazione inizia da 1 e termina a 36
  • In realtà nella roulette esiste anche lo zero (0) e in quella americana il doppio zero (00)
  • Oggi questo esercizio è stato corretto dal prof in classe e mi ha fatto notare una cosa:
    Se non si svuota il buffer si può ottenere un ciclo infinito, infatti dalla sua versione del programma questo non succedeva.
    Il prof ha svuotato il buffer con il comando:
    while ((variabile=getchar())!='\n');
    A partire magari dal programma di Nippolo, come si applica questo comando?, quale variabile deve essere assegnato a getchar?
  • Il problema sollevato dal tuo professore nasce nel momento in cui si utilizza un char, ma nel tuo codice hai utilizzato un int per la scelta del tipo di scommessa, quindi quel comando non serve.
  • Capito, e se stessi usando un char, basterebbe mettere al posto di variabile la variabile che è stata precedentemente usata nella scanf?
  • A scanso di equivoci prova a scrivere un programmino che per 5 volte legga da tastiera un char e lo stampi a video!
  • So che sono passati un po' di giorni dalla conversazione, ma ci tenevo a evidenziare che il programma da te ideato non sia, secondo me al 100% compatto, io ne ho creato una mia versione, ovviamente per non complicare troppo ho deciso di seguire all'incirca il tuo programma, non che il tuo programma non funzioni, si tratta solo di semplificare e rendere il programma più leggibile:
    #include <stdio.h>
    #include <time.h>
    #include<stdlib.h>
    
    
    int main(){
    	
    	int capitale = 100;
    	int puntatetotali = 0;
    	int contamani = 0; 
    	int manirestanti = 0;
    	int numerop = 0;
    	int puntata = 0;
    	int guadagno = 0;
    	int perdita = 0;
    	int seed = 0;
    	int x = 0;
    	
    	for( int i = 0; i < 10; i++){
    		
    	seed = time(NULL);
    	srand(seed);
    	x = rand()%37+1;
    		
    	
    	printf ("\nSoldi a disposizione -> %d\n", capitale);
    	
    	printf ("\nDigitare 1 se si vuole puntare sui numeri pari");
    	printf ("\nDigitare 2 se si vuole puntare sui numeri dispari");
    	printf ("\nDigitare 3 se si vuole puntare sui numeri maggiori di 18");
    	printf ("\nDigitare 4 se si vuole puntare sui numeri minori di 18 ->\n");
    	scanf ("%d", &numerop);
    
        while (( numerop != 1) && ( numerop != 2) && ( numerop != 3) && ( numerop != 4)){
        	
        printf ("\nDigitare 1 se si vuole puntare sui numeri pari");
    	printf ("\nDigitare 2 se si vuole puntare sui numeri dispari");
    	printf ("\nDigitare 3 se si vuole puntare sui numeri maggiori di 18");
    	printf ("\nDigitare 4 se si vuole puntare sui numeri minori di 18\n");
    	scanf ("%d", &numerop);
    	
    	}
    
    	
    	printf ("\nInserire puntata desiderata ->\n");
    	scanf ("%d", &puntata);
    	printf("\nPuntata selezionata -> %d", puntata);
    	
    	while(( puntata > capitale ) || ( puntata < 0)){
    		
    	     printf ("\nInserire puntata desiderata, la puntata deve essere valida ->\n");
    	     scanf ("%d", &puntata);	
    	
    	}
    	
    	printf ("\nNumero uscito -> %d", x);
    	
    	capitale = capitale - puntata;
    	puntatetotali = puntatetotali + puntata;
    	
    
        if (( numerop == 1) && ( (x % 2) == 0)){
        	
        	puntata = puntata * 2;
        	capitale = capitale + puntata; 
    		printf("\nHAI VINTO, guadagno -> %d", puntata); 	
    	}
    	else if (( numerop == 1) && ( (x % 2) != 0)){
    	 
    	  	printf("\nHAI PERSO, perdita -> %d", puntata);
    	 	
    	}
    	
    	if (( numerop == 2) && ( (x % 2) != 0)){
    		
    		puntata = puntata * 2;
    		capitale = capitale + puntata;
    		printf("\nHAI VINTO, guadagno -> %d", puntata); 	
    	}
    		else if (( numerop == 2) && ( (x % 2) == 0)){
    	 
    	  	printf("\nHAI PERSO, perdita -> %d", puntata);
    	 	
    	}
    	
    	if (( numerop == 3) && ( x > 18)){
    		
    		puntata = puntata * 2;
    		capitale = capitale + puntata;
    		printf("\nHAI VINTO, guadagno -> %d", puntata); 	
    	}
    		else if (( numerop == 3) && ( x <= 18)){
    	 
    	  	printf("\nHAI PERSO, perdita -> %d", puntata);
    	 	
    	}
    	
    	if (( numerop == 4) && ( x < 18)){
    		
    		puntata = puntata * 2;
    		capitale = capitale + puntata;
    		printf("\nHAI VINTO, guadagno -> %d", puntata); 	
    	}
    		else if (( numerop == 4) && ( x >= 18)){
    	 
    	  	printf("\nHAI PERSO, perdita -> %d", puntata);
    	 	
    	}
        
        if ( capitale == 0){
        	
        	i = 10;
        	manirestanti = 0;
        	printf("\nBudget esaurito!");
        	printf ("\nMani giocate -> %d, Mani restanti -> %d\n", contamani, manirestanti);
    	}
    	else if ( capitale > 0){
    		
        contamani++;
        manirestanti = 10 - contamani;
        printf ("\nMani giocate -> %d, Mani restanti -> %d\n", contamani, manirestanti);
        
    	}
     
      }
      
         printf("\n\n\n\n\nPuntate totali -> %d", puntatetotali);
         printf("\nCredito -> %d", capitale);
    }
    Ecco cosa intendo...
Devi accedere o registrarti per scrivere nel forum
8 risposte