JEU DU CISEAUX

pape0 Messages postés 132 Date d'inscription mercredi 18 février 2004 Statut Membre Dernière intervention 1 septembre 2014 - 7 août 2008 à 13:52
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 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.

https://codes-sources.commentcamarche.net/source/47532-jeu-du-ciseaux

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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és 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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és 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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és 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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és 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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

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.
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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és 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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és 132 Date d'inscription mercredi 18 février 2004 Statut Membre Dernière intervention 1 septembre 2014
7 août 2008 à 13:52
dans l'histoire le puit nexiste pas!
Rejoignez-nous