Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [c] Problema mescolare le carte
Forum - C/C++ - [c] Problema mescolare le carte

Avatar
j_ax31 (Normal User)
Newbie


Messaggi: 3
Iscritto: 23/12/2010

Segnala al moderatore
Postato alle 13:36
Giovedì, 23/12/2010
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?


Codice sorgente - presumibilmente C/C++

  1. void mischia(){                
  2. mazzo_() ;                                               //è contenuto il mazzo          
  3. int j=0;              
  4. srand(time(0));                
  5. while(i<40){                
  6.                 j= rand()%39;                
  7.                 mazzom[i].seme=mazzo[j].seme;                            //mazzom sarebbe un altro tipo mazzo e conterrà            
  8.                 mazzom[i].carta=mazzo[j].carta;                              // quello mescolato
  9. i++;}                
  10. for(i=0;i<40;i++){                
  11.                         printf("%s %s \n",mazzom[i].carta,mazzom[i].seme);}}


PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 15:30
Giovedì, 23/12/2010
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.

Codice sorgente - presumibilmente C/C++

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



Intendi così? 8-|


Yep, I came back :P
PM Quote
Avatar
j_ax31 (Normal User)
Newbie


Messaggi: 3
Iscritto: 23/12/2010

Segnala al moderatore
Postato alle 18:56
Giovedì, 23/12/2010
alla fine ho risolto così:
Codice sorgente - presumibilmente C++

  1. void mischia() {                            //funzione che mischia le carte
  2.          srand(time(NULL));                          
  3.          mazzo_();                         //richiamo la funzione mazzo_ che contiene le 40 carte
  4.          int j;  
  5.          struct card tmp;
  6.     for (i=40; i>1; i--) {
  7.         j =rand()%39;                       //funzione rand
  8.         tmp.carta = mazzo[j].carta;              //algoritmo fisher-yates
  9.         tmp.seme = mazzo[j].seme;
  10.         mazzo[j].carta= mazzo[i-1].carta;
  11.         mazzo[j].seme=mazzo[i-1].seme;
  12.         mazzo[i-1].carta = tmp.carta;
  13.         mazzo[i-1].seme = tmp.seme;
  14.     }
  15. }





tramite l algoritmo di fisher-yates...l ho trovato in python e ho cercato di farlo in c...come ti pare?

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 19:25
Giovedì, 23/12/2010
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.


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 20:06
Giovedì, 23/12/2010
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


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
j_ax31 (Normal User)
Newbie


Messaggi: 3
Iscritto: 23/12/2010

Segnala al moderatore
Postato alle 11:17
Venerdì, 24/12/2010
Già... Hai pienamente ragione!! :yup::yup::k:

PM Quote