Option Explicit
' Je déclare en tête de script les variables auxquelles je veux pouvoir
' accéder depuis toutes les procédures et fonctions
Dim intNbClic As Integer     ' Permet de compter le nombre de clic
Dim intDernierTableau As Integer ' Permet d'enregistrer le nom de la dernière image cliqué
Dim intDernierClic As Integer  ' Permet d'enregistrer le numéro de la dernière case cliquée
Dim strTableau(19) As String   ' Tableau qui va recevoir la liste des 10 paires d'images
Dim intScore As Integer     ' Permet de compter le nombre de clic total à la fin de la partie

' Cette procédure initialise le contenu du tableau strTableau et le mélange
Sub initialiser()

  Dim intCompteur As Integer
  Dim intEchange As Integer
  Dim strEchange As String
    
  ' Lorsqu'une partie commence, la variable intNbClic est remise à 0
  intNbClic = 0
  intScore = 0
  
  ' Je remets à zéro ma fonction random (sinon mes images seront toujours au même endroit)
  Randomize
  
  ' Je parcours les 20 cases de mon tableau et j'y place un chiffre
  ' égal à la partie entière de l'index divisé par 2 soit:
  ' Dans la case 0 la valeur 0 (soit partie entière de 0 / 2 = 0)
  ' Dans la case 1 la valeur 0 (soit partie entière de 1 / 2 = 0.5 càd 0)
  ' Dans la case 2 la valeur 1 (soit partie entière de 2 / 2 = 1)
  ' Dans la case 3 la valeur 1 (soit partie entière de 3 / 2 = 1.5 càd 1)
  ' Dans la case 4 la valeur 2 (soit partie entière de 4 / 2 = 2)
  ' etc.
  For intCompteur = 0 To 19
    strTableau(intCompteur) = Int(intCompteur / 2) & ".jpg"
  Next intCompteur
  
  ' Je procéde une centaine de fois à l'échange de deux valeurs
  ' prises aléatoirement dans mon tableau strTableau
  For intCompteur = 1 To 100
    intEchange = Int(Rnd * 20)       ' Je prends un nombre au hasard
    strEchange = strTableau(intEchange)  ' Je garde en mémoire la chaine contenue dans la case du tableau prise au hasard
    strTableau(intEchange) = strTableau(0) ' Je place dans la case prise au hasard le contenu de la première case du tableau
    strTableau(0) = strEchange       ' Je place dans la première case du tableau le contenu de la case prise au hasard
  Next intCompteur

  'Je vide le contenu de toutes les cases de mon formulaire
  For intCompteur = 0 To 19
    imgCarte(intCompteur).Picture = LoadPicture("")
  Next intCompteur

End Sub

'Cette procédure permet de tester si toutes les cases du tableau ont été testées
Sub gagne()

Dim intCompteur As Integer
Dim blnTest As Boolean

intCompteur = 0
blnTest = True

' Je passe en revue toutes les images
For intCompteur = 0 To 19
  ' Si une seule image n'a pas de contenu, blnTest passe à False
  If imgCarte(intCompteur).Picture = LoadPicture("") Then
    blnTest = False
  End If
Next intCompteur

' Si toutes les images ont un contenu, c'est que la partie est terminée
If blnTest Then
  ' J'affiche à l'utilisateur un message lui indiquant en combien de tours
  ' il a réalisé la partie
  MsgBox "Vous avez gagné en " & intScore & " tours"
  ' Et je prépare la partie suivante
  initialiser
End If

End Sub

' Au démarrage du formulaire, j'initialise
Private Sub Form_Load()
  Call initialiser
End Sub

' Lorsque j'appuie sur une image, je charge un contenu dans l'image
Private Sub imgCarte_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  imgCarte(Index).Picture = LoadPicture(App.Path & "\" & strTableau(Index))
End Sub

' Lorsque je relâche sur une image
Private Sub imgCarte_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  
  ' J'incrémente les variables de décomptage
  intNbClic = intNbClic + 1
  intScore = intScore + 1
  
  ' Si c'est la deuxième image sur laquelle je clique, je compare avec la précédente
  If intNbClic = 2 Then
    ' Si l'image sur laquelle je viens de cliquer est identique à la précédente
    If (Int(Mid(strTableau(Index), 1, 1)) = intDernierTableau) Then
      ' Je maintiens affichée la dernière image cliquée
      imgCarte(Index).Picture = LoadPicture(App.Path & "\" & strTableau(Index))
      imgCarte(Index).Enabled = False
      ' et je vérifie si la partie est finie
      Call gagne
    ' sinon c'est que les deux images sont différentes
    Else
      ' Je remets à zéro mes deux images
      imgCarte(intDernierClic).Picture = LoadPicture("")
      imgCarte(intDernierClic).Enabled = True
      imgCarte(Index).Picture = LoadPicture("")
      imgCarte(Index).Enabled = True
    End If
    ' et je remets à 0 la variable intNbClic
    intNbClic = 0
' Sinon c'est que je clique pour la première fois
  Else
    ' Je garde en mémoire le numéro de la case
    intDernierClic = Index
    ' Je récupère le nom de l'image contenue dans cette case
    intDernierTableau = Int(Mid(strTableau(Index), 1, 1))
    ' et je maintiens l'affichage du contenu de l'image
    imgCarte(Index).Picture = LoadPicture(App.Path & "\" & strTableau(Index))
    imgCarte(Index).Enabled = False ' Je rends mon image indisponible pour éviter un recliquage
  End If
  
End Sub

' Lorsque je clique sur le menu Nouveau
Private Sub mnuNouveau_Click()
   Call initialiser ' J'appelle la procédure initialiser
End Sub

' Lorsque je clique sur le menu Quitter
Private Sub mnuQuitter_Click()
  End 'Je quitte le formulaire (et donc l'application)
End Sub