32 cartes aléatoires sous vba

jhonnybegood Messages postés 11 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 11 mars 2007 - 11 mars 2007 à 09:50
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 12 mars 2007 à 12:39
Bonjour à tous,
je réalise le jeu du memmory en vba pour excel avec 32 cartes sur une feuille de calcul excel et je souhaiterais qu'en début de partie le joueur ne voit que le
dos des cartes.
Cependant, la répartition se fait quand même ("en
mémoire") lorsque le joueur appuie sur le bouton de lancement.
Ce que
je vais dire va peut-être paraître étrange mais en fait c'est comme
si dans la picture box il y avait 2 images : l'une n'est pas visible au
début (cartes classique(coeur ,pique.....) qui ont été placées
aléatoirement lors du clic sur le bouton de lancement), l'autre le dos
de la carte qui est visible au début et jusqu'à ce que le joueur clique
sur cette image. Pour plus de clarté je vous place ci-dessous le code pour la génération aléatoire des images (ce code produit une génération d'image visible, on voit toutes les cartes se placer aléatoirement mais pas le dos des cartes):

Dim TableauCartes(1 To 32) As Integer

Private Sub cmd_Distribuer_Click()
Dim NbrAléatoire As Integer
Dim chemin As String
Dim a As Integer
Dim TableauAffectation(1 To 16) As Integer

ReDim TabImages(1 To 32) As Object
Set TabImages(1) = Image1
Set TabImages(2) = Image2
Set TabImages(3) = Image3
Set TabImages(4) = Image4
Set TabImages(5) = Image5
Set TabImages(6) = Image6
Set TabImages(7) = Image7
Set TabImages(8) = Image8
Set TabImages(9) = Image9
Set TabImages(10) = Image10
Set TabImages(11) = Image11
Set TabImages(12) = Image12
Set TabImages(13) = Image13
Set TabImages(14) = Image14
Set TabImages(15) = Image15
Set TabImages(16) = Image16
Set TabImages(17) = Image17
Set TabImages(18) = Image18
Set TabImages(19) = Image19
Set TabImages(20) = Image20
Set TabImages(21) = Image21
Set TabImages(22) = Image22
Set TabImages(23) = Image23
Set TabImages(24) = Image24
Set TabImages(25) = Image25
Set TabImages(26) = Image26
Set TabImages(27) = Image27
Set TabImages(28) = Image28
Set TabImages(29) = Image29
Set TabImages(30) = Image30
Set TabImages(31) = Image31
Set TabImages(32) = Image32

For a = 1 To 32

    Do
   
        NbrAléatoire = Int((16 * Rnd) + 1) 'nbre aléatoire entre 1 et 16
       
        If TableauAffectation(NbrAléatoire) < 2 Then
            TableauAffectation(NbrAléatoire) = TableauAffectation(NbrAléatoire) + 1
            TableauCartes(a) = NbrAléatoire
            Exit Do
        End If
                  
    Loop

Next

For a = 1 To 32
    chemin = (ThisWorkbook.Path + "" + CStr(TableauCartes(a)) + ".bmp")
    TabImages(a).PictureSizeMode = fmPictureSizeModeStretch
    TabImages(a).AutoSize = False
    TabImages(a).Picture = LoadPicture(chemin)
    TabImages(a).Visible = False
Next

End Sub

    Si quelqu'un peut m'aider ça serait vraiment sympa, je ne vois pas du tout comment m'en sortir.

                                                                                              Merci

13 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 mars 2007 à 10:20
Je n'ai pas compris grand chose à ton code.

Mais je vais te donner une petite astuce tout de même. Au lieu de charger l'image de la carte dans ta picturebox, tu met l'iage générique du dos de la carte.
Lors de l'affectation des images à tes picturebox, ne charge pas l'image, stocke simplement le nom du fichier de l'image dans la proriété Tag de ta picturebox.

Ensuite au moment d'afficher l'image tu charge l'image à partir de l'info stockée dans la proriété Tag :
TabImages(index).Picture = LoadPicture(TabImages(index).Tag)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
jhonnybegood Messages postés 11 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 11 mars 2007
11 mars 2007 à 11:05
J'ai commencé à faire ce que tu as dis mais je n'arrive pas à avoir la prop  Tag . J'ai simplement mis dans la prop Image de ma picture box l'image du dos de la carte, mais dans la fenêtre prop il n'y a aucune trace de Tag pour mettre l'image des cartes. J'ai inséré une nouvelle picture box, pour voir, et là apparaît la prop Tag, dois-je recréer toutes mes picture box?
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 mars 2007 à 11:14
si tu utilise bien un controle PctureBox, tu dois avoir la propriété tag, elle ne disparait pas comme ça. Elle fait partie de ton les controles de VB normalement

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
jhonnybegood Messages postés 11 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 11 mars 2007
11 mars 2007 à 11:16
En fait je crois que depuis une feuille de calcul la propriété Tag n'est pas accessible alors que sur un userform elle apparaît. Comment puis-je faire alors si je travail sur ma feuille de calcul?

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

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 mars 2007 à 11:16
"J'ai simplement mis dans la prop Image de ma picture box l'image du dos de la carte, mais dans la fenêtre prop il n'y a aucune trace de Tag pour mettre l'image des cartes"


Euh...
1) La propriété tag d'une picturebox ne saurait disparaître de ta fenêtre des propriétés !
2) son contenu peut être fixé tant manuellement, dans cette fenêtre, que dynamiquement (par code) ===>>> Picture1.tag = "......."
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 mars 2007 à 11:18
Mais attends...
Je vois que tu parles de feuille de calcul et de VBA ...
VBA n'a à ma connaissance pas de PictureBoxes !
jhonnybegood Messages postés 11 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 11 mars 2007
11 mars 2007 à 11:24
En fait sur excel c'est écrit Image c'est tout
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 mars 2007 à 11:24
Zut moi aussi j'avais zappé le coté VBA de la chose.

Comportement étrange effectivement sous Excel, les controle posés sur une feuille de calcul n'ont pas toutes les propriétés. Et même par le code, elles semblent innaccessibles.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 mars 2007 à 11:26
Bon.... Une pictureBox et un contrôle image sont des choses fort différentes !
Peu importe en ce qui concerne l'utilisation de la propriété tag, qu'un contrôle image possède également ...
Ne toutefois pas confondre une image placée sur ta feuille avec un contrôle image placé sur une userform ... ce sont des choses différentes ...
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 mars 2007 à 11:34
Bonjour Casy,

Une idée sans doute idiote (je ne connais pas VBA).
S'il s'agit d'images sur sa feuille et non de contrôles images et que les images n'ont, elles, pas de propriété tag : serait-il idiot d'utiliser une petite cellule cachée quelque part pour jouer ce rôle de tag ?
A moins qu'il n'ai la possibilité de mettre celà en commentaire caché ? (ce qui serait encore mieux)...
Enfin ... je n'en sais rien... juste une idée...
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
11 mars 2007 à 11:53
Ah effectivement si c'est une photo insérée directement sur la feuille, elle n'aura pas de propriété Tag. La prorpiété Tag étant niquement sur les controles. Une photo insérée sur une feuille n'est pas un controle mais un objet OLE.

Mais apparement même les controles posés directement sur une feuille n'ont pas la propirété Tag. Pourquoi est-elle inaccessible, mystère ???

Quant à passer outre, oui des cellules masquées pourquoi pas, voire des commentaires aussi, mais le plus simple reste encore je pense de crer un second tableau associé à TabImage.
Une solution plus élégante serait que TabImage soit non pas un tableau d'objet, mais un tableau de structure. Ces mêmes structures contenant l'objet d'une part et une string d'autre part dans laquelle serait stocker le chemin de l'image à charger.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
11 mars 2007 à 12:07
Pas bête du tout, le coup des structures....

C'est marrant, mais (je suis un vieux fou) personnellement je ne distribuerais pas les cartes au service !
Je ne servirais que des "dos" (identiques) et...
"servirais" au fur et à mesure, en tirant au hasard un chemin dans une listbox, en affichant l'image à l'endroit cliqué à la place du "dos" qui s'y trouvait, et.... supprimerais tout-bêtement le chemin (l'indice) de la listbox (removeitem) pour ne pas risquer de réutiliser cette carte/chemin. Mon rnd se ferait chaquefois en utilisant le listcount de la listbox. 
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 mars 2007 à 12:39
tu peux utiliser http://www.vbfrance.com/codes/CARDS-REALISEZ-VOS-JEUX-CARTES-FACILEMENT_41049.aspx

pour réaliser ton jeu de cartes.

jmmarques a raison... une listbox ou un collection... même combat.
ca éviterais plein de controles de doublons, et la distribution serait plutot rapide.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Rejoignez-nous