[C] Programma che randomizza mano di carte

di Anonimizzato12343 il
8 risposte
Salve a tutti, ho creato un programmino che crea una mano di carte ma ho un problema, non so come evitare che una carta possa capitarmi due volte... potreste aiutarmi?
Grazie mille.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
	char seme[5][8]={"bastoni","spade","denara","coppe"};
	int numeri[10],i=0,num,sem,uscito;   
	char *iniziale[4],*carteuscite[3],*uscita;      //inizializzo un array i puntatori//
	
	uscita=&seme[5][0];
	
	
	iniziale[0]=&seme[0][0]; 
	iniziale[1]=&seme[1][0];
	iniziale[2]=&seme[2][0];
	iniziale[3]=&seme[3][0];
	
	
	
	
	srand(time(NULL));
	
	while(i<10)                //carico l'array dei numeri delle carte//
	{
		numeri[i]=i+1;
		i++;
    }
		
	i=0;	
	
	while(i<3)                                  //Ciclo di stampa a video della carta//
	{
	   uscita=iniziale[sem];
	   num=rand()%9+1;
	   sem=rand()%4;
	   printf("%d %s\n",numeri[num],iniziale[sem]);
	   i++;
	 
	}
    
	
	
	
system("PAUSE");
return 0;
}

8 Risposte

  • La prima soluzione che mi viene in mente è memorizzare in una matrice 3x2 la carta già uscita ed effettui un controllo dopo l'estrazione della carta. Se la carta è gia presente, riestrai la carta.
  • Il problema è che le matrici non le conosco...
    Sono in seconda superiore e non è che sappia tutto...
    Magari se esistesse una soluzione più abbordabile
  • bebbo203 ha scritto:


    Il problema è che le matrici non le conosco...
    Sono in seconda superiore e non è che sappia tutto...
    Magari se esistesse una soluzione più abbordabile
    Se le hai usate significa che le conosci .

    bebbo203 ha scritto:


    
                char seme[5][8]={"bastoni","spade","denara","coppe"};
    
    Questa è una matrice.
  • Ah scusami, non pensavo si chiamassero così, li abbiamo sempre chiamati array bidimensionali.
    In questo caso avrei pensato anche io una cosa del genere ma non saprei come e dove implementarla...
  • Nel ciclo che estrae le carte.
    Dopo aver estratto la prima carta potresti passarla per una funzione insieme ad un array (esempio controllacarta(num, sem, mano[2][3])).
    Nella matrice mano vengono memorizzate le carte in questo modo:

    num | 3 | 6 | 7
    -------------------
    sem | 1 | 3 | 4

    La prima riga memorizza i numeri delle carte, la seconda il seme.
    Nella funzione basta che scorri la matrice e controlli in parallela la stessa colonna num con num e sem con sem. Appena trova che la carta è già presente ritorna 1, altrimenti 0.

    Non è una cosa molto complicata.
    Ci puoi riuscire tranquillamente.
  • Ecco, grazie, ora ci provo.
    Ma il far restituire alla funzione 1 cosa comporta? La ripetizione della funzione?
    Non le abbiamo ancora fatte a scuola e non trovo dei siti che lo spieghino in maniera "sempliciotta".


    Comunque grazie tante per l'impegno

    EDIT:
    Ci sto provando ma non riesco a impostare la matrice in modo da caricarla con le carte uscite, anche perché non so come utilizzare la funzione in questo caso, scusa il duplice disturbo
  • Non ho capito molto bene cosa non ti è chiaro.
    Il return 1 nella funzione serve in modo che quando tu richiami la funzione nel main per controllare se la carta è già uscita, fai un ciclo ripetitivo con condizione chiamatafunzione == 1 in modo che se la funzione ti ritorna uno e quindi la carta è già presente, tu ripeti l'estrazione altrimenti subito dopo il ciclo memorizzi la seme e numero.
  • Che non so come passare l'array bidimensionale alla funzione che non me lo accetta, e poi non riesco a controllare la carta con quelle già uscite, lo so, è una cavolata, ma non ci riesco proprio.
Devi accedere o registrarti per scrivere nel forum
8 risposte