Distribution de carte

cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017 - 18 févr. 2004 à 20:43
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017 - 20 févr. 2004 à 19:09
Bonjour,

Alors voila je suis en train de faire un jeu de carte (style bataille) et j' aimerais savoir comment faire pour distribuer les 52 cartes aléatoirement pour le pc et le joueur.

Merci de m' aider par avance.
Fripouil

16 réponses

cs_guifr Messages postés 105 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 19 mai 2005
18 févr. 2004 à 21:47
Bonsoir,

Utilise juste la commande int(Rnd()*52) qui te donnera un numéro au hasard entre 0 et 51 (donc 52 numéros)
Là où ça se gatte, c'est qu'il ne faut pas donner deux fois la même carte...

Donc tu créé un tableau genre Carte(51) as boolean avec la valeur False quand la carte n'a pas été distribuée...
Si le numéro donné par int(Rnd()*52) correspond à celui d'une carte déjà donnée, on cherche un nouveau numéro, jusq'à tomber sur une nouvelle carte.
En tout cas, voilà pour les grandes lignes !

+ Ne pas oublier le Randomize au début de la fonction Rnd pour qu'elle soit vraiment alléatoire
+ Mettre toutes les valeurs du tableau à False au début
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
18 févr. 2004 à 22:08
Merci je vais essayé de me débrouiller
Mais peux tu m' expliquer quel genre de tableau dois je utiliser ?
Merci déja pour les explications
Fripouil
0
cs_guifr Messages postés 105 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 19 mai 2005
18 févr. 2004 à 22:13
Lors de tes déclarations :

Dim Carte(51) as boolean

ce type de déclaration s'appelle un tableau.
C'est un peu comme si tu avais 52 valeurs Carte de type booléen (on part de zéro).
Pour accéder à la valeur 3 (donc la 4ième valeur) : Carte(3)
C'est très pratique pour automatiser, par exemple, je t'ai dis qu'il fallais mettre les valeurs à False :

For i = 0 to 51
carte(i) = False
next

et hop, les 52 valeurs sont à false !
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
19 févr. 2004 à 02:47
Excuse moi mais je n' y arrive pas

J ai un bouton Distribuer
Mes Cartes s' appellent : Carte(0) .......Carte(51)
en tableau j' ai mis :

Dim Carte(51) As Boolean

et dans le bouton distribuer j ai :
Timer1.enabled = true

et dans le timer :

Randomize Int(Rnd() * 52)
masi ici il n y a aucune relation avec mes cartes c est normal ??!!

le probléme est que déja j ai un mesage du style
Le membre existe déja dans un module d' objet duquel le module d'objet est dérivé (ca c est de la phrase)

Dans l' idée ce que je veux faire c est qu un timer donne une carte au pc ensuite au joueur etc

J' ai du pas comprendre ou loupé un truc (ou plus qu' a abandonné et refaire des tables de mixage lol)

Enfin si tu as du temps a me consacrer pour des explications merci encore et encore
A tout a l heure LOL

Fripouil
0

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

Posez votre question
cs_guifr Messages postés 105 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 19 mai 2005
19 févr. 2004 à 15:48
Bein en fait tout dépend de l'endroit où t'as défini le tableau Carte. Selon l'endroit où tu l'as mis, tu vas avoir un problème de portée, la fonction Timer ne pourra pas accéder au tableau, sois parcequ'il n'est pas accessible directement depuis le Timer, sois parcequ'il n'est défini que pour une fonction et auquel cas il est détruit à la sortie de celle-ci. Il reste une solution, le déclarer dans le Général, c'est-à-dire hors-fonction, de ta form ou de ton module (c'est à dire tout en haut). Tu peux l'y déclarer en tant que Public, (ce qui le rendra accessible depuis les autres feuilles) ou Global, mais seulement dans un module pour Global.

Dans ton timer, tu met un truc du genre :

Dim NCarte as Integer

Randomize 'Pour initialiser le générateur de nombres pseudos-aléatoirs

do
NCarte = Int(Rnd() * 52)

if Carte(NCarte) = False Then
'La carte n'a pas encore été dsitribuée

'Ici la procédure pour distribuer une carte
Carte(NCarte) = True 'On actualise le tableau car la carte vient d'être distribuée
Exit Do 'C'est bon, on a réussi à distribuer une carte libre
End if
loop

Si la carte avait déjà été distribuée, la structure if est sautée, donc la boucle est répétée. Attention ! Si toutes les cartes ont déjà été distribuées la fonction tournera en boucle ! On pourrait s'en prémunir avec une strucure au début du Timer du genre :

For i = 0 to 51
if carte(i) = False then: exit for
next

if i = 52 then
'On a parcouru toutes les cartes, et toutes ont déjà été distribuées;
Exit Sub 'Donc on quite la structure, éventuellement on l'Enabled du Timer a false, et on affiche un message d'erreur, c'est selon tes goûts !
end if

Voilà voilà, dis-moi quand même ce que tu en pense, comme ça je serais sûr que tu ai reçu ce message...
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
19 févr. 2004 à 16:32
euh j' ai un gros probléme, l' application me plante visual basic !!!! tout se ferme

Peut on faire plus simple du genre :

le joueur et le pc on chacun des picturesBox du style :
JeuJoueur & JeuPc

et distribuer les cartes dans les pictureBox 1 coup sur 2 via le timer (sachant que le jeu du pc sera caché) m' enfin cela me semble bien compliqué car ce n est vraiment que le début...
Car je bidouille, je bidouille mais cela ne donne vraiment rien

Fripouil
0
cs_guifr Messages postés 105 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 19 mai 2005
19 févr. 2004 à 17:25
je vois pas trop comment faire plus simple, si on supprime cette structure, tu risques de distribuer plusieurs fois la même carte !

Si t'as une base assez avancée, je veux bien y jeter un ouil et voir ce qui cloche...
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
19 févr. 2004 à 18:34
Euh !! une shtite question !! Qu'est-ce qu'un timer vient faire dans un algorithme de distribution de carte ???
J'avoue que je ne vois pas la finalité du truc !!

Christophe R.
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
20 févr. 2004 à 00:46
Bonjour crenaud76, à vrai dire je ne sais pas réellement mais ce que je voudrais c' est avoir comme une vrai distribution de carte et non tient 26 carte pour toi et 26 pour moi, je voudrais vraiment une carte pour toi une carte pour moi et ceci pour les 52 cartes (donc 26 par "personnes") certes dans un bref délai mais essayer de reconstituer une partie de carte.

Si jamais tu as des idées fais en part...
Merci de nous aider avec des choses constructives alors !!!

Moi je débute et j' ai besoin d' aide et d'ailleur j' en remercies encore guifr pour sa patience.
@+
Fripouil
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
20 févr. 2004 à 01:04
Donc j' ai une petite idée de ce que je veux
Au début :
il y a 26 pictureBox pour le pc et 26 pour le joueur. (appelé JeuJoueur () et JeuPc() <---- celles ci seront cachées
Les cartes sont des pictureBox : Carte(0)........Carte(51)
On remplit les pictures box (JeuJoueur et JeuPc) alternativement et aléatoirement.
Ca n' a pas vraiment l' air compliqué mais faudrait déja que j arrive à faire une distribution aléatoire car pour remplir les picture box ce n 'est pas bien compliqué.
Alors voila a peu prés les bases de DEPART.
Fripouil
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
20 févr. 2004 à 01:40
Je crois être sur la bonne voie avec dans mon timer :

Private Sub TimerDistribution_Timer()

For I = 0 To 51
Randomize
NCarte = Int(Rnd * 51)

JeuJoueur(0).Picture = Carte(NCarte)
Next
End Sub

Les cartes sont affichées aléatoirement dans JeuJoueur(0) il me reste plus qu' a trouvé comment faire pour qu une fois JeuJoueur(0) remplit on passe à JeuPc(0) puis à JeuJoueur(1) etc etc
Fripouil
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
20 févr. 2004 à 14:00
Je te propose un truc du genre :
Private Distribuee(0 to 51) as boolean

Private Sub DistributionCarte(Nb as long)
dim I as long,N as Long

  ' Remise à zéro. Toutes les cartes sont dans la pioche
  For i = lbound(distribuee) to ubound(Distribuee)
    Distribuee(i) = False
  next
  ' On distribue Nb cartes au joueur et au PC
  For i = 0 to Nb-1
     JeuJoueur(i) = ChargeCarte(i, TireUneCarte,"Joueur")
     JeuPC(i) = ChargeCarte(i, TireUneCarte,"PC")
  Next
End Sub

Private Function TireUneCarte() as Long
Dim N as long
    Do    
      ' Tire une carte au hasard
      N = Int(Rnd * 51)
    ' Jusqu'a ce que ce soit une carte non encore distribuée
    While Distribuee(N)
   ' Marque cette carte comme distribuee
    Distribuee(N) = True
    ' Renvoie le numéro de la carte
    TireUneCarte = N
End Function

Private Sub ChargeCarte(Idx as Long, Carte as Long, AQui as String)
Dim Pic as PictureBox
  ' Affecte à l'objet Pic la bonne picturebox
  Select case AQui
    Case "Joueur"
       ' Form1 est a remplacer par le nom de ta form
       Set Pic = Form1.JeuJoueur(Idx)
    Case "PC"
       ' Idem pour Form1 içi ....
       Set Pic = Form1.JeuJoueur(Idx)
  End Select
  ' Charge le bon BMP
  Pic.Picture = LoadPicture("c:\JeuDeCarte" & Carte & ".bmp")
End sub

Il te faut alors 52 fichiers BMP (0.bmp, 1.bmp, ... 51.bmp)
représentant les 52 cartes d'un jeu et autant de picturebox que tu veux de cartes pour le joueur (JeuJoueur(0), ... JeuJoueur(x)) et le PC (JeuPC(0), ... JeuPC(x))

Et tu appelles ensuite la fonction DistributionCarte(8) si tu veux donner 8 cartes au joueur et au PC

Christophe R.
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
20 févr. 2004 à 14:00
Je te propose un truc du genre :
Private Distribuee(0 to 51) as boolean

Private Sub DistributionCarte(Nb as long)
dim I as long,N as Long

  ' Remise à zéro. Toutes les cartes sont dans la pioche
  For i = lbound(distribuee) to ubound(Distribuee)
    Distribuee(i) = False
  next
  ' On distribue Nb cartes au joueur et au PC
  For i = 0 to Nb-1
     JeuJoueur(i) = ChargeCarte(i, TireUneCarte,"Joueur")
     JeuPC(i) = ChargeCarte(i, TireUneCarte,"PC")
  Next
End Sub

Private Function TireUneCarte() as Long
Dim N as long
    Do    
      ' Tire une carte au hasard
      N = Int(Rnd * 51)
    ' Jusqu'a ce que ce soit une carte non encore distribuée
    While Distribuee(N)
   ' Marque cette carte comme distribuee
    Distribuee(N) = True
    ' Renvoie le numéro de la carte
    TireUneCarte = N
End Function

Private Sub ChargeCarte(Idx as Long, Carte as Long, AQui as String)
Dim Pic as PictureBox
  ' Affecte à l'objet Pic la bonne picturebox
  Select case AQui
    Case "Joueur"
       ' Form1 est a remplacer par le nom de ta form
       Set Pic = Form1.JeuJoueur(Idx)
    Case "PC"
       ' Idem pour Form1 içi ....
       Set Pic = Form1.JeuJoueur(Idx)
  End Select
  ' Charge le bon BMP
  Pic.Picture = LoadPicture("c:\JeuDeCarte" & Carte & ".bmp")
End sub

Il te faut alors 52 fichiers BMP (0.bmp, 1.bmp, ... 51.bmp)
représentant les 52 cartes d'un jeu et autant de picturebox que tu veux de cartes pour le joueur (JeuJoueur(0), ... JeuJoueur(x)) et le PC (JeuPC(0), ... JeuPC(x))

Et tu appelles ensuite la fonction DistributionCarte(8) si tu veux donner 8 cartes au joueur et au PC
Au passage, tu peux virer ton Timer, il ne sert à rien

Christophe R.
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
20 févr. 2004 à 16:20
Merci beaucoup pour ce code mais j ai encore des messages d erreur.

Etant donné que j ai un bouton "Distribuer" je dois faire référence à DistributionCarte ???

Est pour la quantité de cartes par personne c est 26 mais je ne vois pas ou je peux mettre (26) car la aussi j ai un message d erreur

Merci de m aider a finaliser la chose si tu as le temps car j' aimerais bien savoir ce que je fais(pour me familiariser un peu plus avec VB6).Merci encore.
Fripouil
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
20 févr. 2004 à 18:07
Les messages d'erreur sont :

Fontion ou variable attendue au niveau de ChargeCarte.

Ensuite il y aurait while sans wend
et Do sans loop

alors j' ai modifier et rajouter, mais la ca plante tout !!!
Fripouil
0
cs_Fripouil Messages postés 175 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 mai 2017
20 févr. 2004 à 19:09
Ah y a de l idée :

La carte s' affiche dans la picturebox(0) mais arive un message d' erreur Type Incompatible avec

JeuJoueur(I) = ChargeCarte(I, TireUneCarte, "Joueur") en jaune
Fripouil
0
Rejoignez-nous