pape0
Messages postés132Date d'inscriptionmercredi 18 février 2004StatutMembreDernière intervention 1 septembre 2014
-
7 août 2008 à 13:52
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
13 août 2008 à 21:00
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 13 août 2008 à 21:00
Oui, c'est un choix, au même titre que les images...
Amicalement,
Us.
cs_Le Pivert
Messages postés7885Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention28 mars 2023137 13 août 2008 à 16:48
Oui c'est exact, mais si tu ne veux pas mettre un code en dur tu es quand même obligé de mettre le fichier dans ton classeur, ce qui à mon avis revient au même.
Merci
@
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 13 août 2008 à 16:27
Désolé, je n'y étais pas. Je vois que tu as repris le jeu avec un chrono...
Petite remarque, pour Excel, il n'est pas obligatoire de mettre un objet "son" sur la feuille, on peut l'intégrer aussi au code VBA... c'est plus discret... voir à ce sujet : http://www.codyx.org/snippet_jouer-arreter-son-wav_42.aspx#127
Amicalement,
Us.
cs_Le Pivert
Messages postés7885Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention28 mars 2023137 13 août 2008 à 16:09
Non c'est un Timer qui détermine un temps donné pour le jeu.C'est un module qui remplace le Timer de VB car il n'y en a pas en VBA.
Je tiens à faire une rectif sur la dernière mise à jour:
MsgBox "Erreur de saisie"
TimerOff
sufit pour arrête le Timer
Merci US_30
@+
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 13 août 2008 à 15:53
Bonjour,
J'ai manqué un épisode ?...
Est-ce que vous parlez du Timer de Randomize ?... Si oui, alors le Timer ne peut pas s'arrêter pour la simple raison qu'il renvoit uniquement une valeur représentant le nombre de secondes écoulées depuis minuit... Et "randomize Timer", donc permet d'initialiser le générateur de nombre aléatoire sur une valeur quelconque, enfin plutôt peu évidente à deviner... sans cela, on risque de toujours obtenir la même suite de nb aléatoire...
Amicalement,
Us.
cs_Le Pivert
Messages postés7885Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention28 mars 2023137 13 août 2008 à 09:12
En VBA Excel: il va sans dire que vous pouvez faire défiler toutes les secondes en changeant TimerOn 5000 en 1000 et les point 5 par 1, dans le module Timer.
Par contre j'ai un petit problème en cas d'erreur de saisie: impossible d'arrêter le Timer à part la méthode radicale de la fermeture du programme. Si quelqu"un à une idée elle serait la bienvenue, merci.
cs_Le Pivert
Messages postés7885Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention28 mars 2023137 8 août 2008 à 08:04
Je te remercie de tes conseils, j'avais déjà remplacé en VB les checkBox par des boutons. Pour le reste j'étudie cela en détail et mettrais une mise à jour.Encore merci pour ces commentaires constructifs qui vont me faire avancer d'un pas.
@+ US_30
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 8 août 2008 à 00:06
Re, re...
De plus en mettant ChoixJoueur en variable global on réduit encore le codage.
Pour peu, qu'on simplifie les messages, on obtient le code court suivant :
=
Option Explicit
Dim ChoixJoueur As Long
Sub Choix(Valeur As Long)
ChoixJoueur = Valeur
Me.Image1.Picture = LoadPicture(ActiveWorkbook.Path & "" & CStr(Valeur) & ".jpg")
Image2.Picture = Nothing
Label1.Caption = vbNullString
End Sub
Private Sub OptionButton1_Click()
Call Choix(1)
End Sub
Private Sub OptionButton2_Click()
Call Choix(2)
End Sub
Private Sub OptionButton3_Click()
Call Choix(3)
End Sub
Private Sub OptionButton4_Click()
Call Choix(4)
End Sub
Private Sub UserForm_Activate()
Randomize Timer
OptionButton1_Click
End Sub
Private Sub CommandButton1_Click()
'Ordinateur
Dim ChoixOrdi As Long
ChoixOrdi = Int(4 * Rnd() + 1)
Me.Image2.Picture = LoadPicture(ActiveWorkbook.Path & "" & CStr(ChoixOrdi) & ".jpg")
'Résultat
Debug.Print ChoixJoueur & " " & ChoixOrdi
If ChoixJoueur = ChoixOrdi Then
Label1 = "Egalité"
ElseIf ((ChoixJoueur 1) And (ChoixOrdi 2)) Or ((ChoixJoueur = 2) And (ChoixOrdi = 4)) _
Or ((ChoixJoueur 3) And (ChoixOrdi 1)) Or ((ChoixJoueur = 4) And (ChoixOrdi = 3)) Then
Label1 = "Gagné"
Label2 = CStr(CDbl(Label2) + 1)
Else
Label1 = "Perdu"
Label3 = CStr(CDbl(Label3) + 1)
End If
End Sub
=
Voilà, pour une première optimisation.
Amicalement,
Us.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 7 août 2008 à 23:27
Re,
On penser aussi à renommer les fichiers images par leurs nombres correspondant, ainsi le SELECT CASE devient aussi inutile, et le reste du code se simplifie d'avantage.
Amicalement,
Us.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 7 août 2008 à 23:11
Bonsoir,
J'ai regardé ton code en VBA, il y a encore pas mal d'améliorations possibles...
Par exemple, le simple fait de choisir des "OptionButton" au lieu de "CheckBox", permet un code allégé, car la gestion du choix d'une seule possibilité est automatique. Ensuite le clique sur ces "optionbutton" peut facilement se simplifier avec une SUB commune. Pour retenir le choix, il suffit de récupérer l'optionbutton sélectionné pour le joueur, et de mettre le choix de l'ordi dans une variable; au lieu de passer par des objets "Textbox" pour retenir ces nombres...
Les lignes :
If TextBox2.Text TextBox1.Text Then Label2.Text "Egalité"
présentent de nombreuses fois, ne sont pas utiles... Juste un fois, suffit.
Le titre de l'userform1 (caption) peut se définir directement dans les propriétés sans passer par le codage (plus simple, donc.)
Donc, en remplaçant les CheckBox par des OptionButtons, en retirant les Textbox, et en suivant mes remarques, j'ai obtenu le code simplifié suivant :
=
Option Explicit
Sub Choix(Fichier As String)
Me.Image1.Picture = LoadPicture(ActiveWorkbook.Path & "" & Fichier & ".jpg")
Image2.Picture = Nothing
Label1.Caption = vbNullString
End Sub
Private Sub OptionButton1_Click()
Call Choix("ciseaux")
End Sub
Private Sub OptionButton2_Click()
Call Choix("feuille")
End Sub
Private Sub OptionButton3_Click()
Call Choix("pierre")
End Sub
Private Sub OptionButton4_Click()
Call Choix("puits")
End Sub
Private Sub UserForm_Activate()
Randomize Timer
OptionButton1_Click
End Sub
Private Sub CommandButton1_Click()
'Ordinateur
Dim Img As String, ChoixOrdi As Long
ChoixOrdi = Int(4 * Rnd() + 1)
Select Case ChoixOrdi
Case 1
Img = "ciseaux"
Case 2
Img = "feuille"
Case 3
Img = "pierre"
Case 4
Img = "puits"
End Select
If OptionButton1 True Then ChoixJoueur 1
If OptionButton2 True Then ChoixJoueur 2
If OptionButton3 True Then ChoixJoueur 3
If OptionButton4 True Then ChoixJoueur 4
'Résultat
If ChoixJoueur 1 And ChoixOrdi 2 Then
Label1 = "Gagné, le ciseaux coupe la feuille"
Label2 = CStr(CDbl(Label2) + 1)
ElseIf ChoixJoueur 2 And ChoixOrdi 4 Then
Label1 = "Gagné, la feuille bouche le puit"
Label2 = CStr(CDbl(Label2) + 1)
ElseIf ChoixJoueur 3 And ChoixOrdi 1 Then
Label1 = "Gagné, la pierre casse le ciseau"
Label2 = CStr(CDbl(Label2) + 1)
ElseIf ChoixJoueur 4 And ChoixOrdi 3 Then
Label1 = "Gagné, la pierre tombe dans le puit"
Label2 = CStr(CDbl(Label2) + 1)
ElseIf ChoixJoueur = ChoixOrdi Then
Label1 = "Egalité"
Else
Label1 = "Perdu"
Label3 = CStr(CDbl(Label3) + 1)
End If
End Sub
=
Je suis resté avec un code de base, mais il y a surement matière à encore quelques simplifications...
Amicalement,
Us.
cs_Le Pivert
Messages postés7885Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention28 mars 2023137 7 août 2008 à 16:01
En lisant en détail le sujet sur le site nommé plus haut, il existe une variante avec le puits, donc je laisse la source en l'état.Ceci n'a pas trop d'importance vu qu'il s'agit de code ici-même.Mais la remarque était judicieuse.
cs_Le Pivert
Messages postés7885Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention28 mars 2023137 7 août 2008 à 14:59
Tout à fait exact, j'ai la confirmation sur le Net.J'y ai joué il y a si longtemps! (J'aurais dû me renseigner avant).Merci et voici la confirmation.
http://fr.wikipedia.org/wiki/Pierre-feuille-ciseaux. @+ PaPeo
pape0
Messages postés132Date d'inscriptionmercredi 18 février 2004StatutMembreDernière intervention 1 septembre 2014 7 août 2008 à 13:52
13 août 2008 à 21:00
Amicalement,
Us.
13 août 2008 à 16:48
Merci
@
13 août 2008 à 16:27
Petite remarque, pour Excel, il n'est pas obligatoire de mettre un objet "son" sur la feuille, on peut l'intégrer aussi au code VBA... c'est plus discret... voir à ce sujet : http://www.codyx.org/snippet_jouer-arreter-son-wav_42.aspx#127
Amicalement,
Us.
13 août 2008 à 16:09
Je tiens à faire une rectif sur la dernière mise à jour:
MsgBox "Erreur de saisie"
TimerOff
sufit pour arrête le Timer
Merci US_30
@+
13 août 2008 à 15:53
J'ai manqué un épisode ?...
Est-ce que vous parlez du Timer de Randomize ?... Si oui, alors le Timer ne peut pas s'arrêter pour la simple raison qu'il renvoit uniquement une valeur représentant le nombre de secondes écoulées depuis minuit... Et "randomize Timer", donc permet d'initialiser le générateur de nombre aléatoire sur une valeur quelconque, enfin plutôt peu évidente à deviner... sans cela, on risque de toujours obtenir la même suite de nb aléatoire...
Amicalement,
Us.
13 août 2008 à 09:12
Par contre j'ai un petit problème en cas d'erreur de saisie: impossible d'arrêter le Timer à part la méthode radicale de la fermeture du programme. Si quelqu"un à une idée elle serait la bienvenue, merci.
8 août 2008 à 08:04
@+ US_30
8 août 2008 à 00:06
De plus en mettant ChoixJoueur en variable global on réduit encore le codage.
Pour peu, qu'on simplifie les messages, on obtient le code court suivant :
=
Option Explicit
Dim ChoixJoueur As Long
Sub Choix(Valeur As Long)
ChoixJoueur = Valeur
Me.Image1.Picture = LoadPicture(ActiveWorkbook.Path & "" & CStr(Valeur) & ".jpg")
Image2.Picture = Nothing
Label1.Caption = vbNullString
End Sub
Private Sub OptionButton1_Click()
Call Choix(1)
End Sub
Private Sub OptionButton2_Click()
Call Choix(2)
End Sub
Private Sub OptionButton3_Click()
Call Choix(3)
End Sub
Private Sub OptionButton4_Click()
Call Choix(4)
End Sub
Private Sub UserForm_Activate()
Randomize Timer
OptionButton1_Click
End Sub
Private Sub CommandButton1_Click()
'Ordinateur
Dim ChoixOrdi As Long
ChoixOrdi = Int(4 * Rnd() + 1)
Me.Image2.Picture = LoadPicture(ActiveWorkbook.Path & "" & CStr(ChoixOrdi) & ".jpg")
'Résultat
Debug.Print ChoixJoueur & " " & ChoixOrdi
If ChoixJoueur = ChoixOrdi Then
Label1 = "Egalité"
ElseIf ((ChoixJoueur 1) And (ChoixOrdi 2)) Or ((ChoixJoueur = 2) And (ChoixOrdi = 4)) _
Or ((ChoixJoueur 3) And (ChoixOrdi 1)) Or ((ChoixJoueur = 4) And (ChoixOrdi = 3)) Then
Label1 = "Gagné"
Label2 = CStr(CDbl(Label2) + 1)
Else
Label1 = "Perdu"
Label3 = CStr(CDbl(Label3) + 1)
End If
End Sub
=
Voilà, pour une première optimisation.
Amicalement,
Us.
7 août 2008 à 23:27
On penser aussi à renommer les fichiers images par leurs nombres correspondant, ainsi le SELECT CASE devient aussi inutile, et le reste du code se simplifie d'avantage.
Amicalement,
Us.
7 août 2008 à 23:11
J'ai regardé ton code en VBA, il y a encore pas mal d'améliorations possibles...
Par exemple, le simple fait de choisir des "OptionButton" au lieu de "CheckBox", permet un code allégé, car la gestion du choix d'une seule possibilité est automatique. Ensuite le clique sur ces "optionbutton" peut facilement se simplifier avec une SUB commune. Pour retenir le choix, il suffit de récupérer l'optionbutton sélectionné pour le joueur, et de mettre le choix de l'ordi dans une variable; au lieu de passer par des objets "Textbox" pour retenir ces nombres...
Les lignes :
If TextBox2.Text TextBox1.Text Then Label2.Text "Egalité"
présentent de nombreuses fois, ne sont pas utiles... Juste un fois, suffit.
Le titre de l'userform1 (caption) peut se définir directement dans les propriétés sans passer par le codage (plus simple, donc.)
Donc, en remplaçant les CheckBox par des OptionButtons, en retirant les Textbox, et en suivant mes remarques, j'ai obtenu le code simplifié suivant :
=
Option Explicit
Sub Choix(Fichier As String)
Me.Image1.Picture = LoadPicture(ActiveWorkbook.Path & "" & Fichier & ".jpg")
Image2.Picture = Nothing
Label1.Caption = vbNullString
End Sub
Private Sub OptionButton1_Click()
Call Choix("ciseaux")
End Sub
Private Sub OptionButton2_Click()
Call Choix("feuille")
End Sub
Private Sub OptionButton3_Click()
Call Choix("pierre")
End Sub
Private Sub OptionButton4_Click()
Call Choix("puits")
End Sub
Private Sub UserForm_Activate()
Randomize Timer
OptionButton1_Click
End Sub
Private Sub CommandButton1_Click()
'Ordinateur
Dim Img As String, ChoixOrdi As Long
ChoixOrdi = Int(4 * Rnd() + 1)
Select Case ChoixOrdi
Case 1
Img = "ciseaux"
Case 2
Img = "feuille"
Case 3
Img = "pierre"
Case 4
Img = "puits"
End Select
Me.Image2.Picture = LoadPicture(ActiveWorkbook.Path & "" & Img & ".jpg")
'Joueur
Dim ChoixJoueur As Long
If OptionButton1 True Then ChoixJoueur 1
If OptionButton2 True Then ChoixJoueur 2
If OptionButton3 True Then ChoixJoueur 3
If OptionButton4 True Then ChoixJoueur 4
'Résultat
If ChoixJoueur 1 And ChoixOrdi 2 Then
Label1 = "Gagné, le ciseaux coupe la feuille"
Label2 = CStr(CDbl(Label2) + 1)
ElseIf ChoixJoueur 2 And ChoixOrdi 4 Then
Label1 = "Gagné, la feuille bouche le puit"
Label2 = CStr(CDbl(Label2) + 1)
ElseIf ChoixJoueur 3 And ChoixOrdi 1 Then
Label1 = "Gagné, la pierre casse le ciseau"
Label2 = CStr(CDbl(Label2) + 1)
ElseIf ChoixJoueur 4 And ChoixOrdi 3 Then
Label1 = "Gagné, la pierre tombe dans le puit"
Label2 = CStr(CDbl(Label2) + 1)
ElseIf ChoixJoueur = ChoixOrdi Then
Label1 = "Egalité"
Else
Label1 = "Perdu"
Label3 = CStr(CDbl(Label3) + 1)
End If
End Sub
=
Je suis resté avec un code de base, mais il y a surement matière à encore quelques simplifications...
Amicalement,
Us.
7 août 2008 à 16:01
7 août 2008 à 14:59
http://fr.wikipedia.org/wiki/Pierre-feuille-ciseaux.
@+ PaPeo
7 août 2008 à 13:52