Sempre Tombola, generazione delle tabelle

di il
54 risposte

54 Risposte - Pagina 4

  • Re: Sempre Tombola, generazione delle tabelle

    Potresti essere più dettagliato con un non fa un bel niente? oppure incolli anche il main ( la parte interessata alla chiamata della funzione controllo ) . Comunque in generale se hai fatto in modo di utilizzare un' altra colonna allora quando dichiari le matrici falle 3x10 e non più 3x9
  • Re: Sempre Tombola, generazione delle tabelle

    Non fa niente nel senso che genera i numeri ma non mi fa la printf dei giocatori che hanno fatto terno, ecc...
    Ecco l'intero codice:
        #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];
    
        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]); }}
            getch();
            printf("\n\n");
            do estrazione(); while (tombola == 0);
            if (tombola==1) printf("\nTombola!!\nPremere un tasto per finire.");
            getch();
            return 0 ;
            }
    
        void estrazione()
        {
            int rnd;
            rnd = rand()%90;
            if (TAB[rnd] == 0) return 0; else {
            estratto = TAB[rnd];
            printf("%d ",estratto);
            TAB[rnd] = 0;
            getch(); }
            controllo();
        }
    
        void controllo()
        {
            int i,j;
            for (i=0; i<3; i++) {
            for (j=0; j<9; j++) {
            if (G1[i][j] == estratto) { G1[i][9] += 1; }
            if (G2[i][j] == estratto) { G2[i][9] += 1; }
            if (G3[i][j] == estratto) { G3[i][9] += 1; }
            if (G4[i][j] == estratto) { G4[i][9] += 1; }
            if (G5[i][j] == estratto) { G5[i][9] += 1; }
            }
            }
            //Controllo ambo
            if (ambo==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][9] == 2) {printf("\nIl giocatore 1 ha fatto ambo!\n");}
            if (G2[i][9] == 2) {printf("\nIl giocatore 2 ha fatto ambo!\n");}
            if (G3[i][9] == 2) {printf("\nIl giocatore 3 ha fatto ambo!\n");}
            if (G4[i][9] == 2) {printf("\nIl giocatore 4 ha fatto ambo!\n");}
            if (G5[i][9] == 2) {printf("\nIl giocatore 5 ha fatto ambo!\n");}
            if (G1[i][9] || G2[i][9] || G3[i][9] || G4[i][9] || G5[i][9] == 2) {ambo = 1;}
            }
            }
            //Controllo terno
            if (ambo == 1 && terno==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][9] == 3) {printf("\nIl giocatore 1 ha fatto terno!\n");}
            if (G2[i][9] == 3) {printf("\nIl giocatore 2 ha fatto terno!\n");}
            if (G3[i][9] == 3) {printf("\nIl giocatore 3 ha fatto terno!\n");}
            if (G4[i][9] == 3) {printf("\nIl giocatore 4 ha fatto terno!\n");}
            if (G5[i][9] == 3) {printf("\nIl giocatore 5 ha fatto terno!\n");}
            if (G1[i][9] || G2[i][9] || G3[i][9] || G4[i][9] || G5[i][9] == 3) {terno = 1;}
            }
            }
            //Controllo quaterna
            if (terno == 1 && quaterna==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][9] == 4) {printf("\nIl giocatore 1 ha fatto quaterna!\n");}
            if (G2[i][9] == 4) {printf("\nIl giocatore 2 ha fatto quaterna!\n");}
            if (G3[i][9] == 4) {printf("\nIl giocatore 3 ha fatto quaterna!\n");}
            if (G4[i][9] == 4) {printf("\nIl giocatore 4 ha fatto quaterna!\n");}
            if (G5[i][9] == 4) {printf("\nIl giocatore 5 ha fatto quaterna!\n");}
            if (G1[i][9] || G2[i][9] || G3[i][9] || G4[i][9] || G5[i][9] == 4) {quaterna = 1;}
            }
            }
            //Controllo quintina
            if (quaterna == 1 && quintina == 0) {
                    for (i=0; i<3; i++) {
            if (G1[i][9] == 5) {printf("\nIl giocatore 1 ha fatto quintina!\n");}
            if (G2[i][9] == 5) {printf("\nIl giocatore 2 ha fatto quintina!\n");}
            if (G3[i][9] == 5) {printf("\nIl giocatore 3 ha fatto quintina!\n");}
            if (G4[i][9] == 5) {printf("\nIl giocatore 4 ha fatto quintina!\n");}
            if (G5[i][9] == 5) {printf("\nIl giocatore 5 ha fatto quintina!\n");}
            if (G1[i][9] || G2[i][9] || G3[i][9] || G4[i][9] || G5[i][9] == 5) {quintina = 1;}
            }
            }
        }
    
    NB: Ho provato a fare una printf della decima colonna, funziona... vengono messi i valori al suo interno... quindi il problema sta nella if
  • Re: Sempre Tombola, generazione delle tabelle

    Devi modificare anche i cicli non saranno più j < 9 ma j < 10 , è indinspensabile per mettere la colonna 9 con valori tutti uguali a zero.
    
    void estrazione()
        {
            int rnd;
            rnd = rand()%90;
            if (TAB[rnd] == 0) return 0; else {
            estratto = TAB[rnd];
            printf("%d ",estratto);
            TAB[rnd] = 0;
            getch(); }
            controllo();
        }
    
    non ti da errore? estrazione è una funzione void perchè fai un return 0? e perchè la funzione controllo() la chiami fuori dall' if , quindi sempre? la devi chiamare quando il numero estratto non è stato mai uscito quindi nell' if
    fai direttamente questo:
    
    void estrazione()
        {
            int rnd;
            rnd = rand()%90;
            if (TAB[rnd] != 0)  {
            estratto = TAB[rnd];
            printf("%d ",estratto);
            TAB[rnd] = 0;
            controllo();
             }
        }
    
    Se non inserisci a 0 i valore della colonna 9 è facile che avendo valori casuali ti possa dare degli errori . Prova e dimmi un pò
  • Re: Sempre Tombola, generazione delle tabelle

    Sera a tutti. Una domanda Joy: ma perché usi i valori di TAB ? questo array non dovrebbe servirti solo per verificare se il numero è estratto o no (infatti ogni elemento di TAB equivale al corrispondente numero di indice + 1). Ad esempio, se TAB[3] è uguale a 0 , il numero '4' non è stato estratto (i numeri vanno da 1 a 90, gli indici da 0 a 89), invece se è diverso allora è estratto e devi generare un altro numero. dopo la verifica aggiungi 1 a 'rnd' così hai il numero giusto (se ad esempio 'rnd' dopo la rand() vale il massimo, cioè 89, prima fai il controllo su TAB[rnd], casomai con un while che ti genera il numero fino a quando TAB[rnd] è 0, e poi aggiungi 1 a rnd, così che hai il numero giusto 90), e poi prosegui con il controllo. potrebbe essere così:
    
    void estrazione(){
        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;
        getch();
        controllo();
    }
    
  • Re: Sempre Tombola, generazione delle tabelle

    Per funzionare, dovresti anche inizializzare tutti i valori di TAB a 0, per fare ciò puoi creare una funzione che ti azzera l'intera TAB, come questa ad esempio:
    
    void AzzeraTAB(){
    for(int i=0;i<90;i++)
        TAB[i]=0;
    }
    
    Per il resto AlessandroS ha colto nel segno, devi includere anche la nuova colonna nei cicli.
  • Re: Sempre Tombola, generazione delle tabelle

    Ok ragazzi, ho risolto.
    Gli errori che mi avete segnalato praticamente non esistono xD
    Magari sarebbe più corretto fare come dite voi, però così funziona perfettamente!
    Semplicemente sbagliavo con la if (come avevo intuito).
    Comunque ragazzi, vi ringrazio infinitamente!
    Devono farvi santi! xD
    Senza di voi non sarei riuscito a risolvere questo problema nel giusto tempo.
    Ora invece il programma è terminato, funziona correttamente!
    Detto questo, per la questione Tombola vi saluto! xD
    Ci rivediamo in giro perchè ho intenzione di non abbandonare questo forum dopo che ho fatto quello che dovevo fare... però per un po' insomma, non sarò più uno dei vostri incubi xD
    Grazie mille ancora!!
    Ora si riposa
    (Nevvero, ora devo studiare ancora XD)
  • Re: Sempre Tombola, generazione delle tabelle

    Joy, il piacere è stato mio quello di aver potuto aiutare un 'collega' in difficoltà , e poi ne ho avuti peggiori di incubi xD. Alla prossima!
  • Re: Sempre Tombola, generazione delle tabelle

    Salve a tutti, scusate se non mi presento ufficialmente al forum e scusate anche se faccio questo necroposting!

    Anche io come l'utente Joy mi sono imbattuto nel programma della tombola con solo qualche differenza: non ho una traccia da seguire (il tutto è nato da una sfida con un compagnio), non ho una preparazione universitaria e in questo caso non devo generare 5 schede ma bensì una serie completa.

    Per chi non sapesse di cosa si tratta una serie sono 6 schede dove compaiono tutti e 90 i numeri della tombola, in caso mi sia spiegato male eccovi la pagina di Wikipedia che sicuramente spiega meglio:

    Sono a uno stato abbastanza avanzato con i lavori, riesco a soddisfare tutti i requisiti della costruzione e cioè: 5 numeri per riga, almeno un numero e massimo 2 per colonna e tutti numeri diversi, il problema è che solo alcune volte il programma soddisfa tutte le condizioni insieme riuscendo a creare la scheda, le altre volte entra in un loop infinito dove i numeri che restano non soddisfano le condizioni dei posti liberi nella matrice.

    Per quanto riguarda invece l'algoritmo provo a spiegarvelo a parole a grandi linee:Comincio con generare un Array di 90 celle con dentro numeri che vanno dall'1 a 90 (serve per non inserire doppioni nella matrice), per le schede uso un'unica grande matrice di 18 righe per 9 colonne e gli "affianco" un array che tiene il conto di quanti numeri sono stati inseriti nella riga, immaginatelo così:
    _____________________
    |*******************************! !0! <==Array
    |******************************! !0!
    |******************************! |0!
    |******* Matrice*************| !0!
    |*****************************| !0!
    |***************************** | !0!
    |______________________! !0!


    A questo punto parte una funzione che inserisce un numero per ogni colonna di scheda, la riga viene scelta casualmente, il risultato è questo:



    Per inserire gli altri 36 numeri ne prendo uno a caso dall'Array dei 90, scelgo una riga in maniera random e se soddisfa tutte le condizioni la inserisco; il punto è come ho già scritto che non sempre gli ultimi numeri riescono a soddisfare le condizioni e quindi il programma si blocca.

    Vi lascio anche il codice nonostante il mio sia un problema di algoritmo e nonostante anche non sia leggibilissimo il codice, come compilatore uso il dev c++.
    #include<iostream>
    #include<math.h>
    #define q 100 
    using namespace std;
    void carica_bussolotto(int numero[q],int n);
    void leggi_array(int numero[q],int n);
    void estrazioni(int numero[q],int &n);
    void cocktail_sbagliato(int numero[q],int n);
    void swap(int &a,int &b);
    void leggi_matrice(int numero[q][q],int m, int n); 
    void carica_serie(int numero[q],int matri[q][q], int n,int rig);
    void aiuto_carica(int numero[q],int matri[q][q], int &n,int array[]); 
    void ordina_colonna(int matri[q][q]);
    bool controlla_colonna(int matri[q][q],int col,int rig); 
    int main ()
    {
        int n=90,rig=18,col=9,bussolotto[n];
        int serie[q][q];;
        bool ambo=false,terno=false,quaterna=false,cinquina=false,tombola=false;
        srand(time(NULL));
        carica_bussolotto(bussolotto,n);
        carica_serie(bussolotto,serie,n,rig);
            leggi_matrice(serie,rig,col);
        cout<<endl;
        n=90;
        carica_bussolotto(bussolotto,n);
        estrazioni(bussolotto,n);
        
    
        
       system("pause");
                     return 0;      
        
        
    }
    
    
    void carica_bussolotto(int numero[q],int n)
    {
         for(int i=0;i<n;i++)
         numero[i]=i+1;
         }
      void leggi_array(int numero[],int n)
    {
                   for(int i=0;i<n;i++)
        cout<<numero[i]<<"    ";
        cout<<endl;
         }
         
         
    void estrazioni(int numero[q],int &n)
    {
         int i=0;
         while(n>0)
         {
          i=rand() % n;              
          cout<<numero[i]<<endl;
          swap(numero[i],numero[n-1]);
          n--;
          
         }   
         }  
         
    void cocktail_sbagliato(int numero[],int n)
    {        
             int i=0,appoggio,j=1;
    bool disordine;
          do 
          {
           disordine=false; 
        while(i<n-1)
        {
          if (numero[j]>numero[i])
          {
          appoggio=numero[i];
          numero[i]=numero[j];         
          numero[j]=appoggio;
          disordine=true;    
          }
          i++;
          j++;
          }
    if (disordine==true)
    {
    disordine=false;
          while (i>0)
          {
          i--;
          j--;
          if (numero[j]>numero[i])
          {
          appoggio=numero[i];
          numero[i]=numero[j];         
          numero[j]=appoggio;
          disordine=true;    
          }
    
          }
          }
          }
    
            while (disordine==true);
    }
    
    void swap(int &a,int &b)
    {
         int appoggio;
             appoggio=a;
          a=b;
          b=appoggio;  
         
         
         
         }
              
    void carica_serie(int numero[q],int matri[q][q], int n,int rig) 
    {
         int i=0,j=0,col=0,array[rig];
         bool exit;
         for(int i2=0;i2<rig;i2++)
         array[i2]=5;
         aiuto_carica(numero,matri,n,array); 
         while (n>0)
         {          
          i=rand() % n;
          j=rand() % rig;
          if (array[j]>0)
          {  
          col=numero[i]/10;
          if (col>8)
          col--;
          if (controlla_colonna(matri,col,j)==false)            
          if (matri[col][j]==0)
          {
          matri[col][j]=numero[i];        
          swap(numero[i],numero[n-1]);
          n--;
          array[j]--;
          leggi_matrice(matri,rig,9);
           system("pause");
          }
          }
         }       
         }
         
    void leggi_matrice(int numero[q][q],int m, int n)
    { 
    for(int j=0;j<m;j++)
        {
           if (j%3==0)
     cout<<endl;  
    for(int i=0;i<n;i++)    
        {
        if (numero[i][j]==0)
        cout<<"    ";
        else
        if (numero[i][j]<10)    
        cout<<numero[i][j]<<"   ";
        else
        cout<<numero[i][j]<<"  ";
        }
       
         cout<<endl;
    }  
    }   
     void aiuto_carica(int numero[q],int matri[q][q], int &n,int array[])
     {
       int rig,i,col=0,k=0,j=0,c=9,p=18,m=9;
       while (j<6)
       {   
       i=rand() % 9;
       if(numero[i]>0)
       {
       rig=rand() % 3 + k;
       if (array[rig]>0)
       {
       matri[col][rig]=numero[i];
       numero[i]=0;
       j++;
       k=k+3;
       n--; 
       array[rig]--;
       }
       }
    
       }
       col++;
       while(col<9)
       {                                  
       j=0;
       k=0;
       while (j<6)
       {
       i=rand() % 10 + c;
       if(numero[i]>0)
       {
       rig=rand() % 3 + k;
       if (array[rig]>0)
       {
       matri[col][rig]=numero[i];
       numero[i]=0;
       j++;
       k=k+3;
       n--;
       array[rig]--;
       }
       }
       
       }
       c=c+10;
       col++;
      
       }
       leggi_matrice(matri,18,9);
       system("pause");
       cocktail_sbagliato(numero,90);
          }    
    
    
    bool controlla_colonna(int matri[q][q],int col,int rig)
    {
      int somma, scheda;
      bool errore=false;   
      scheda=(rig/3)*3;   
      somma=matri[col][scheda]+matri[col][scheda+1]+matri[col][scheda+2]; 
      col=col*10;
      if((somma-col)>=10)
      errore=true;
      return errore;   
         }  

    Vi lascio anche l'immagine di uno dei possibili errori, in questo caso l'ultimo numero da inserire è il 50 e l'unica riga con 4 numeri ha già il 56.



    Qualsiasi suggerimento è ben accetto e grazie in anticipo!!!
  • Re: Sempre Tombola, generazione delle tabelle

    Ciao Joy puoi postare tutto il codice se ce l' hai ancora da qualche parte salvato cortesemente
    ciao ragazzi ho riportate le modifiche da voi dette ed ecco il codice
    
     #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 ;
            }
    
        
        
    
    Dopo il primo ciclo viene stampato 1 e poi vari giocatori hanno vari risultati, e non è possibile inoltre inserire un una tro valore da tastiera
    perchè si bolcca
  • Re: Sempre Tombola, generazione delle tabelle

    X Giacomo_made4core: vedo che hai già scritto diversi post nel forum ma non hai ancora trovato il tempo di leggere il regolamento...

    Da dove cominciamo? non si chiede la pappa pronta, non si fanno esercizi scolastici (e mi ricollego a un tuo post che ho appena eliminato), non si riesumano thread vecchi

    Chiudo anche questo thread
Devi accedere o registrarti per scrivere nel forum
54 risposte