Générer 9 nombres différents entre 1 et 52

Résolu
Signaler
Messages postés
19
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
17 août 2007
-
Messages postés
19
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
17 août 2007
-
Bonjour, je réalise un jeux de poker. Je dois générer 9 cartes 2 pour le 1er joueur, 2 pour le 2eme. Et les 5 cartes du millieu.

J'ai un probleme car le jeu de poker ce joue qu'avec un seul jeux de carte :(

et ici, il me génére des fois les mm cartes donc j'aimerais trouver un algorithme qui me permet de générer 9 cartes différentes.
voici mon code :

CJ1[1] = Hasard.

Hasard.RandomMinMax(1, 52);
// utilise la fct hasard et genere un nbr entre 1 et 52CJ1[2] = Hasard.

Hasard.RandomMinMax(1, 52);
// pour afficher une des 52 cartes 1-13 coeur 14-26 pique ...CJ2[1] = Hasard.

Hasard.RandomMinMax(1, 52);CJ2[2] = Hasard.

Hasard.RandomMinMax(1, 52);CJ3[1] = Hasard.

Hasard.RandomMinMax(1, 52);CJ3[2] = Hasard.

Hasard.RandomMinMax(1, 52);CJ3[3] = Hasard.

Hasard.RandomMinMax(1, 52);CJ3[4] = Hasard.

Hasard.RandomMinMax(1, 52);CJ3[5] = Hasard.

Hasard.RandomMinMax(1, 52);

CarteJ11.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ1[1] +
".bmp");
// affichage des cartes en bitmapCarteJ12.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ1[2] +
".bmp");CarteJ21.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ2[1] +
".bmp");CarteJ22.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ2[2] +
".bmp");CarteJ31.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ3[1] +
".bmp");CarteJ32.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ3[2] +
".bmp");CarteJ33.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ3[3] +
".bmp");CarteJ34.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ3[4] +
".bmp");CarteJ35.Image =

new
Bitmap(
"Resources\\Bitmap_" + CJ3[5] +
".bmp");

Merci d'avance.

Nico

15 réponses

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Je viens de m'apercevoir que j'ai fait une erreur de frappe dans ma dernière méthode :

result.Add(DrawRandomCard(deck,r));

il manquait la dernière parenthèse.

Bon week-end, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
152
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
2 juin 2008
1
Garde les cartes que tu as déjà dans un tableau et puis lorsque tu prend une autre carte au hasard vérifie qu'elle n'est pas dans le tableau ;-)

________________________________________________________________________
Hardware is what we play with until it breaks, Software is what we play with until it works !
Messages postés
115
Date d'inscription
mardi 1 février 2005
Statut
Membre
Dernière intervention
8 octobre 2007

Et pourquoi pas une collection, hashtable ou liste.
Lorsque tu fais ton random (valeur X), tu le bornes de 0 a Collection.Count ensuite tu supprime l'élement à la position X.

Bien sûr en début de chaque partie tu réinitialise ta collection, hashtable ou liste.
Messages postés
19
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
17 août 2007

Je débute en programmation :$

je ne comprend pas bien vos méthode. :s

Nico
Messages postés
19
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
17 août 2007

Merci de m'avoir mit sur la voie.


verif:



for
(b 1; b 52; b++)



{



for
(n 0; n 8; n++)



{


c++;



if
(generer[n].Equals(b) == generer[c].Equals(b))



{


generer.Clear();


CJ1[1] = Hasard.Hasard.RandomMinMax(1, 52);
// utilise la fct hasard et genere un nbr entre 1 et 52



CJ1[2] = Hasard.




Hasard
.RandomMinMax(1, 52);

// pour afficher une des 52 cartes

CJ2[1] = Hasard.




Hasard
.RandomMinMax(1, 52);CJ2[2] = Hasard.


Hasard
.RandomMinMax(1, 52);CJ3[1] = Hasard.


Hasard
.RandomMinMax(1, 52);CJ3[2] = Hasard.


Hasard
.RandomMinMax(1, 52);CJ3[3] = Hasard.


Hasard
.RandomMinMax(1, 52);CJ3[4] = Hasard.


Hasard
.RandomMinMax(1, 52);CJ3[5] = Hasard.


Hasard
.RandomMinMax(1, 52);generer.Add(CJ1[1]);

generer.Add(CJ1[2]);

generer.Add(CJ2[1]);

generer.Add(CJ2[2]);

generer.Add(CJ3[1]);

generer.Add(CJ3[2]);

generer.Add(CJ3[3]);

generer.Add(CJ3[4]);

generer.Add(CJ3[5]);

generer.Sort();

c = 1;


goto
verif;}


else

{


}


}
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Et ce que tu as mis fonctionne ???

Les boucles for ne fonctionnent pas comme tu l'as mis, mais comme ça :

for(int i=0;i<n;i++)  //signifie pour i commençant à 0 et tant que i<n, boucle et incrémente i de 1

Voici quelques méthodes qui doivent fonctionner :
        ///<summary><?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

        /// Tire une carte au hasard dans un paquet et l'enlève du paquet.

        ///</summary>

        ///Le paquet de cartes.

        ///Générateur de nombres pseudo-aléatoirs.

        ///<returns>La carte tirée.</returns>

        privateintDrawRandomCard(List<int> deck,Randomr)

        {

            intindex = r.Next(deck.Count);

            intres = deck[index];

            deck.RemoveAt(index);

            returnres;

        }

 

        ///<summary>

        /// Construit un paquet de cartes ordrées

        ///</summary>

        ///La capacité du paquet.

        ///<returns>Le paquet de carte</returns>

        privateList<int> BuildOrderedDeck(intcapacity)

        {

            List<int> res = newList<int>(capacity);

            for (inti=0;i<capacity;i++)

                res.Add(i);

            returnres;

        }

 

        ///<summary>

        /// Construit et brasse un paquet de carte.

        ///</summary>

        ///La capacité du paquet.

        ///Le nombre d'échange de carte pour brasser le paquet.

        ///<returns>Le paquet de carte</returns>

        privateList<int> BuildShuffledDeck(intcapacity, intswapCount)

        {

            List<int> deck =BuildOrderedDeck(capacity);

            Randomr = newRandom();

            for (inti = 0; i < swapCount; i++)

            {

                intindex1 = r.Next(capacity);

                intindex2 = r.Next(capacity);

 

                inttemp = deck[index1];

                deck[index1] = deck[index2];

                deck[index2] = temp;

            }

            returndeck;

        }
Alors soit tu construits un paquet trié avec BuildOrderedDeck et tu tires les carte aléatoirement dans ce paquet à l'aide de la méthode DrawRandomCard, soit tu construits ton paquet brassé avecBuildShuffledDeck, et tu peux les tirer à la suite.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
@#°#@#@§

(pour ne pas dire autre chose)

Désolé pour le formattage, cette fois j'espère que ça va passer.

               /// <summary>
        /// Tire une carte au hasard dans un paquet et l'enlève du paquet.
        /// </summary>
        /// Le paquet de cartes.

        /// Générateur de nombres pseudo-aléatoirs.

        /// <returns>La carte tirée.</returns>
        private int DrawRandomCard(List deck,Random r)
        {
            int index = r.Next(deck.Count);
            int res = deck[index];
            deck.RemoveAt(index);
            return res;
        }

        /// <summary>
        /// Construit un paquet de cartes ordrées
        /// </summary>
        /// La capacité du paquet.

        /// <returns>Le paquet de carte</returns>
        private List BuildOrderedDeck(int capacity)
        {
            List res = new List(capacity);
            for (int i=0;i<capacity;i++)
                res.Add(i);
            return res;
        }

        /// <summary>
        /// Construit et brasse un paquet de carte.
        /// </summary>
        /// La capacité du paquet.

        /// Le nombre d'échange de carte pour brasser le paquet.

        /// <returns>Le paquet de carte</returns>
        private List BuildShuffledDeck(int capacity, int swapCount)
        {
            List deck =BuildOrderedDeck(capacity);
            Random r = new Random();
            for (int i = 0; i < swapCount; i++)
            {
                int index1 = r.Next(capacity);
                int index2 = r.Next(capacity);

                int temp = deck[index1];
                deck[index1] = deck[index2];
                deck[index2] = temp;
            }
            return deck;
        }

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Ou alors, une autre méthode pour avoir un paquet brassé :

 /// <summary>
 /// Construit et brasse un paquet de carte.
 /// </summary>
 /// La capacité du paquet.

 /// <returns>Le paquet de carte</returns>
 private List BuildShuffledDeck(int capacity)
 {
  List deck = BuildOrderedDeck(capacity);
  List result = new List(capacity);
  Random r = new Random();
  for (int i = 0; i < capacity; i++)
  {
   result.Add(DrawRandomCard(deck,r);
  }
  return result;
 }

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
19
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
17 août 2007

Oui ca fct comme ca. Pour ma boucle for, je déclare tt mes variables au dessus de mon programme. Et ce qui est du i ==52 ca fct aussi puisque je part de 1 jusque la 52eme carte donc qd je suis à la 52eme je quitte la boucle.
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Désolé, mais c'est impossible
for(b 1; b 52; b++)
 
signifie pour B=1 et tant que b est égal à 52 comme il vérifie la comdition à l'entrée, et qu'elle n'est pas valide, il ne passe pas dasn la boucle.

si tu veux faire une boucle qui va de 1 à 52, tu fais
for (b=1 ;b<=52;b++)

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
19
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
17 août 2007

ca fct comme j'ai mit et pas comme tu me dis.
je n'ai plus de doublon et qd je met b<=52 il me met erreur :(
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
Ecoute, si ton code fonctionne, je veux bien manger mon diplôme.

Essaie ça :

for (
int
i = 1;
i == 52;
i++)
{

   MessageBox.
Show(
"J'y suis.");
}

MessageBox.
Show(
"J'ai terminé.");
D'après ce que tu me dis, cette boucle devrait s'effectuer 52 fois et t'afficer 52 fois "J'y suis."  
Tu verras bien qu'en fait il affiche directement "J'ai terminé.".

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
19
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
17 août 2007

Argh il vient de m'afficher deux fois les mm cartes :'(
Mais si je met i <= 52 ca ne vas pas, il plante :s
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
65
C'est bien ce que je disais, ça ne marche pas.

Utilise les méthodes que j'ai écrites, ça doit fonctionner sans problèmes.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
19
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
17 août 2007

Merci