Rnd speciale

Résolu
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008 - 21 sept. 2005 à 18:51
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 24 sept. 2005 à 21:49
bonjour,
voila je me demandais un petit truc sur lequelle je bloque j'aimerais faire un jeu basic de bataille (le jeu de carte) j'ai les carte une idee du code a mettre mais j'ai jamais fait de rnd enfin si un mais vraiment naze en gros j'aimerais que quand l'utilisateur comme l'ordi pioche ce soit une carte aleatior genre sa tire un nombre aleatoire entre 1 et 52 si ses la 1 bah sa sort exemple l'as de pique mais une fois que cette carte est tiree je ne veut plus qu'elle puisse etre prise donc comment faire exemple un rnd qui ferais un random entre 1 et 52 puis si exemple il tire la 47 bah au random futur (dans ce programme par pour toujour ^^) il ne puisse plus tirer la 47 donc il ferais un random sur tt les nombre entre 1 et 52 sauf la 47 etc par apres donc apres y tire la 42 bah au trage d'apres y pourra pas prendre ni la 47 ni la 42 etc etc vous voyez ce que je veux dire ? enfin voila et je trouve pas comment faire :s ses le seul truc qui me bloque ses ce **** de random (rnd) donc si pouviez me pondre un chtit code ou me conseiller ou autre enfin pour que j'arrive a avoir cette routine se serais bien sympa (pour ceux comme dans mes anciens post qui vienne dire ohhhh le noob , ohhh le chiant etc passer votre chemin je suis ici pour apprendre et non pour embeter mon monde ...)
donc voila je suis ouvert a tous (sauf insultes etc ^^)
merci d'avance
Diablaman

ps: pour ceux qui voudrais m'aider personnellement pour que je comprenne mieux voila mon MSN diablaman@hotmail.com
encore merci d'avance ^^

20 réponses

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
21 sept. 2005 à 20:02
Violent Ken

Salut.
Voilà un exemple possible.

Le but est de tirer un nombre aléatoire, de donner sa valeur (entre 1 et 52) et de stocker cette valeur dans un tableau (redimensionnable). Ainsi, chaque nouvelle valeur du random est comparée à tous les éléments du tableau. Si elle est égale à une valeur du tableau, elle sera retirée aléatoirement, jusqu'à trouver une valeur non chosie. Trève de blabla, voilà le source :

'définitions des variables
Dim Nbre As Long, Tableau() As Long, T As Long, Res As Long
ReDim Tableau(1)
'pour un "vrai" hasard
Randomize
'début de la boucle
While UBound(Tableau) < 53 'tant que le tableau n'a pas 52 valeurs
Res = 0 'ok pour l'instant
'tirage aléatoire
Nbre = Int(Rnd * 52) + 1 'entre 1 et 52
'on teste avec le tableau
For T = 1 To UBound(Tableau) 'pour chaque élément du tableau
If Tableau(T) = Nbre Then
Res = Res + 1 'déjà existant
Exit For
End If
Next T
If Res > 0 Then
'alors c'est pas bon
a = a
Else
'là c'est bon
MsgBox Nbre 'display le resultat
'on augmente le tableau
ReDim Preserve Tableau(UBound(Tableau) + 1)
Tableau(UBound(Tableau)) = Nbre 'inscription de la valeur
End If
DoEvents 'si t'as pas de chance, pour rendre la main
Wend

çà marche parfaitement, j'ai testé.
Si la réponse te convient, clique sur "réponse acceptée"
@+

NB: la prochaine fois, écrit mieux ton message : aucun retour à la ligne, pas de ponctuation.... c'est la cata...
3
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
21 sept. 2005 à 22:04
Bonsoir,

La réponse de Violent Ken me semble juste. Mais, on peut aussi imaginer d'autres alternatives pour tirer aléatoirement une série de numéros.

Par exemple, voici la trame :

=

Sub TireUneCarte()

Dim Carte(52)

Randomize

'Boucle de tirage
Do

nb = Int(Rnd * 52) + 1 'nb alea

If Carte(nb) = 0 Then
'N° de carte jamais tiré donc on l'affiche
MsgBox "Votre n° de carte : " & nb
Carte(nb) = 1 'marque cette carte
'Compte le nb de carte tiré
compt = compt + 1
End If

Loop Until compt = 52

End Sub

=

Le fonctionnement est trés simple. On dimensionne un tableau avec un nb d'éléments (52 ici). Par défaut, chaque élément du tableau vaut zéro. Puis on choisit un nb aléatoirement entre 1 et 52. On fait corresponde l'indice du tableau au numéro de la carte (nb). Si la valeur du tableau est nulle (donc jamais choisi) on le met à 1. Et on recommence, jusqu'à épuissement... On compte le nb de numéro différent sortie afin de pouvoir sortir de la boucle DO...

Voilà !

Amucalement,
Us.
3
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
23 sept. 2005 à 22:37
voila voila j'ai enfin finni le code est vachement long mais j'ai enfin se que je voulais sans devoir faire 56 tonnes de complexitee :p
donc voici se que j'ai fait (avec l'aide bien entendu de la sourc ede US_30 que je remercie encore une fois ^^)
_______________________________________________________________________________
Private Sub Command1_Click()
Dim Carte(52)
Dim Tablo() As String
Randomize
'vide le label
Label1.Caption = ""
List1.Clear
'Boucle de tirage
Do

nb = Int(Rnd * 52) + 1 'nb alea

If Carte(nb) = 0 Then
'N° de carte jamais tiré donc on l'affiche
'MsgBox "Votre n° de carte : " & nb
Label1.Caption = Label1.Caption & " " & nb
Carte(nb) = 1 'marque cette carte
'Compte le nb de carte tiré
compt = compt + 1
End If
Loop Until compt = 52
Chaine = Label1.Caption
Tablo = Split(Chaine, " ")
List1.AddItem Tablo(1)
List1.AddItem Tablo(2)
List1.AddItem Tablo(3)
List1.AddItem Tablo(4)
List1.AddItem Tablo(5)
List1.AddItem Tablo(6)
List1.AddItem Tablo(7)
List1.AddItem Tablo(8)
List1.AddItem Tablo(9)
List1.AddItem Tablo(10)
List1.AddItem Tablo(11)
List1.AddItem Tablo(12)
List1.AddItem Tablo(13)
List1.AddItem Tablo(14)
List1.AddItem Tablo(15)
List1.AddItem Tablo(16)
List1.AddItem Tablo(17)
List1.AddItem Tablo(18)
List1.AddItem Tablo(19)
List1.AddItem Tablo(20)
List1.AddItem Tablo(21)
List1.AddItem Tablo(22)
List1.AddItem Tablo(23)
List1.AddItem Tablo(24)
List1.AddItem Tablo(25)
List1.AddItem Tablo(26)
List1.AddItem Tablo(27)
List1.AddItem Tablo(28)
List1.AddItem Tablo(29)
List1.AddItem Tablo(30)
List1.AddItem Tablo(31)
List1.AddItem Tablo(32)
List1.AddItem Tablo(33)
List1.AddItem Tablo(34)
List1.AddItem Tablo(35)
List1.AddItem Tablo(36)
List1.AddItem Tablo(37)
List1.AddItem Tablo(38)
List1.AddItem Tablo(39)
List1.AddItem Tablo(40)
List1.AddItem Tablo(41)
List1.AddItem Tablo(42)
List1.AddItem Tablo(43)
List1.AddItem Tablo(44)
List1.AddItem Tablo(45)
List1.AddItem Tablo(46)
List1.AddItem Tablo(47)
List1.AddItem Tablo(48)
List1.AddItem Tablo(49)
List1.AddItem Tablo(50)
List1.AddItem Tablo(51)
List1.AddItem Tablo(52)
End Sub
_______________________________________________________________________________
il fait 76 lignes ses vrai ses long mais au moins ses pas complexe comme tt les code qu'on m'avais proposer 10 fois plus court mais je prefere long et simple a comprendre (pour moi en tt cas ^^) que tres petit mais fait savoir decrypter :p sans offenser personne ;)
enfin voila j'ai voulu poser la sourc epour que si un mec come moi se prennais la tete bah y pourra avoir plus siple ;-)
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
21 sept. 2005 à 19:42
Salut

Les cartes sont un type ou une string, tu fais comme tu veux.

Utilises une collection avec toutes les cartes dedans.

Au depart tu as 52 cartes.

Ton random tu ne fais sur l'index de ta carte et le max c'est le nombre de cartes dans la collection.

Exemple :
il y a 32 cartes dans la collection

Le random te donne 1
Alors tu prends la carte dont l'index est 1
Et par exemple ta carte est 10 trefle

Tu supprimes la carte de la collection

(la collection bouche le trou toute seule)

Tu veux remettre la carte le 10 trefle change d'index il prendra l'index 31 (base0)

(quand tu la rajoutes du la mets a la fin)

Normalement ca fonctionne.

Voila
0

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

Posez votre question
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
21 sept. 2005 à 22:33
Violent Ken

Oui, la suggestion de us_30 n'est pas mauvaise non plus.

Par contre, dans ma source (plus haut),

If Res > 0 Then
'alors c'est pas bon
a = a
Else

peut être remplacé par

If Res > 0 Then
'alors c'est pas bon
Else

La ligne a=a est évidement inutile, c'était juste pour les tests...
@+
0
galopin01 Messages postés 133 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 14 octobre 2011 1
22 sept. 2005 à 12:24
Bonjour,
Comment détruire définitivement en bloc la collection ?
Pas d'autre solution que de "Remove" chaque élément dans une boucle ?
Merci.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
22 sept. 2005 à 13:38
Salut

Regardes si

set macol = nothing fonctionne.

Sinon

Set macol =new collection

Efface les données ;-)
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
22 sept. 2005 à 13:59
merci merci j'adore vos reponse elle sont bien etc ^^ la je suis super malade donc je ne sais pas tester dans l'imediat (tt le temp clouer au lit :s) mais sinon je v tous les essayer et voir lequelles me convient le mieux ensuite je valide les reponse ^^ sa devrais pas tarder je pense tester sa demain ou se soit (samedi soir grand max ^^) sinon en faite j'aurais voulu un truc hyper simple mais vraiment simple de simple que meme un demeurer avec des moufles puisse comprendre genre :
private sub command1_click()
dim carte(52) as integer
randomize
nb = Int(Rnd * 52) + 1
if carte(1) then
sa tire la carte
sa l'efface et donc ne permet plus de la tirer donc la vire du rnd
end if
if carte(2) then
sa tire la carte
sa l'efface et donc ne permet plus de la tirer donc la vire du rnd
end if
end sub

voyez un truc super simple quoi ^^ que je peux parametrer et changer comme je veux du genre si du jour au lendemain je met plus 52 mais 67 bah je peux le faire et peux reparametrer le tt enfin vous voyez ce que je veux dire ^^ enfin je v tester vos reponse puis je valide celle qui me convient le mieux sinon si vous trouvez plus simple (car moi je suis vachement noob en random etc :s) bah poster allez y meme si y a 20 code je les essayerais en plus sa peut tjrs servir aux autres ^^ (a moi aussi en meme temp evidement ^^)

merci d'avance ;-)
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
22 sept. 2005 à 14:35
a oui petite precision car je vient de tester les code ^^ j'arrive pas a les comment dire "modifier" je veux dire tant que le numero de la carte apparait en msgbox donc le nb ou le nbre sa depend des deux code bah le rnd est parfait (j'ai passer mon temp a faire des grille sur papier a compter le tirage barrer le chiffre etc) mais si je modifie exemple pour ken :
MsgBox Nbre 'display le resultat
par
label1.caption = Nbre 'display le resultat
ou pour us_30 :
MsgBox "Votre n° de carte : " & nb
par
label1.caption = "Votre n° de carte : " & nb
bah alors la au bout de +- en general 16 tirage bah la y redonne des chiffre qu'il a deja donner pour ken il me redonnais en general 3/4 fois 49 et pour us il me donnais en general 3/4 fois 11 et 16
enfin voila comment adapter sa a un label et non a un msgbox (car je vois mal tt les tour dire au joueur vous avez tirer sa avec un msgbox puis dire l'adversaire a tirer sa encor epar msgbox ...mais plutot p
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
22 sept. 2005 à 14:35
mais plutot par label exuser moi j'ai mal clicker ^^ (raccourci clavier enfoncer sans faire expres ^^)
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
22 sept. 2005 à 18:01
Alors, c'est pas normal, çà devrait rien changer au Rnd.
Alors essaie ce code, tu verras çà marche bien.
Créé une form vierge, ajoute un label (Label1), et mets ce code dans la form.
Appuie sur une touche pour tirer un nombre, et appuie de nouveau pour tirer un deuxième nombre... 52 fois.
Tu verras, aucun nombre ne réapparait 2 fois

Code :

Dim Var As Boolean

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode <> 0 Then Var = True
End Sub

Private Sub Form_Load()
Dim Nbre As Long, Tableau() As Long, T As Long, Res As Long
ReDim Tableau(1)
Randomize
While UBound(Tableau) < 53
Me.Show
While Not (Var = True)
DoEvents
Wend
Var = False
Res = 0
Nbre = Int(Rnd * 52) + 1
For T = 1 To UBound(Tableau)
If Tableau(T) = Nbre Then
Res = Res + 1
Exit For
End If
Next T
If Res > 0 Then
Else
Label1.Caption = Nbre
Form1.Show
ReDim Preserve Tableau(UBound(Tableau) + 1)
Tableau(UBound(Tableau)) = Nbre
End If
DoEvents
Wend
End Sub


voila le code qu'il ma reposter mais y me donne rien ... meme si je le met en command bouton etc ^^
0
BaFM Messages postés 64 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 26 novembre 2009
22 sept. 2005 à 18:12
'Les limites du tableau indique l'intervalle des valeurs possibles
Public Sub TirerIndicesAléatoires(ByRef tabVal() As Integer)
Dim i As Integer
Dim j As Integer
Dim valeur As Integer
Dim multiple As Integer
Randomize
multiple = UBound(tabVal) - LBound(tabVal)
For i = LBound(tabVal) To UBound(tabVal)
Do
valeur = Int(Rnd * multiple) + UBound(tabVal)
For j = LBound(tabVal) To i - 1
If valeur = tabVal(j) Then Exit For
Next j
Loop While valeur = tabVal(j)
tabVal(i) = valeur
Next i
End Sub


Alors, cette méthode rempli le tableau en paramètre par les valeurs de ses indices de façon aléatoire.
Il te suffit de l'appeler pour générer un tableau rempli et après il te suffit de parcourir le tableau pour récupérer les indices.
Je ne l'ai pas testé mais je suis certain à 99% qu'il n'y a pas de bug d'exécution.
0
BaFM Messages postés 64 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 26 novembre 2009
22 sept. 2005 à 18:40
Cette méthode exemple prend en paramèttres les deux label à remplir avec les cartes tirées au départ par les joueurs et le label contenant le tas.
Les cartes sont placées "mélangées" dans le tableau des cartes de départ grâce à la procédure vue au dessus.
Ensuite les cartes sont réparties entre les 3 collections, cartes du joueur1, cartes du joueur2, et le tas.
Et enfin, le tout est inscrit dans les label.

Public Sub Exemple(ByRef lbl1 As Label, ByRef lbl2 As Label, ByRef lblt As Label)
Dim tabCartes(1 TO 52) As Integer
Dim cartesJoueur1 As New Collection
Dim cartesJoueur2 As New Collection
Dim cartesTas As New Collection
Dim i As Integer
'Initialisation du tas de cartes.
TirerIndicesAléatoires tabCartes
'Répartitions des premières cartes aux joueurs (7 par joueurs au départ).
i = 1
While (i < 15)
cartesJoueur1.Add tabCartes(i), after:=cartesJoueur1.Count
cartesJoueur2.Add tabCartes(i + 1), after:=cartesJoueur1.Count
i = i + 2
Wend
'Mise des autres cartes dans le tas.
While (i < 53)
cartesTas.Add tabCartes(i), after:=cartesJoueur1.Count
i = i + 1
Wend
'Affichage des cartes des joueurs (indices)
lbl1.Caption = ""
For i = 1 To cartesJoueur1.Count
If i > 1 Then
lbl1.Caption = lbl1.Caption & ", "
End If
lbl1.Caption = lbl1.Caption & CStr(cartesJoueur1.Item(i))
Next i
lbl2.Caption = ""
For i = 1 To cartesJoueur2.Count
If i > 1 Then
lbl2.Caption = lbl2.Caption & ", "
End If
lbl2.Caption = lbl2.Caption & CStr(cartesJoueur2.Item(i))
Next i
'Affichage des cartes du tas (indices)
lblt.Caption = ""
For i = 1 To cartesTas.Count
If i > 1 Then
lblt.Caption = lblt.Caption & ", "
End If
lblt.Caption = lblt.Caption & CStr(cartesTas.Item(i))
Next i
End Sub
0
galopin01 Messages postés 133 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 14 octobre 2011 1
22 sept. 2005 à 21:15
Bonsoir,
Très bon le nothing !
Puissant les collections !
Merci.
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
23 sept. 2005 à 01:14
ouais bah moi j'ai tjrs pas ma reponse :-( je voulais juste virer le msgbox de us_30 et le mettre en label mais qu'il soit tjrs aussi puissant qu'en msgbox car si je met label1.caption = nb bah a ce momment la le rnd me redonne le meme chiffre ... mais bon apparement personnes sais comment faire ou veut pas le dire ou alors veut pas mexpliker comment utiliser les code de collection comme celui de BaFm :-( enfin voila j'attend tjrs ^^
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 sept. 2005 à 03:43
Je crois que tu as eu tout un tas de code, qu'il te faut maintenant analyser.
La réponse ne te tombera pas forcément toute cuite dans le bec, allons...

Amusez-vous !
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS - MVP Visual Basic
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
23 sept. 2005 à 12:59
merci merci mais les codes du debut me suffise et je les comprend cependant je trouve tjrs pas comment faire ave cle msgbox pour le mettre en label et que sa aille tjrs aussi bien ^^
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
23 sept. 2005 à 22:51
Violent Ken

Salut.
Au fait, petite remarque constructive :
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
List1.AddItem Tablo(1)
List1.AddItem Tablo(2)
List1.AddItem Tablo(3)
List1.AddItem Tablo(4)
List1.AddItem Tablo(5)
List1.AddItem Tablo(6)
List1.AddItem Tablo(7)
List1.AddItem Tablo(8)
List1.AddItem Tablo(9)
List1.AddItem Tablo(10)
List1.AddItem Tablo(11)
List1.AddItem Tablo(12)
List1.AddItem Tablo(13)
List1.AddItem Tablo(14)
List1.AddItem Tablo(15)
List1.AddItem Tablo(16)
List1.AddItem Tablo(17)
List1.AddItem Tablo(18)
List1.AddItem Tablo(19)
List1.AddItem Tablo(20)
List1.AddItem Tablo(21)
List1.AddItem Tablo(22)
List1.AddItem Tablo(23)
List1.AddItem Tablo(24)
List1.AddItem Tablo(25)
List1.AddItem Tablo(26)
List1.AddItem Tablo(27)
List1.AddItem Tablo(28)
List1.AddItem Tablo(29)
List1.AddItem Tablo(30)
List1.AddItem Tablo(31)
List1.AddItem Tablo(32)
List1.AddItem Tablo(33)
List1.AddItem Tablo(34)
List1.AddItem Tablo(35)
List1.AddItem Tablo(36)
List1.AddItem Tablo(37)
List1.AddItem Tablo(38)
List1.AddItem Tablo(39)
List1.AddItem Tablo(40)
List1.AddItem Tablo(41)
List1.AddItem Tablo(42)
List1.AddItem Tablo(43)
List1.AddItem Tablo(44)
List1.AddItem Tablo(45)
List1.AddItem Tablo(46)
List1.AddItem Tablo(47)
List1.AddItem Tablo(48)
List1.AddItem Tablo(49)
List1.AddItem Tablo(50)
List1.AddItem Tablo(51)
List1.AddItem Tablo(52)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

se remplace par :

Dim Vari as long
For Vari=1 to 52
List1.AddItem Tablo(Vari)
Next T

@+
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
24 sept. 2005 à 13:10
apparement sa va pas y bloque sur Next T je sais pas pk :s
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
24 sept. 2005 à 21:49
Euh... IL suffit de faire "Next Vari" au lieu de "Next T"... l'erreur est évidente ici... c'est une étourderie...
Ou encore "Next" tout court.

Amicalement,
Us.
0
Rejoignez-nous