Oppure

Loading
23/12/10 12:36
j_ax31
Salve raga ho un problema con il mescolamento di un mazzo di carte , in pratica ho creato una struct per il mazzo ,adesso devo fare una funzione che mischi le carte ma il problema è che quando stampo a schermo ripete alcune carte dovrei mettere un controllo e ho provato con una condizione creando una variabile temporanea che conterrà il valore di j e se j!=t memorizzare nel vettore ma praticamente mischia ugualmente ripetendo le stesse carte...come posso sistemare?


void mischia(){                
mazzo_() ;                                               //è contenuto il mazzo           
int j=0;               
srand(time(0));                
while(i<40){                
                j= rand()%39;                
                mazzom[i].seme=mazzo[j].seme;                            //mazzom sarebbe un altro tipo mazzo e conterrà             
                mazzom[i].carta=mazzo[j].carta;                              // quello mescolato
i++;}                
for(i=0;i<40;i++){                
                        printf("%s %s \n",mazzom[i].carta,mazzom[i].seme);}}
aaa
23/12/10 14:30
Pitagora
non ho capito molto dalla descrizione comunque FORSE (ripeto non ho capito molto di ciò che vorresti fare) potresti procedere così.

- estrarre una nuova carta.
con una variabile non static (quindi che perde il valore ogni volta che termina la funzione) e con un ciclo for dovresti confrontare se è già presente nel vettore partendo dall'inizio fino ad arrivare al numero di carte già presenti. Con la funzione strcmp confronti le stringhe. Se non è presente inserisci la carta altrimenti, pesca nuovamente e confronta. Il tutto dovrà essere racchiuso in un ciclio per esempio un do - while va benissimo. Ti consiglio inoltre ti sviluppare per questo tipo di istruzione una funzione, in modo tale che è possibile richiamarla ogni qual volta tu lo desideri. Ecco un esempio di come dovrà uscire.

 
do {
       /* istruzioni per prelevare una carta */
      } while (confronta(mazzo[j].carta));  /* la funzione confronta dovrà ritornare 1 se la carta è gia presente */


Intendi così? 8-|
aaa
23/12/10 17:56
j_ax31
alla fine ho risolto così:
void mischia() {                            //funzione che mischia le carte
         srand(time(NULL));                          
         mazzo_();                         //richiamo la funzione mazzo_ che contiene le 40 carte
         int j;  
         struct card tmp;
    for (i=40; i>1; i--) {
        j =rand()%39;                       //funzione rand
        tmp.carta = mazzo[j].carta;              //algoritmo fisher-yates
        tmp.seme = mazzo[j].seme;
        mazzo[j].carta= mazzo[i-1].carta;
        mazzo[j].seme=mazzo[i-1].seme;
        mazzo[i-1].carta = tmp.carta;
        mazzo[i-1].seme = tmp.seme;
    }
}




tramite l algoritmo di fisher-yates...l ho trovato in python e ho cercato di farlo in c...come ti pare?
aaa
23/12/10 18:25
HeDo
come ho sempre detto, il modo migliore per avere un insieme fatto di esattamente N carte (mazzo) non ordinate è quello di creare un mazzo ordinato e poi elemento per elemento scambiarlo con un altro scelto casualmente all'interno del mazzo. Tutto il resto sono vaneggiamenti inutili.
aaa
23/12/10 19:06
gigisoft
Salve,
l'algoritmo funziona bene, solo aggiungerei un controllo per evitare che si abbia

i = j

in modo da avere esattamente 40 scambi;

Ciao. :k:

Luigi
aaa
24/12/10 10:17
j_ax31
Già... Hai pienamente ragione!! :yup::yup::k:
aaa