Bloqué pour programmé un jeu de puissance 4 en VBA

matdav78

XLDnaute Nouveau
Bonjour à tous,
Je suis en train de programmer un jeu de puissance 4 sur excel à l'aide de VBA.
Pour l'instant toute l'interface est faite. Les pions descendent bien au bon endroit avec une couleur différence 1 coup sur 2.
Bref, maintenant je cherche à programmer un message qui dit quand il y a 4 pions d'alignés, soit en ligne, colonne ou diagonale.
Je pense qu'il faut peut-être créer un compteur d'abord avec une ou plusieurs variables, mais j'ai du mal à voir comment faire... :/
Si quelqu'un peut m'aider la-dessus ce serait cool !
Je suis débutant donc c'est pas facile au début ;)
Merci d'avance.
 

Gorfael

XLDnaute Barbatruc
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

Salut matdav78 et le forum
Code:
Sub test()
Dim Cel As Range
For Each Cel In Range([A1], [G6])
    If Cel.Interior.ColorIndex + Cel.Offset(0, 1).Interior.ColorIndex _
       + Cel.Offset(0, 2).Interior.ColorIndex + Cel.Offset(0, 3).Interior.ColorIndex = 24 Or _
       Cel.Interior.ColorIndex + Cel.Offset(1, 0).Interior.ColorIndex _
       + Cel.Offset(2, 0).Interior.ColorIndex + Cel.Offset(3, 0).Interior.ColorIndex = 24 Or _
       Cel.Interior.ColorIndex + Cel.Offset(1, 1).Interior.ColorIndex _
       + Cel.Offset(2, 2).Interior.ColorIndex + Cel.Offset(3, 3).Interior.ColorIndex = 24 Then
            MsgBox "Jaune vainqueur"
            Exit Sub
    End If
    If Cel.Interior.ColorIndex + Cel.Offset(0, 1).Interior.ColorIndex _
       + Cel.Offset(0, 2).Interior.ColorIndex + Cel.Offset(0, 3).Interior.ColorIndex = 12 Or _
       Cel.Interior.ColorIndex + Cel.Offset(1, 0).Interior.ColorIndex _
       + Cel.Offset(2, 0).Interior.ColorIndex + Cel.Offset(3, 0).Interior.ColorIndex = 12 Or _
       Cel.Interior.ColorIndex + Cel.Offset(1, 1).Interior.ColorIndex _
       + Cel.Offset(2, 2).Interior.ColorIndex + Cel.Offset(3, 3).Interior.ColorIndex = 12 Then
            MsgBox "rouge vainqueur"
            Exit Sub
    End If
Next Cel
End Sub
on pourrait raccourcir le code avec des boucles, mais c'est juste une idée de présentée. Il faudrait juste faire le test après chaque positionnement d'un pion. Et ça dépend de la nature du "pion". Et faire une RAZ tu tableau.
A+
 

matdav78

XLDnaute Nouveau
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

Merci pour la réponse c'est cool.
Par contre est ce que vous pourriez juste me dire ou je dois ajouter ça par rapport à mon fichier que j'ai joints précédemment?
Car j'ai essayé de le rajouté et cela ne change rien...
Merci
 

Gorfael

XLDnaute Barbatruc
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

Salut matdav78 et le forum
J'ai un peu modifié mon code : il partait du principe que c'était le premier à avoir 4 "pions" d'alignés qui gagnait, et donc, on recommençait une partie.
Là, tant que tu peux jouer, tu joues, et on fait le décompte des "4 pions alignés".

Deux bonnes heures que je cherche pourquoi ça ne faisait pas ce que je voulais, pour finir par me rendre compte que si tu utilises un Offset sur des cellules fusionnées, le résultat n'est pas le même que si elle ne sont pas fusionnées :mad:.

Plus les quelques erreurs de raisonnement et je ne réponds que maintenant
A+
 

Pièces jointes

  • projet excel 3.xls
    78.5 KB · Affichages: 370

matdav78

XLDnaute Nouveau
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

Bonjour,
Merci beaucoup d'avoir pris du temps pour moi !!!
Juste, est-ce que il y a un moyen de terminer la partie tout de suite dès que 4 pions sont alignés en mettant: "Le joueur 1 (ou 2) gagne la partie !" ??
(Je ne sais pas si c'est de ça que vous voulez dire en disant que j'utilise un Offset...?)
Encore merci, et aucun problème de ne pas avoir répondu tout de suite ;)
A+
 

Gorfael

XLDnaute Barbatruc
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

Salut matdav78 et le forum
Utiliser Offset() en VBA revient à utiliser DECALER() en feuille de travail, à quelque chose près.
Code:
Sub Bouton()
'Déclaration =====================================
Dim Cel As Range, Cel_1 As Range, Coul As Long
Dim Lig As Long, Col As Integer, Compt As Integer, Z
'MEI =============================================
Set Cel = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Offset(1, 0)
'Cel = cellule en haut à gauche du bouton ayant appelé la macro, décalée d'une ligne
Set Cel_1 = Cells(12 + IIf((Range("C11") Mod 2) = 0, 0, 1), "G")
'cel_1= cellule G de la ligne (12+ 0 si C11 paire et 1 si C11 impaire)
'Coloriage cellule ===============================
'Boucle recherche de cellule à colorier ----------
If Cel.Interior.ColorIndex = 33 Then
    Do While Cel.Interior.ColorIndex = 33
    'Boucle tant que la couleur =33
        Set Cel = Cel.Offset(1, 0)
        'décalage de cel d'une ligne
        X = Cel.Address(0, 0)
    Loop
    Cel.Offset(-1, 0).Interior.ColorIndex = Cel_1.Interior.ColorIndex
    'couleur de cel décalée d'une ligne vers le Haut = Celle de Cel-1
    Coul = Cel_1.Interior.ColorIndex * 4
    
    'Calcul du nombre de (4 cellules alignées) =======
    Cel_1.Offset(0, 1) = 0
    'remise à 0 compteur
    
    '4 possibilités :
    'En ligne, en colonne, en diagonale montante, en diagolage descendante
    'on ne peut avoir que 1 points au maximum par direction, pour une cellule
    'en ligne (C3:F8) ----------------------------------------
    For Lig = 3 To 8            'ligne 3 à 8
        For Col = 3 To 6        'colonne 3(C) à 6(F)
            Set Cel = Cells(Lig, Col)
            If Cel.Offset(0, 0).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(0, 1).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(0, 2).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(0, 3).Interior.ColorIndex = Cel_1.Interior.ColorIndex Then
                  Cel_1.Offset(0, 1) = Cel_1.Offset(0, 1) + 1
                  MsgBox "Manche gagnée par " & Cel_1.Offset(0, -1)
                  Exit Sub
            End If
        Next Col
    Next Lig
    'en colonne (C3:I5) --------------------------------------
    For Col = 3 To 9            'colonne 3(C) à 9(I)
        For Lig = 3 To 5        'ligne 3 à 5
            Set Cel = Cells(Lig, Col)
            If Cel.Offset(0, 0).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(1, 0).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(2, 0).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(3, 0).Interior.ColorIndex = Cel_1.Interior.ColorIndex Then
                  Cel_1.Offset(0, 1) = Cel_1.Offset(0, 1) + 1
                  MsgBox "Manche gagnée par " & Cel_1.Offset(0, -1)
                  Exit Sub
            End If
        Next Lig
    Next Col
    'en diagonale montante (C6:F8) --------------------------------------
    For Each Cel In [A8:F8]
        Compt = 0
        For Col = 0 To 2
            If Cel.Offset(-Col, Col).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(-(Col + 1), (Col + 1)).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(-(Col + 2), (Col + 2)).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset(-(Col + 3), (Col + 3)).Interior.ColorIndex = Cel_1.Interior.ColorIndex Then _
                        Compt = Compt + 1

        Next Col
        If Compt > 0 Then
            Cel_1.Offset(0, 1) = Cel_1.Offset(0, 1) + 1
            MsgBox "Manche gagnée par " & Cel_1.Offset(0, -1)
            Exit Sub
        End If
    Next Cel
    'en diagonale descendante (C3:F5) --------------------------------------
    For Each Cel In [A3:F3]
        Compt = 0
        For Col = 0 To 2
            If Cel.Offset(Col, Col).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset((Col + 1), (Col + 1)).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset((Col + 2), (Col + 2)).Interior.ColorIndex = Cel_1.Interior.ColorIndex And _
               Cel.Offset((Col + 3), (Col + 3)).Interior.ColorIndex = Cel_1.Interior.ColorIndex Then _
                        Compt = Compt + 1

        Next Col
        If Compt > 0 Then
            Cel_1.Offset(0, 1) = Cel_1.Offset(0, 1) + 1
            MsgBox "Manche gagnée par " & Cel_1.Offset(0, -1)
            Exit Sub
        End If
    Next Cel
    
    'Passage coup suivant ===========================
    Range("C11") = Range("C11") + 1
    'C11 augmenté de 1
    [A3:A4].Interior.ColorIndex = Cells(12 + IIf((Range("C11") Mod 2) = 0, 0, 1), "G").Interior.ColorIndex
    'A4:A4 : couleur qui doit jouer
Else
    MsgBox "la colonne est déjà pleine, veuillez rejouer ailleurs !!!"
End If
End Sub
devrait répondre à la demande.
A+
 

matdav78

XLDnaute Nouveau
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

Super, merci !
Encore des petites questions... (Désolé)
Les déclarations au début: Cel, Cel_1, Coul, Lig etc... sont des noms obligatoires ou l'on peut mettre ce que l'on veut? Et à quoi correspondent-elles chacune?
Set Cel = Cells(Lig, Col) correspond à quoi? (C'est quoi en language français?)
Merci d'avance pour ces réponses.
A+
 

matdav78

XLDnaute Nouveau
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

J'ai du mal à comprendre ces deux lignes là aussi...?
Set Cel = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Offset(1, 0)
'Cel = cellule en haut à gauche du bouton ayant appelé la macro, décalée d'une ligne
Set Cel_1 = Cells(12 + IIf((Range("C11") Mod 2) = 0, 0, 1), "G")
'cel_1= cellule G de la ligne (12+ 0 si C11 paire et 1 si C11 impaire)
 

Fo_rum

XLDnaute Accro
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

Bonjour,

Une autre programmation.
L’idée consiste à écrire dans les cases les noms et de comparer 4 cellules concaténées (définies dans des tableaux masqués). On peut aussi prévoir de créer ces tableaux par VBA pour éviter de les avoir sur la feuille.
A titre d’exemple, j’ai aussi raccourci des macros pour éviter des lignes identiques.
On peut aussi passer par une évènementielle pour remplacer ces boutons …
 

Pièces jointes

  • Puissance4.zip
    19.3 KB · Affichages: 147
  • Puissance4.zip
    19.3 KB · Affichages: 159
  • Puissance4.zip
    19.3 KB · Affichages: 171
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Bloqué pour programmé un jeu de puissance 4 en VBA

Salut matdav78 et le forum
Tes questions prouvent au moins que tu cherches à comprendre.
Les déclarations au début: Cel, Cel_1, Coul, Lig etc... sont des noms obligatoires ou l'on peut mettre ce que l'on veut? Et à quoi correspondent-elles chacune?
Set Cel = Cells(Lig, Col) correspond à quoi? (C'est quoi en language français?)
Les noms eux-mêmes sont ceux que tu choisis. Le plus représentatif possible (ça aide dans le dépannage).
Est-ce que la déclaration des variables est obligatoire ?
Réponse de normand : ça dépend de toi.
Personnellement, j'ai coché déclarations de variables obligatoires dans Outils>>Options de VBEditor. Pourquoi :
- Toutes mes variables commencent par une majuscule. J'écris mon code en minuscules. Quand j'en utilise une, si en validant la ligne, la première lettre reste en minuscule, c'est que j'ai fait une faute de frappe.
- Déclarer les variables dans le type attendu déclenche une (souvent) une erreur quand on la charge avec une valeur inadéquate (string au lieu de integer par exemple). Ce qui m'oblige à réfléchir à quoi va me servir ma variable, dans toute la macro, avec une chance de déclencher une erreur juste au moment où je charge ma variable, et non seulement quand je l'utilise dans une instruction qui coince.
Mais ce ne sont que des astuces qui me profitent.

Pour définir la cellule B5, en VBA, on peut écrire : [B5] ou Range("B5") ou cells(5,"B") ou cells(5,2)
Donc Cells(Lig, Col) revient à désigner la cellule dont la colonne=Col et la ligne=Lig
Avantages par rapport à range : col peut être un string ou un nombre.
Incovénient : VBE ne me propose pas les listes de propriétés/méthodes pour m'aider

si col ="AA" et lig=22 on peut écrire Range(col & lig) ou Cells(lig, col) pour la cellule AA22
si col =27 et Lig=30 => cellule AA30. Si j'ai à faire évoluer les colonnes successivement, c'est ce que j'emploie.
Après, c'est une question de lisibilité du code. Même si j'emploie range pour trouver les méthodes/propriétés, grâce à l'aide, j'utilise cells() dans mes boucles et [] pour les cellules fixes.
Je préfère utiliser Cells(20, "BL") que Cells(20, 64) => moins de risque de se tromper.
Code:
Set Cel = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Offset(1, 0)
on va repartir de ta feuille : plusieurs bouton qui tous lancent la macro : ils ont tous un nom différent et sont issus de la barre d'outils "Formulaire"
cel=range("A1") => mettre dans la variable de nom Cel la valeur que contient la cellule A1
Set cel=range("A1") => mettre dans la variable de nom Cel la cellule A1 (cel doit être Range ou Variant).
ActiveSheet.Shapes => collection des formes sur la feuille active
Application.Caller => nom de ce qui a lancé la macro (variable système).
TopLeftCell.Offset(1, 0) => cellule en haut à gauche, décalée d'une ligne et de 0 colonne.

Si tu cliques sur sur le Bouton de la colonne E, ton instruction sera
variable Cel = ActiveSheet.Shapes("Bouton 6").TopLeftCell (E2) .Offset(1, 0) (E3)
Cel sera donc E3
Code:
Set Cel_1 = Cells(12 + IIf((Range("C11") Mod 2) = 0, 0, 1), "G")
IIf((Range("C11") Mod 2) = 0, 0, 1) <=> if (range("C11") mod 2)=0 then Var=0 else Var=1. Mais pour pour cela, il m'aurait fallut une variable supplémentaire. Donc j'utilise IIf
Cel_1 = cellule colonne "G" et ligne 12 si C11 est pair et 13 si C11 est impair

J'ai essayé d'utiliser ton code au maximum.
A+
 
Dernière édition:

Discussions similaires