[C] Doublons avec la fonction rand()

Asus_geek -  
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   -
Salut a tous,

j'ai un code qui génère des cartes de jeu (poker), aléatoirement, mais parfois j'ai des cartes en double

Pour le premier tirage tout va bien, j'ai réussi a contourner ce problème en utilisant :

void  tirage1(card *main)
{
	int i=0;
	int j=0;
	int compteur = 0;
	
	for(i=0, j = 1; i < 5; )
	{
		main[i].color= (rand()%4) + 1;
		main[i].value= (rand()%13)+ 2;

		if (i > 0)
			for (j = 0; j < i ; j++)
				if (main[i].color == main[j].color && main[i].value == main[j].value) // contre mesure pour eviter les doublons
					//comparaison avec main[j] et main[i] si il trouve la meme carte il refait la boucle ;) 
					{
						j = -1;
						break;
					}
		if (j > 0)
			i++;
	}

}


ça fonctionne bien, mais pour le deuxième tirage j'ai des soucis, je sais pas comment faire, voici mon code :

void tirage2(card *main)
{
	int p=0;
	int i=0;
		int j=1;
	char choix[6];
	printf("Appuyez sur o pour garder ou n pour retirer\n\n");
	for (p=1, i=0, j = 1; p<6,i < 5; p++)
	{
		printf("Voulez vous garder votre %de carte?\n", p);
		scanf("%s", &choix[p-1]);
		if (choix[p-1] == 'o' )
		{
		}
		else
		{
			main[p-1].color= (rand()%4) + 1;
			main[p-1].value= (rand()%13)+ 2;
		}
	}
	choix[5] = '\0';
}


Merci de m'aider !
A voir également:

5 réponses

loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Pour ne pas avoir de doublon, la solution est assez simple.
Sur cet exemple, on peut très facilement opter pour une stratégie beaucoup plus simpliste et surtout beaucoup plus efficace que celle utilisée. En effet au lieu de se compliquer la vie à tirer une valeur de carte puis une couleur, on peut facilement tirer directement une carte entre 0 et 51 inclus, puis obtenir la couleur par '%13' et la couleur par '/13'.
Ceci permet en remplissant un simple tableau d'entier de connaître les cartes déjà tirées et ainsi de recommencer le tirage en cas de doublon.
int tableau[5]; 
int nbCarte = 0; 

int nouvelleCarte() 
{ 
  int i, nouvelleCarte; 
  while (1) 
  { 
    nouvelleCarte = rand()%52; 
    for (i=0; i<nbCarte; i++) 
      if (nouvelleCarte == tableau[i]) 
        break; 
    if (i == nbCarte) 
      break; 
  } 
  tableau[nbCarte++] = nouvelleCarte; 
  return (nouvelleCarte); 
}
Bonne continuation.
0
Asus_geek
 
le problème c'est que je vais devoir modifier tout mon programme si je fais ce que tu dis...

j'aimerais une contre mesure inspiré du premier tirage, mais j'arrive pas a la mettre en place.

Merci d'avance
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Je ne vois pas la difficulté... pour tirer 5 cartes différentes il suffit de faire:
  for(i=0; i<5; i++)
  {
    int carte = nouvelleCarte();
    main[i].color = carte/13;
    main[i].value = carte%13;
  }
Enfin,c'est vous qui voyez !
D'autre part, un 'for (p=1, i=0, j = 1; p<6,i < 5; p++)', me parait curieux dans sa formulation.
Bonne continuation.
0
Asus_geek
 
Lors du second tirage si je prend votre code ça ne fonctionne pas, ça ne fonctionne que pour le premier,

je précise que j'ai bien mis ça avant :

int tableau[5]; 
int nbCarte = 0; 

int nouvelleCarte() 
{ 
  int i, nouvelleCarte; 
  while (1) 
  { 
    nouvelleCarte = rand()%52; 
    for (i=0; i<nbCarte; i++) 
      if (nouvelleCarte == tableau[i]) 
        break; 
    if (i == nbCarte) 
      break; 
  } 
  tableau[nbCarte++] = nouvelleCarte; 
  return (nouvelleCarte); 
}


void tirage2(card *main)
{
	int p=0;
	int i=0;

	char choix[6];
	printf("Appuyez sur o pour garder ou n pour retirer\n\n");
	for (p=1, i=0, p++)
	{
		printf("Voulez vous garder votre %de carte?\n", p);
		scanf("%s", &choix[p-1]);
		if (choix[p-1] == 'o' )
		{
		}
		else
		{
                for(i=0; i<5; i++)
                {
                int carte = nouvelleCarte();
                main[i].color = carte/13;
                main[i].value = carte%13;
                 }

		}
	}
	choix[5] = '\0';
}

0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
for (p=1, i=0, p++) n'est pas correct. Le compilateur doit au moins râler !
Sinon, je ne vois pas pourquoi, le bout de programme que j'ai donné ne fonctionnerait pas; il faudra toutefois s'assurer de ne pas déborder du tableau (l'exemple a été donné pour 5 cartes).
0
Asus_geek
 
up !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Asus_geek
 
up
0