Tombola codice in C help

di il
7 risposte

Tombola codice in C help

Ciao Ragazzi rispolvero un vecchio post sul gioco della tombola, e con mia già annessa domanda al link:
https://www.iprogrammatori.it/forum-programmazione/cplusplus/sempre-tombola-generazione-delle-tabelle-t12663-45.html?hilit=tombola#p8555586
, ma vorrei riproporla in un nuovo quesito, Dopo il primo ciclo viene stampato 1 e poi vari giocatori hanno vari risultati, e non è possibile inoltre inserire un una altro valore da tastiera, si blocca il CMD, l' utente Joysurrender, dice di aver risolto grazie ad errori in if nella funzione controllo, ma seguqndo i vari consigli come mai si bolcca

 #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int rnd ,pos_riga, ambo=0, terno=0, quaterna=0, quintina=0, tombola=0, estratto;
    int CB[4][9],G1[4][10],G2[4][10],G3[4][10],G4[4][10],G5[4][10],TAB[90];

    void controllo()
    {
        int i,j;
        int col=10;
        int rig=3;
        for (i=0; i<3; i++) {
        for (j=0; j<col; j++) {
        if (G1[i][j] == estratto) { G1[i][col] += 1; }
        if (G2[i][j] == estratto) { G2[i][col] += 1; }
        if (G3[i][j] == estratto) { G3[i][col] += 1; }
        if (G4[i][j] == estratto) { G4[i][col] += 1; }
        if (G5[i][j] == estratto) { G5[i][col] += 1; }
        }
        }
        //Controllo ambo
        if (ambo==0) {
                for (i=0; i<3; i++) {
        if (G1[i][col] == 2) {printf("\nIl giocatore 1 ha fatto ambo!\n");}
        if (G2[i][col] == 2) {printf("\nIl giocatore 2 ha fatto ambo!\n");}
        if (G3[i][col] == 2) {printf("\nIl giocatore 3 ha fatto ambo!\n");}
        if (G4[i][col] == 2) {printf("\nIl giocatore 4 ha fatto ambo!\n");}
        if (G5[i][col] == 2) {printf("\nIl giocatore 5 ha fatto ambo!\n");}
        if (G1[i][col] || G2[i][col] || G3[i][col] || G4[i][col] || G5[i][col] == 2) {ambo = 1;}
        }
        }
        //Controllo terno
        if (ambo == 1 && terno==0) {
                for (i=0; i<3; i++) {
        if (G1[i][col] == 3) {printf("\nIl giocatore 1 ha fatto terno!\n");}
        if (G2[i][col] == 3) {printf("\nIl giocatore 2 ha fatto terno!\n");}
        if (G3[i][col] == 3) {printf("\nIl giocatore 3 ha fatto terno!\n");}
        if (G4[i][col] == 3) {printf("\nIl giocatore 4 ha fatto terno!\n");}
        if (G5[i][col] == 3) {printf("\nIl giocatore 5 ha fatto terno!\n");}
        if (G1[i][col] || G2[i][col] || G3[i][col] || G4[i][col] || G5[i][col] == 3) {terno = 1;}
        }
        }
        //Controllo quaterna
        if (terno == 1 && quaterna==0) {
                for (i=0; i<3; i++) {
        if (G1[i][col] == 4) {printf("\nIl giocatore 1 ha fatto quaterna!\n");}
        if (G2[i][col] == 4) {printf("\nIl giocatore 2 ha fatto quaterna!\n");}
        if (G3[i][col] == 4) {printf("\nIl giocatore 3 ha fatto quaterna!\n");}
        if (G4[i][col] == 4) {printf("\nIl giocatore 4 ha fatto quaterna!\n");}
        if (G5[i][col] == 4) {printf("\nIl giocatore 5 ha fatto quaterna!\n");}
        if (G1[i][col] || G2[i][col] || G3[i][col] || G4[i][col] || G5[i][col] == 4) {quaterna = 1;}
        }
        }
        //Controllo quintina
        if (quaterna == 1 && quintina == 0) {
                for (i=0; i<3; i++) {
        if (G1[i][col] == 5) {printf("\nIl giocatore 1 ha fatto quintina!\n");}
        if (G2[i][col] == 5) {printf("\nIl giocatore 2 ha fatto quintina!\n");}
        if (G3[i][col] == 5) {printf("\nIl giocatore 3 ha fatto quintina!\n");}
        if (G4[i][col] == 5) {printf("\nIl giocatore 4 ha fatto quintina!\n");}
        if (G5[i][col] == 5) {printf("\nIl giocatore 5 ha fatto quintina!\n");}
        if (G1[i][col] || G2[i][col] || G3[i][col] || G4[i][col] || G5[i][col] == 5) {quintina = 1;}
        }
        }
    }
    
	void AzzeraTAB()
	{
		for(int i=0;i<90;i++)
    	TAB[i]=0;
	}
    void estrazione()
	{
		void controllo();
    	int rnd;
    	do rnd = rand()%90; //genero un numero nuovo fino a quando non è stato estratto
    	while (TAB[rnd]!=0 );
    	estratto=rnd+1;
    	printf("%d ",estratto);
    	TAB[rnd] = 1;
    	getchar();
    	controllo();
   }
     
    int massimo_per_riga() {  // funzione che controlla se nella riga ci sono 5 valori , in caso positivo restituisce true , altrimenti false
        int i, cont=0;
        for (i=0; i<9; i++) {
            if (CB[pos_riga][i] != 0) cont++;
        }
        if (cont == 5) return 1;
        else return 0;
    }

    int pieno(int appoggio) {     // Se ci sono due valori diversi da 0 nella colonna appoggio allora restituisce true alrimenti false
        int i, cont=0;
        for (i = 0; i<3; i++) {
            if (CB[i][appoggio] != 0) cont++;
        }
        if (cont == 2) return 1;
        else return 0;
    }

    int inserisci (int appoggio) {
        int i;
        int continuo=1;
        if (pieno(appoggio))  // se nella colonna ci sono già due valori allora false diretto
            return 0;
        else {
            for (i = 0; i<3; i++) {    // controllo se esiste il valore nella colonna indicata da appoggio
                if (CB[i][appoggio] == rnd)
                    return 0;
            }   // se finisce il for significa che non esiste il valore rnd nella colonna appoggio
            while (continuo) {   // va a prendere la posizione della riga in cui non c'è già un valore nella colonna
                pos_riga = rand()%3;   // la riga deve essere casuale , almeno così è dall' immagine che mi hai dato
                if (CB[pos_riga][appoggio] == 0)
                  break;
            }
            if (!massimo_per_riga()) return 1;
            else return 0;
        }
    }


    void genera()  {
     int i, j, appoggio;
        for (i=0; i<3; i++) {
            for (j=0; j<9; j++) {
                CB[i][j]=0;}}
                for (i=0; i<15; i++)  {  // 15 sta per quanti numeri devono essere inseriti nella matrice
            rnd = 1+(rand()%90);   // genera da 1 a 90
            appoggio = (rnd-1)/10;  // indicherà la colonna
            if (appoggio == 9) appoggio = 8; // se il numero è 90 deve stare nella colonna 8
            if (!inserisci(appoggio)) i--;  // se non è stato inserito ripeti il ciclo
            else {
                CB[pos_riga][appoggio] = rnd;
            }
        }
    }

    int main () {
        srand(time(NULL));
        int i,j;
        for (i=1; i<= 90; i++) TAB[i] = i;
        genera();
        printf("\nGiocatore 1:\n");
        for (i=0; i<3; i++){ for (j=0; j<9; j++){G1[i][j] = CB[i][j]; }}
        for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G1[i][j] == 0) printf("\t"); else printf("%d\t",G1[i][j]); }}
        genera();
        printf("\nGiocatore 2:\n");
        for (i=0; i<3; i++){ for (j=0; j<9; j++){G2[i][j] = CB[i][j]; }}
        for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G2[i][j] == 0) printf("\t"); else printf("%d\t",G2[i][j]); }}
        genera();
        printf("\nGiocatore 3:\n");
        for (i=0; i<3; i++){ for (j=0; j<9; j++){G3[i][j] = CB[i][j]; }}
        for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G3[i][j] == 0) printf("\t"); else printf("%d\t",G3[i][j]); }}
        genera();
        printf("\nGiocatore 4:\n");
        for (i=0; i<3; i++){ for (j=0; j<9; j++){G4[i][j] = CB[i][j]; }}
        for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G4[i][j] == 0) printf("\t"); else printf("%d\t",G4[i][j]); }}
        genera();
        printf("\nGiocatore 5:\n");
        for (i=0; i<3; i++){ for (j=0; j<9; j++){G5[i][j] = CB[i][j]; }}
        for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G5[i][j] == 0) printf("\t"); else printf("%d\t",G5[i][j]); }}
        getchar();
        printf("\n");
        do estrazione(); while (tombola == 0);
        if (tombola==1) printf("\nTombola!!\nPremere un tasto per finire.");
        getchar();
        return 0 ;
        }

    
    

7 Risposte

  • Re: Tombola codice in C help

    Non si capisce assolutamente nulla dalla tua spiegazione ... utilizzare delle frasi di senso compiuto in italiano non è difficile ed è necessazione a da come scrivi, ho intuito solo che c'è qualcosa che non va nella funzione controllo e, in effetti, queste if sono tutte sbagliate

    if (G1[col] || G2[col] || G3[col] || G4[col] || G5[col] == 2) {ambo = 1;}

    if (G1[col] || G2[col] || G3[col] || G4[col] || G5[col] == 3) {terno = 1;}

    if (G1[i][col] || G2[i][col] || G3[i][col] || G4[i][col] || G5[i][col] == 4) {quaterna = 1;}

    if (G1[i][col] || G2[i][col] || G3[i][col] || G4[i][col] || G5[i][col] == 5) {quintina = 1;}

    In C le condizioni devono essere ripetute, non va inserita solo l'ultima
  • Re: Tombola codice in C help

    Si infatti hai capito bene ho un problema con le condizioni di vincita nella funzione controllo puoi aiutarmi?
  • Re: Tombola codice in C help

    T'ho già aiutato ...

    Programmi in C da tanto tempo, rivedi come si scrivono le if quando ci sono tanti confronti legati da OR
  • Re: Tombola codice in C help

    Si grazie mille non c ho pensato subito e ora ho corretto,
    ora un ulteriore problema che ho rilevato è di fatti, che quando avviene una vincita, non viene stampato il numero ad esempio la stampa avviene cosi:
    89 // numero estratto
    // spazio
    il giocatore 1 ha fatto ambo,
    allora mi chiedo ma con quale numero?
    come posso vedere in output?
  • Re: Tombola codice in C help

    Se hai un altro problema apri un altro thread, che non diventi una lunga chat ... e magari con un titolo che faccia capire meglio ...
  • Re: Tombola codice in C help

    Ciao ragazzi sto completando il codice di un gioco di tombola, eseguendo il codice, mi sono accorto che quando vado a stampare i risultati avviene un errore di stampa, ovvero esempio di stampa:
    36// numero estratto
    48 // numero estratto

    giocatore ( i-esimo ) ha fatto ambo,
    ma andando a verificare sulle cartelle i numeri che sono stati estratti non danno una vincita
    e ciò mi ha spinto a capire che il numero che permette l' ambo non è visualizzato

    un ulteriore esempio è:

    85 // numero estratto

    giocatore 1 ha fatto ambo

    giocatore 3 ha fatto terno

    giocatore 2 h fatto quaterna

    vi posto il codice per aiutarmi a capire come posso porre rimedio:
    
     #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
    
        int rnd ,pos_riga, ambo=0, terno=0, quaterna=0, quintina=0, tombola=0, estratto;
        int CB[4][9],G1[4][10],G2[4][10],G3[4][10],G4[4][10],G5[4][10],TAB[90];
    
        void controllo()
        {
            int i,j;
            int col=10;
            int rig=3;
            for (i=0; i<3; i++) {
            for (j=0; j<col; j++) {
            if (G1[i][j] == estratto) { G1[i][col] += 1; }
            if (G2[i][j] == estratto) { G2[i][col] += 1; }
            if (G3[i][j] == estratto) { G3[i][col] += 1; }
            if (G4[i][j] == estratto) { G4[i][col] += 1; }
            if (G5[i][j] == estratto) { G5[i][col] += 1; }
            }
            }
            //Controllo ambo
            if (ambo==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][col] == 2) {printf("\nIl giocatore 1 ha fatto ambo!\n");}
            if (G2[i][col] == 2) {printf("\nIl giocatore 2 ha fatto ambo!\n");}
            if (G3[i][col] == 2) {printf("\nIl giocatore 3 ha fatto ambo!\n");}
            if (G4[i][col] == 2) {printf("\nIl giocatore 4 ha fatto ambo!\n");}
            if (G5[i][col] == 2) {printf("\nIl giocatore 5 ha fatto ambo!\n");}
            if ((G1[i][col] == 2) || (G2[i][col] == 2) || (G3[i][col] == 2 ) || (G4[i][col] == 2) || ( G5[i][col] == 2)) {ambo = 1;}
            }
            }
            //Controllo terno
            if (ambo == 1 && terno==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][col] == 3) {printf("\nIl giocatore 1 ha fatto terno!\n");}
            if (G2[i][col] == 3) {printf("\nIl giocatore 2 ha fatto terno!\n");}
            if (G3[i][col] == 3) {printf("\nIl giocatore 3 ha fatto terno!\n");}
            if (G4[i][col] == 3) {printf("\nIl giocatore 4 ha fatto terno!\n");}
            if (G5[i][col] == 3) {printf("\nIl giocatore 5 ha fatto terno!\n");}
            if ((G1[i][col] == 3) || (G2[i][col] == 3) || (G3[i][col] == 3 ) || (G4[i][col] == 3) || ( G5[i][col] == 3)) {terno = 1;}
            }
            }
            //Controllo quaterna
            if (terno == 1 && quaterna==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][col] == 4) {printf("\nIl giocatore 1 ha fatto quaterna!\n");}
            if (G2[i][col] == 4) {printf("\nIl giocatore 2 ha fatto quaterna!\n");}
            if (G3[i][col] == 4) {printf("\nIl giocatore 3 ha fatto quaterna!\n");}
            if (G4[i][col] == 4) {printf("\nIl giocatore 4 ha fatto quaterna!\n");}
            if (G5[i][col] == 4) {printf("\nIl giocatore 5 ha fatto quaterna!\n");}
            if ((G1[i][col] == 4) || (G2[i][col] == 4) || (G3[i][col] == 4 ) || (G4[i][col] == 4) || ( G5[i][col] == 4)) {quaterna = 1; }
            }
            }
            //Controllo quintina
            if (quaterna == 1 && quintina == 0) {
                    for (i=0; i<3; i++) {
            if (G1[i][col] == 5) {printf("\nIl giocatore 1 ha fatto quintina!\n");}
            if (G2[i][col] == 5) {printf("\nIl giocatore 2 ha fatto quintina!\n");}
            if (G3[i][col] == 5) {printf("\nIl giocatore 3 ha fatto quintina!\n");}
            if (G4[i][col] == 5) {printf("\nIl giocatore 4 ha fatto quintina!\n");}
            if (G5[i][col] == 5) {printf("\nIl giocatore 5 ha fatto quintina!\n");}
            if ((G1[i][col] == 5) || (G2[i][col] == 5) || (G3[i][col] == 5) || (G4[i][col] == 5) || ( G5[i][col] == 5)) {quintina = 1;}
            }
            }
        }
        int estrazione()
    	{
    		void controllo();
        	int rnd;
        	rnd = rand()%90; //genero un numero nuovo fino a quando non è stato estratto
        	if (TAB[rnd] == 0) return 0; else {
            estratto = TAB[rnd];
            printf("%d ",estratto);
        	getchar(); }
        	controllo();
       }
         
        int massimo_per_riga() {  // funzione che controlla se nella riga ci sono 5 valori , in caso positivo restituisce true , altrimenti false
            int i, cont=0;
            for (i=0; i<9; i++) {
                if (CB[pos_riga][i] != 0) cont++;
            }
            if (cont == 5) return 1;
            else return 0;
        }
    
        int pieno(int appoggio) {     // Se ci sono due valori diversi da 0 nella colonna appoggio allora restituisce true alrimenti false
            int i, cont=0;
            for (i = 0; i<3; i++) {
                if (CB[i][appoggio] != 0) cont++;
            }
            if (cont == 2) return 1;
            else return 0;
        }
    
        int inserisci (int appoggio) {
            int i;
            int continuo=1;
            if (pieno(appoggio))  // se nella colonna ci sono già due valori allora false diretto
                return 0;
            else {
                for (i = 0; i<3; i++) {    // controllo se esiste il valore nella colonna indicata da appoggio
                    if (CB[i][appoggio] == rnd)
                        return 0;
                }   // se finisce il for significa che non esiste il valore rnd nella colonna appoggio
                while (continuo) {   // va a prendere la posizione della riga in cui non c'è già un valore nella colonna
                    pos_riga = rand()%3;   // la riga deve essere casuale , almeno così è dall' immagine che mi hai dato
                    if (CB[pos_riga][appoggio] == 0)
                      break;
                }
                if (!massimo_per_riga()) return 1;
                else return 0;
            }
        }
    
    
        void genera()  {
         int i, j, appoggio;
            for (i=0; i<3; i++) {
                for (j=0; j<9; j++) {
                    CB[i][j]=0;}}
                    for (i=0; i<15; i++)  {  // 15 sta per quanti numeri devono essere inseriti nella matrice
                rnd = 1+(rand()%90);   // genera da 1 a 90
                appoggio = (rnd-1)/10;  // indicherà la colonna
                if (appoggio == 9) appoggio = 8; // se il numero è 90 deve stare nella colonna 8
                if (!inserisci(appoggio)) i--;  // se non è stato inserito ripeti il ciclo
                else {
                    CB[pos_riga][appoggio] = rnd;
                }
            }
        }
    
        int main () {
            srand(time(NULL));
            int i,j;
            for (i=1; i<= 90; i++) TAB[i] = i;
            genera();
            printf("\nGiocatore 1:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G1[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G1[i][j] == 0) printf("\t"); else printf("%d\t",G1[i][j]); }}
            genera();
            printf("\nGiocatore 2:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G2[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G2[i][j] == 0) printf("\t"); else printf("%d\t",G2[i][j]); }}
            genera();
            printf("\nGiocatore 3:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G3[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G3[i][j] == 0) printf("\t"); else printf("%d\t",G3[i][j]); }}
            genera();
            printf("\nGiocatore 4:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G4[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G4[i][j] == 0) printf("\t"); else printf("%d\t",G4[i][j]); }}
            genera();
            printf("\nGiocatore 5:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G5[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G5[i][j] == 0) printf("\t"); else printf("%d\t",G5[i][j]); }}
            getchar();
            printf("\n");
            do estrazione(); while (tombola == 0);
            if (tombola==1) printf("\nTombola!!\nPremere un tasto per finire.");
            getchar();
            return 0 ;
            }
    
    Vorrei inoltre chiedervi, come posso far in modo che vendano estratti i novanta numeri casualmente senza ripetizione? esiste una specifica formula che posso applicare nel rand, oppure che ne dite, se costruisco un array ordinato da 1 a 90 e vi accedo casualmente, cancellando a ogni passo i numeri estratti? fatemi sapere
  • Re: Tombola codice in C help

    Il primo quesito non si capisce ... e non sapendo come usi quegli array e cosa rappresentano, è impossibile darti spiegazioni.

    Per il secondo quesito, come ti ho detto tante volte, dovresti aprire un thread apposito, con titolo opportuno.
    Comunque lo fai inserendo i dati in un vettore (all'inizio da 1 a 90), scegli un valore random ed estrai il contenuto dell'elemento selezionato, poi sposti l'ultimo elemento nel primo e scegli da 1 a 89 ... e così via ...

    Se non hai capito, ad esempio con 3 numeri farai

    a[0]=1
    a[1]=2
    a[2]=3

    scegli random tra 0 e 2, supponiamo 1, quindi selezioni il valore

    a[1] ----> 2

    Poi avrai

    a[0]=1
    a[1]=3

    e così via...
Devi accedere o registrarti per scrivere nel forum
7 risposte