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

Fermé
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014 - 29 déc. 2014 à 17:08
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 31 déc. 2014 à 08:00
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 :)
A voir également:

9 réponses

BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014
29 déc. 2014 à 17:27
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
30 déc. 2014 à 11:56
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
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014
30 déc. 2014 à 12:23
Bonjour,

Merci pour ta réponse ! Cependant je ne vois pas quelle boucle utiliser (mon niveau en VBA est vraiment faible)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
30 déc. 2014 à 12:27
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
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014
Modifié par pijaku le 30/12/2014 à 13:53
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
30 déc. 2014 à 13:54
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

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

Posez votre question
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014
30 déc. 2014 à 14:12
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
30 déc. 2014 à 14:14
As tu déjà vu les modules de classe?
0
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014
30 déc. 2014 à 14:15
Non jamais
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
Modifié par pijaku le 30/12/2014 à 14:22
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
30 déc. 2014 à 15:03
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
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014
30 déc. 2014 à 15:58
C'est bon j'ai compris l'ensemble du code
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
30 déc. 2014 à 16:07
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
30 déc. 2014 à 16:28
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
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
30 déc. 2014 à 16:39
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
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014
30 déc. 2014 à 16:26
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
30 déc. 2014 à 16:42
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
BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
30 déc. 2014 à 16:57
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752 > BO_Odo Messages postés 10 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 30 décembre 2014
31 déc. 2014 à 08:00
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