Problème pour la création d'un memorie

BO_Odo Messages postés 10 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour tout le monde !

Voilà en cours d'info je dois programmer un memorie sous VBA , c'est un memorie de 16 cases/cartes.
Les règles sont les suivantes :

Les 16 cartes sont répartie en un carré de 8 sur 8, en debut de partie elles se voient attribuer une couleur aléatoirement il ya 8 paire de cartes de couleurs différentes.

Les joueurs entre leurs noms puis ils appuient sur le bouton lancer la partie : le joueur n°1 retourne une carte puis une deuxième si elles sont identique il gagne un point et rejoue sinon c'est au joueur n°2 de jouer.

Il y a un bouton rejouer qui re-répartie les couleurs des cases aléatoirement.

voilà une photo de mon Userform (désolé pour la qualité) :



J'ai déjà réussis à faire en sorte que les couleurs se répartissent aléatoirement lorsque l'on clique sur lancer la partie puis sur rejouer (le bouton lancer la partie se transforme en bouton rejouer), et à ce faire ce "retourner" les cases (qui sont en fait des bouton dont le backcolor change de couleur lorsque l'on clique dessus).
Maintenant je n'arrive pas à programmer ce qui ce passe quand le joueur retourne 2 cases (soit les laisser afficher lorsque qu'elles ont la même couleur soit les laisser afficher 4 seconde puis le "retourner" lorsqu'elles sont de différentes couleurs).

Si quelqu'un pouvait m'aider ce serais génial :)

9 réponses

  1. BO_Odo Messages postés 10 Statut Membre
     
    Un prof m'a conseiller d'utilisé qqch de cet forme:

    set variable = Me.Controls( "a_cb_"& variable)

    (mes boutons s'appellent a_cb_1, a_cb_2, a_cb_3...)

    mais je ne comprend pas ou ils veut en venir ^^
    0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Maintenant je n'arrive pas à programmer ce qui ce passe quand le joueur retourne 2 cases

    Ecris le. Sous la forme d'un "faux algorithme".
    Un peu comme ceci :

    Boucle sur tous les boutons
    Si Bouton.Name Like "a_cb_" & "*" Alors
    Si Bouton.BackColor = gris
    Retourne Bouton
    Sinon
    'Etc...
    Fin Si
    Sinon

    Fin Si
    'Etc...
    Fin Boucle

    0
  3. BO_Odo Messages postés 10 Statut Membre
     
    Bonjour,

    Merci pour ta réponse ! Cependant je ne vois pas quelle boucle utiliser (mon niveau en VBA est vraiment faible)
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      La boucle n'est pas très compliquée en elle même.
      Si tu as nommé tes boutons de couleur a_cb_1, a_cb_2, a_cb_3 etc... a_cb_16, tu peux boucler comme ceci :

      Dim i As Integer
      For i = 1 To 16
          If Me.Controls("a_cb_" & i).BackColor = 12632256 Then
      Next i
      0
  4. BO_Odo Messages postés 10 Statut Membre
     
    Voilà j'ai essayer de faire quelque chose mais je ne suis vraiment pas sûr J'ai remplacer bouton par a_cb_16 car je ne savais pas quoi mettre à la place

    Désolé mais je ne sais pas à insérer proprement du code dans ce forum et le tabulations ne sont pas pris en compte.

    Private Sub a_cb_16()
    'Boucle sur tout les boutons
    For i = 1 To 16
        'Si bouton.name like "a_cb_" & "*"
        If a_cb_16.Name Like "a_cb_" & "*" Then
        'Si bouton.Backcolor= gris (là blanc)
            If Me.Controls("a_cb_a" & i).BackColor = 16777215 Then
                'retourne bouton
                If a_couleur_16 = 1 Then
                    a_cb_16.BackColor = 32768
                    ElseIf a_couleur_16 = 2 Then
                        a_cb_16.BackColor = 8421631
                    ElseIf a_couleur_16 = 3 Then
                        a_cb_16.BackColor = 10040115
                    ElseIf a_couleur_16 = 4 Then
                        a_cb_16.BackColor = 52377
                    ElseIf a_couleur_16 = 5 Then
                        a_cb_16.BackColor = 16764057
                    ElseIf a_couleur_16 = 6 Then
                        a_cb_16.BackColor = 52479
                    ElseIf a_couleur_16 = 7 Then
                        a_cb_16.BackColor = 26367
                    ElseIf a_cb_16.BackColor = 255 Then
                    'sinon
                    Else: a_cb_16.BackColor = 16777215
                    'fin si
                End If
            'fin si
            End If
        ' fin si
        End If
    'fin boucle
    Next i
    End Sub
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Lorsque vous placez du code sur notre forum, merci d'utiliser les balises code à votre disposition.
      Le mode d'emploi (au cas ou) est ICI.

      Ensuite.
      Sans le reste de tes codes, je ne peux pas voir ce qui foire ... ou pas.
      Peux tu nous faire un fichier exemple?
      Pour transmettre un fichier, il faut passer par un site de pièce jointe tel que cjoint.com

      Va sur ce site : https://www.cjoint.com/
      Clic sur parcourir,
      Cherche ton fichier,
      clic sur ouvrir,
      Clic sur "Créer le lien cjoint",
      Copier le lien,
      Revenir ici le coller dans une réponse...
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. BO_Odo Messages postés 10 Statut Membre
     
    Merci pour le mode d'emploie.

    Voici le code que j'avais avant tes réponses

    https://www.cjoint.com/?DLEop4MoRO0

    Après je pense qu'il faut que je remplace l'ensemble des bouton "a_cb_"... par ça

    Private Sub a_cb_16()
    'Boucle sur tout les boutons
    For i = 1 To 16
        'Si bouton.name like "a_cb_" & "*"
        If a_cb_16.Name Like "a_cb_" & "*" Then
        'Si bouton.Backcolor= gris (là blanc)
            If Me.Controls("a_cb_a" & i).BackColor = 16777215 Then
                'retourne bouton
                If a_couleur_16 = 1 Then
                    a_cb_16.BackColor = 32768
                    ElseIf a_couleur_16 = 2 Then
                        a_cb_16.BackColor = 8421631
                    ElseIf a_couleur_16 = 3 Then
                        a_cb_16.BackColor = 10040115
                    ElseIf a_couleur_16 = 4 Then
                        a_cb_16.BackColor = 52377
                    ElseIf a_couleur_16 = 5 Then
                        a_cb_16.BackColor = 16764057
                    ElseIf a_couleur_16 = 6 Then
                        a_cb_16.BackColor = 52479
                    ElseIf a_couleur_16 = 7 Then
                        a_cb_16.BackColor = 26367
                    ElseIf a_cb_16.BackColor = 255 Then
                    'sinon
                    Else: a_cb_16.BackColor = 16777215
                    'fin si
                End If
            'fin si
            End If
        ' fin si
        End If
    'fin boucle
    Next i
    End Sub
    


    En remplaçant a_cb_16 par un nom qui prendrais en compte n'importe quel bouton
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      As tu déjà vu les modules de classe?
      0
  7. BO_Odo Messages postés 10 Statut Membre
     
    Non jamais
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bon. Alors on s'en passera.
      Dans le code du classeur fourni, tu écris ce code pour le bouton a_cb_1 :
      Private Sub a_cb_1_Click()
          If a_couleur_1 = 1 Then
              a_cb_1.BackColor = 32768
                  ElseIf a_couleur_1 = 2 Then
                      a_cb_1.BackColor = 8421631
                  ElseIf a_couleur_1 = 3 Then
                      a_cb_1.BackColor = 10040115
                  ElseIf a_couleur_1 = 4 Then
                      a_cb_1.BackColor = 52377
                  ElseIf a_couleur_1 = 5 Then
                      a_cb_1.BackColor = 16764057
                  ElseIf a_couleur_1 = 6 Then
                      a_cb_1.BackColor = 52479
                  ElseIf a_couleur_1 = 7 Then
                      a_cb_1.BackColor = 26367
              Else: a_cb_1.BackColor = 255
          End If
      End Sub

      et quasiment le même pour tous les boutons.

      Regarde déjà ce que ferait ce code :
      Private Sub a_cb_1_Click()
      Call Bouton_Clic(1)
      End Sub
      
      Private Sub a_cb_2_Click()
      Call Bouton_Clic(2)
      End Sub
      
      Private Sub a_cb_3_Click()
      Call Bouton_Clic(3)
      End Sub
      
      Sub Bouton_Clic(Num As Integer)
      MsgBox "Tu as cliqué sur le bouton : " & Me.Controls("a_cb_" & Num).Name
      End Sub

      Attention : ne pas avoir deux procédures Private Sub a_cb_1_Click()!!!
      0
  8. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    J'ai légèrement repris tes codes.
    J'ai pris la liberté d'utiliser des variables tableaux pour simplifier l'écriture. Si cela ne convient pas (car tu ne l'aurais pas abordé en cours), dis le on rechangera.

    Je te laisse le soin de regarder attentivement, surtout les codes de :
    Private Sub a_cb_lancer_partie_Click()

    Elle utilise le code demandé par ton professeur (boucle sur contrôles)

    et dans le Module :
    Sub Tirage_Couleurs()


    https://www.cjoint.com/?DLEplsdrfRA

    Dès que tu les auras comprises, on pourra passer à la suite, et donc à la fonction : Bouton_Clic qui n'est pas encore écrite.
    0
  9. BO_Odo Messages postés 10 Statut Membre
     
    C'est bon j'ai compris l'ensemble du code
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Même ceci :

      For i = 1 To 16
          a_couleur(i) = Range("C" & i).Value
      Next i
      Couleurs = Array(0, 12632256, 255, 65280, 16711680, 65535, 16711935, 16776960)
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Je t'aide...
        Ce code :
        For i = 1 To 16
            a_couleur(i) = Range("C" & i).Value
        Next i

        fait exactement la même chose que ce que tu faisais ici :
        a_couleur_1 = Range("B1").Value
        a_couleur_2 = Range("B5").Value
        a_couleur_3 = Range("D1").Value
        a_couleur_4 = Range("D5").Value
        a_couleur_5 = Range("B2").Value
        a_couleur_6 = Range("B6").Value
        a_couleur_7 = Range("D2").Value
        a_couleur_8 = Range("D6").Value
        a_couleur_9 = Range("B3").Value
        a_couleur_10 = Range("B7").Value
        a_couleur_11 = Range("D3").Value
        a_couleur_12 = Range("D7").Value
        a_couleur_13 = Range("B4").Value
        a_couleur_14 = Range("B8").Value
        a_couleur_15 = Range("D4").Value
        a_couleur_16 = Range("D8").Value

        Sauf que, au lieu de remplir 16 variables en 16 lignes de code, par un léger arrangement des formules dans la feuille et l'utilisation d'une variable de type tableau, on peut le faire en 3 lignes par une boucle.

        Ensuite, à quoi sert :
        Couleurs = Array(0, 12632256, 255, 65280, 16711680, 65535, 16711935, 16776960)

        Et bien, en fait, la propriété BackColor des boutons de commande n'accepte que les codes couleurs Long, pas les codes couleurs Excel VBA (1, 2, 3 etc...)? CEs derniers sont réservés pour ColorIndex, propriété que ne possède pas le background des boutons de commande.
        Il nous faut donc, à partir des numéros aléatoires (de 1 à 8) a_couleur(i), les transformer en Long.
        Pour cela, nous utiliserons l'Array Couleurs qui renvoie :
        Couleurs = Array(0, 12632256, 255, 65280, 16711680, 65535, 16711935, 16776960)
        'Signifie :
        'Couleurs(1) = 0 => Noir
        'Couleurs(2) = 12632256 => gris
        'Couleurs(3) = 255 => rouge
        'Etc...
        'Couleurs(16) = 16776960
        
        0
      2. BO_Odo Messages postés 10 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        D'accord j'avais bien compris pour le premier code mais pas trop l'array je voyais ce qu'il faisait mais pas trop à quoi il nous servais.
        0
  10. BO_Odo Messages postés 10 Statut Membre
     
    Je pense oui

    For i = 1 To 16
        a_couleur(i) = Range("C" & i).Value
    Next i

    Attribut la valeur de la cellule "ci" à la variable a_couleur(i) Pour i allant de 1 à 16.

    Dans :
    Couleurs = Array(0, 12632256, 255, 65280, 16711680, 65535, 16711935, 16776960)

    Couleurs est une variable tableau dans laquelle avec Array on crée un liste d'élément. Ces éléments étants les couleurs attribuées au bouton, mais je me rend compte que je n'en comprend pas l'utilité.
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Alors, dans le Module1, place ce code :

      Sub Bouton_Clic(Num As Integer)
      Dim NumCoul As Integer
      
      With UserForm1
         NumCoul = a_couleur(Num)
         .Controls("a_cb_" & Num).BackColor = Couleurs(NumCoul)
      End With
      End Sub

      Puis lance le jeu et regarde
      0
      1. BO_Odo Messages postés 10 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Je comprend à peu près mais pourquoi ne fais on pas directement

        Sub Bouton_Click(Num As Integer)
        
        With UserForme1
          .Controls("a_cb_"&num).BackColor = Couleurs(a_couleur(Num)
        End With
        End Sub
        0
      2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > BO_Odo Messages postés 10 Statut Membre
         
        Bonjour,
        Tu peux faire comme ça directement, cela fonctionne très bien.
        Je détaille ici un peu plus pour une meilleure compréhension...

        Mais ceci n'est pas notre plus gros problème. De la manière dont nous construisons l'array a_couleur, les couleurs ne sont pas entièrement mélangées dans les boutons de notre UserForm. De la manière dont nous procédons, nous nous retrouvons avec 8 couleurs dans les 8 boutons du haut et leurs doubles dans les 8 boutons du bas... Pas cool.
        Ce que je te propose maintenant, c'est de mélanger les couleurs. Pour cela, il te faut une fonction qui mélange un Array.
        Je te laisse creuser un peu cette idée.
        0