Bonjour à tous,
En effet, voilà des chiffres qui me laissent baba. Je me doutais bien que pas mal de monde passe par là, mais j'étais loin d'en soupçonner l'importance.
Comme promis, voici ma réponse au défi lancé plus haut:
Avant daller plus loin, je rappelle que je ne suis quun amateur averti. Je veux dire par là que si les pros de la programmation trouvent quelques maladresses dans ce qui va suivre, jaccepterai leurs critiques avec joie, pourvu quelles soient constructives.
Dans un premier temps jai ouvert une feuille de calcul (Feuil1) dans laquelle jai limité à 5 la largeur des colonnes de A à Z . Même chose pour les lignes de 1 à 15 dont la hauteur a été fixée à 30.
La plage A1 à Z15 est entièrement blanche (Cest plus sympa)
La plage G8 à I10 est quadrillée et entourée en traits gras. (Format de cellules, bordures)
Tous les caractères de cette grille sont centrés et assez gros et gras. (Ex Arial 20)
Les caractères des cellules M8 à M11 sont également centrés et de même taille que ceux de la grille. (Ce sera laddition)
Le bord supérieur de la cellule M11 est souligné par un trait gras. (Format de cellules, bordures)
Un gros + gras est placé en L9 et L10.
La formule : =Somme(M8:M10) est placée dans la cellule M11
La cellule M11 peut être protègée (Mais exclusivement celle-ci.)
Les lignes de 1 à 5 sont utilisées par du texte dinvite au jeu, mais nont aucun rôle dans le déroulement du programme.
Un texte WordArt affiche : « Vous avez perdu ». Ce texte prend toute la largeur de l
écran. (Il disparaîtra pendant le jeu).
Un autre texte WordArt, plus petit affiche : « Rejouer ? », et un troisième : « Quitter ». Ces deux-là disparaîtront aussi pendant le jeu.
Attention, ces textes WordArt se nommant automatiquement à leur création, il est important de connaître leur nom. (Il suffit de cliquer dessus. Leur nom saffiche dans la fenêtre au dessus de A1) . En principe, ce devrait être WordArt 1, WordArt 2 et WordArt 3, sauf si vous avez affiché plusieurs modèles avant de vous décider. Dans ce cas, il y aura une légère modif à faire dans les macros. (Je les signalerai en temps utile).
Passons maintenant aux macros : Le plus simple est de les recopier telles quelles.
Sub auto_exec()
'Mise en place automatique à l'ouverture du jeu.
Application.Run ("MiseEnPlace")
End Sub
Sub MiseEnPlace()
'Efface l'ancienne addition
Range("M8:M10").Select
Selection.ClearContents
'Met les chiffres en place dans la grille
Dim colonne As Integer, ligne As Integer, chiffre As Integer
chiffre = 1
For colonne = 1 To 3
For ligne = 1 To 3
Feuil1.Cells(7 + colonne, 6 + ligne).Value = chiffre
chiffre = chiffre + 1
Next ligne
Next colonne
'Remet le compteur de coups joués à 1
Range("Z1").Value = 1
Range("A2").Select
'Efface les messages de partie perdue.
ActiveSheet.Shapes("WordArt 1").Visible = False
ActiveSheet.Shapes("WordArt 2").Visible = False
ActiveSheet.Shapes("WordArt 3").Visible = False
End Sub
Sub PremiersChiffres()
'Place le chiffre choisi dans l'addition
Cells(7 + Range("Z1").Value, 13).Value = ActiveCell.Value
ActiveCell.Value = ""
'Incrémente le compteur de coups joués
Range("Z1").Value = Range("Z1").Value + 1
'Lance le message de partie perdue si les trois coups ont été joués sans atteindre "12"
If Range("Z1").Value = 4 Then
Application.Run ("Resultat")
End If
End Sub
Sub TroisièmeChiffre()
'Déplace le chiffre dans tous les sens s'il doit permettre d'arriver à "12"
Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, f As Integer, g As Integer
a = ActiveCell.Row
b = ActiveCell.Column
g = ActiveCell.Value
5
'D'abord, à l'horizontale (décalage aléatoire)
Randomize
e = 1 - Int(Rnd * 3)
c = ActiveCell.Row + e
'Recalcule le décalage s'il doit faire sortir le chiffre de la grille
If c < 8 Or c > 10 Then
GoTo 5
End If
10
'Ensuite, à la verticale (décalage aléatoire)
Randomize
f = 1 - Int(Rnd * 3)
d = ActiveCell.Column + f
'Recalcule le décalage s'il doit faire sortir le chiffre de la grille
If d < 7 Or d > 9 Then
GoTo 10
'Recalcule le décalage s'il est egal à 0
ElseIf a = c And b = d Then
GoTo 10
End If
'Place dans l'ancienne cellule le chiffre qui est écrasé par celui qui s'échappe.
Cells(a, b).Value = Cells(c, d).Value
'Place le chiffre qui s'échappe dans la cellule ainsi recalculée
Cells(c, d).Value = g
Range("Z2").Value = 1
Range("Z1").Value = Range("Z1").Value + 1
End Sub
Sub erreur()
'Place dans l'addition le premier chiffre disponible restant dans la grille,
'à condition qu'il soit supérieur à 0 et qu'il ne totalise pas "12"
Dim a As Integer, b As Integer, d As Integer
For a = 1 To 3
For b = 1 To 3
d = Feuil1.Cells(7 + a, 6 + b).Value
If d > 0 And Range("M11").Value + d <> 12 Then
Range("M10").Value = d
Cells(7 + a, 6 + b).Value = ""
'Arrête les boucles dès que la condition est remplie
GoTo 10
End If
Next b
Next a
10
End Sub
Sub Resultat()
'Fait apparaître le message de partie perdue.
ActiveSheet.Shapes("WordArt 1").Visible = True
ActiveSheet.Shapes("WordArt 2").Visible = True
ActiveSheet.Shapes("WordArt 3").Visible = True
End Sub
Sub quitter()
ActiveWorkbook.Close
End Sub
Dans les macros « MiseEnPlace » et « Resultat », faire correspondre sil y a lieu, le nom des WordArt avec ceux de la feuille de calcul. (Lordre daffichage na aucune importance.)
Retour à la feuille de calcul :
Clic droit sur « Rejouer ? » ..Affecter une macro : »Mise en place ».
Clic droit sur « Quitter »..Affecter une macro : « Quitter »
Clic droit sur longlet « Feuil1 »..Visualiser le code.
Sur cette page blanche, placer le code suivant :
Sub Worksheet_SelectionChange(ByVal Target As Range)
'Ne permet de fonctionner que si la cellule cliquée se trouve à l'intérieur de la grille.
If ActiveCell.Row > 7 And ActiveCell.Row < 11 And ActiveCell.Column > 6 And ActiveCell.Column < 10 Then
'Interdit le fonctionnement si le message d'erreur n'est pas effacé ou si la cellule sélectionnée est vide
If Range("Z2").Value = 2 Then
If ActiveSheet.Shapes("WordArt 3").Visible = True Or ActiveCell.Value = "" Then
GoTo 10
'Lance la macro d'affichage des chiffres dans l'addition,tout en évitant d'arriver à "12" en deux coups
ElseIf Range("M11").Value + ActiveCell.Value <> 12 And Range("Z1").Value < 4 Then
Application.Run ("PremiersChiffres")
'lance la macro d'esquive du troisième chiffre, entre le 3eme et le 9eme coup.
ElseIf Range("Z1").Value > 2 And Range("Z1").Value < 9 And Range("M11").Value + ActiveCell.Value = 12 Then
Application.Run ("TroisièmeChiffre")
'lance la macro d'affichage d'un chiffre aléatoire et de partie perdue à partir du 9eme coup
ElseIf Range("Z1").Value > 8 Then
Application.Run ("Erreur")
Application.Run ("Resultat")
End If
End If
End If
'Anti rebond
Range("Z2").Value = 2
10
End Sub
Retour à la feuille de calcul.
Enregistrer le travail. Cest terminé. Cliquer sur « Rejouer ? »
Si tout sest bien passé, les trois WordArt vont seffacer, laddition se vider et la grille se remplir.
A vous de jouer et amusez vous bien.
Ps: J'ai mis en Z1 et Z2 des valeurs qui devraient être déclarées comme variables de niveau procédure, mais j'ai du mal à contrôler la durée de vie de ces variables. Si quelqu'un peut me donner la syntaxe, je suis preneur.