Pierre, feuille, ciseaux, Help ! [Résolu]

Signaler
Messages postés
2
Date d'inscription
vendredi 7 mars 2014
Statut
Membre
Dernière intervention
7 mars 2014
-
Messages postés
2
Date d'inscription
vendredi 7 mars 2014
Statut
Membre
Dernière intervention
7 mars 2014
-
Bonjour,

Je dois rédiger une macro qui réalise le jeu « Pierre - Feuille - Ciseaux » en faisant jouer l'utilisateur contre programme.
Le programme doit d'abord jouer en tirant aléatoirement un nombre entre 0 et 2.
0 symbolisera la pierre, 1 la feuille et 2 les ciseaux.
Puis, l'utilisateur choisie un chiffre entre 0 et 2 également.
Enfin, je dois indiquez s'il a gagné, ou s'il y a égalité.

Les règles : la pierre bat les ciseaux, les ciseaux battent la feuille et la feuille bat la pierre. Il y a égalité quand les deux joueurs tirent le même objet.

Voilà la macro que j'ai réaliser :
Sub pfc()

Const pierre As Integer = 0
Const feuille As Integer = 1
Const ciseaux As Integer = 2
Dim a As Integer
Dim b As Integer

Msgbox("0 symbolisera la pierre, 1 la feuille et 2 les ciseaux")
a = Int(Rnd() * 3)
b = InputBox("Choisissez")

Do While (b > 2)
b = InputBox("Choix invalide, Choisissez un chiffre entre 0 et 2")
Loop

Select Case score
Case a = b
MsgBox ("Egalité")
Case a = 0 And b = 1
MsgBox ("Gagné")
Case a = 0 And b = 2
MsgBox ("Perdu")
Case a = 1 And b = 0
MsgBox ("Perdu")
Case a = 1 And b = 2
MsgBox ("Gagné")
Case a = 2 And b = 0
MsgBox ("Gagné")
Case a = 2 And b = 1
MsgBox ("Perdu")
End Select

End Sub

Le problème est que le programme ignore les résultats perdant et je ne comprend pas pourquoi ?

Merci d'avance
A voir également:

3 réponses

Messages postés
32980
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
351
Bonjour,

1 - J'ai édité ton message pour y mettre la coloration syntaxique sur ton code : Voir ICI :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

2 - Change ton Select case en mettant TRUE à la place de SCORE

Select Case True
 Case a = b
    MsgBox ("Egalité")
 Case a = 0 And b = 1
    MsgBox ("Gagné")
 Case a = 0 And b = 2
    MsgBox ("Perdu")
 Case a = 1 And b = 0
    MsgBox ("Perdu")
 Case a = 1 And b = 2
    MsgBox ("Gagné")
 Case a = 2 And b = 0
    MsgBox ("Gagné")
 Case a = 2 And b = 1
    MsgBox ("Perdu")
End Select

End Sub

Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 juin 2021
156
Perso, quand je vois un Case comme ça, je pense qu'un structure IF ... ELSEIF .... ELSE ... END IF serait plus adaptée.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Tout-à-fait d'accord avec toi, NHenry. Et nous l'avons vu dans une autre discussion, aujourd'hui-même.
Messages postés
32980
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
351
Franchement;.. entre un SELECT CASE TRUE et des IF imbriqués... je ne suis pas sûr que la différence au niveau de la durée de traitement (quelque soit le nombre de conditions) soit réellement perceptible... sachant qu'il me semble que le Select case est de toutes façons plus rapide...
Et..sachant que de toutes façons (comme avec les IF) dès que la condition est vérifiée le programme quitte le branchement...

Je trouve également que la lecture d'un select case est largement plus simple qu'avec des If imbriqués...

Donc.contrairement à vous...je pense que sicfried à fait le bon choix...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
"Je trouve également que la lecture d'un select case est largement plus simple qu'avec des If imbriqués.."
Sur ce point précis : sans aucun doute.
Pour ce qui est par contre de la durée d'exécution ; oui, lorsqu'il s'agit de select case concernant des appréciations "directes" d'une seule valeur, non, dans le cas présent, où deux valeurs sont à apprécier.
Je répète maintenant : la différence de durée de traitement sera dans le cas présent imperceptible, compte tenu du faible nombre d'appréciations à faire. Elle serait très perceptible (environ 25 % de différence) avec un grand nombre d'appréciations à faire.
Nous en avons eu un très bel exemple (où, précisément, devaient être appréciées plusieurs valeurs) aujourd'hui-même :
"avec des If-ElseIf-End If : en moins de 3 secondes
avec des Select Case True : en 4,26 secondes
"
Voilà.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
je n'ai pas le temps de faire des essais, mais voilà à quoi ressemblerait le code à écrire en respectant (en admettant que la logique soit la bonne) la logique du code présenté par sicfried :
toto = "perdu"
Select Case a
Case b
toto = "égalité"
Case 0
If b = 1 Then toto = "gagné"
Case 1
If b = 2 Then toto = "gagné"
Case 2
If b <> 1 Then toto = "gagné"
End Select
MsgBox toto
Une autre fois : en respectant la logique du code montré, sans préjudice de sa justesse.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Bonjour,
cela me parait être un cas de figure ou l'on aurait intérêt, en matière de rapidité (nous l'avons vu encore aujourd'hui dans une autre discussion), à traiter en select case imbriqués ou en mixant des select case et des if/elseif
Mais bon ... compte tenu du nombre très faible de vérifications d'occurrences à faire dans ce cas de figure ===>> la différence de durée d'exécution sera imperceptible.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
2
Date d'inscription
vendredi 7 mars 2014
Statut
Membre
Dernière intervention
7 mars 2014

Merci pour ces réponses simple et rapide.