Pierre, feuille, ciseaux, Help !

Résolu
sicfried Messages postés 2 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 7 mars 2014 - Modifié par jordane45 le 7/03/2014 à 12:48
sicfried Messages postés 2 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 7 mars 2014 - 7 mars 2014 à 16:42
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

3 réponses

jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
7 mars 2014 à 12:55
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

1
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
Modifié par NHenry le 7/03/2014 à 13:04
Perso, quand je vois un Case comme ça, je pense qu'un structure IF ... ELSEIF .... ELSE ... END IF serait plus adaptée.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 mars 2014 à 13:14
Tout-à-fait d'accord avec toi, NHenry. Et nous l'avons vu dans une autre discussion, aujourd'hui-même.
0
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
7 mars 2014 à 13:54
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...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 7/03/2014 à 14:26
"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à.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 7/03/2014 à 16:16
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 7/03/2014 à 13:13
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
1
sicfried Messages postés 2 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 7 mars 2014
7 mars 2014 à 16:42
Merci pour ces réponses simple et rapide.
0
Rejoignez-nous