Programma in C sulla roulette

di il
8 risposte

Programma in C sulla roulette


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

  • Re: Programma in C sulla roulette

    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?
  • Re: Programma in C sulla roulette

    Perfetto grazie mille dei consigli. Comunque la numerazione inizia da 1 e termina a 36
  • Re: Programma in C sulla roulette

    In realtà nella roulette esiste anche lo zero (0) e in quella americana il doppio zero (00)
  • Re: Programma in C sulla roulette

    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?
  • Re: Programma in C sulla roulette

    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.
  • Re: Programma in C sulla roulette

    Capito, e se stessi usando un char, basterebbe mettere al posto di variabile la variabile che è stata precedentemente usata nella scanf?
  • Re: Programma in C sulla roulette

    A scanso di equivoci prova a scrivere un programmino che per 5 volte legga da tastiera un char e lo stampi a video!
  • Re: Programma in C sulla roulette

    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