sicfried
Messages postés2Date d'inscriptionvendredi 7 mars 2014StatutMembreDernière intervention 7 mars 2014
-
Modifié par jordane45 le 7/03/2014 à 12:48
sicfried
Messages postés2Date d'inscriptionvendredi 7 mars 2014StatutMembreDerniè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
A voir également:
Pierre feuille ciseaux en ligne
Shi fu mi en ligne - Meilleures réponses
Pierre papier ciseaux en ligne - Meilleures réponses
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
NHenry
Messages postés15069Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention29 mai 2023158 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.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 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.
jordane45
Messages postés37529Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention 5 juin 2023341 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...
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 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à.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 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.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 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
Modifié par NHenry le 7/03/2014 à 13:04
7 mars 2014 à 13:14
7 mars 2014 à 13:54
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...
Modifié par ucfoutu le 7/03/2014 à 14:26
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à.
Modifié par ucfoutu le 7/03/2014 à 16:16
Une autre fois : en respectant la logique du code montré, sans préjudice de sa justesse.