Bonjour,
j'ai un dm a rendre pour très bientôt dont le but est de :
jeter 2 dés cubiques et on compte la somme obtenu. On s’arrête et on a gagne quand la somme vaut 7 ou 11, on s’arrête et on a perdu quand la somme fait 2 ou 3 ou 12, on rejoue dans les autres cas
et il a une erreur que je ne trouve pas dans mon code.
voici mon code python :
from random import *
des1=randint(1,6)
des2=randint(1,6)
total=des1 + des2
compteur= 0
gagne= [7,11]
perdu= [2,3,12]
if (total == perdu):
print("vous avez perdu en", compteur,"coup(s)")
if (total == gagne):
print("vous avez gagne en",compteur,"coup(s)")
else:
print ("vous avez obtenu le",des1,"et le",des2,"soit un total de",total)
des1=randint(1,6)
des2=randint(1,6)
compteur= compteur + 1
while (total != gagne and perdu)
# une proposition
Posté par pstk (site web personnel) . Évalué à 1. Dernière modification le 30 octobre 2016 à 18:58.
Je précise que je n'ai jamais fait de python, donc c'est très probablement crade. Et que je suis pas spécialement doué en code.
Pour ton while mise à part qu'il est mal placé, tu ne peux pas dire 'tant que ce n'est pas gagné et perdu, je continue' alors que je justement tu veux arrêté si l'un ou l'autre, donc 'tant que ce n'est pas gagné ou perdu, je continue'.
Bizarre que tu n'ai pas trouvé le problème de syntaxe ?
[^] # Re: une proposition
Posté par Marotte ⛧ . Évalué à 2.
Il n’a pas précisé que c’était un problème de syntaxe. J’ai eu la même réaction que toi : il faut un 'or' et pas un 'and'.
Par contre je pense qu’il faut des parenthèses car '!=' est prioritaire sur 'or' :
Cela dit, après réflexion (et test), comparer un scalaire à une liste ne permet pas de checker si le scalaire est dans cette liste…
et :
list1 or list2
semble renvoyer list1 (logique…).[^] # Re: une proposition
Posté par gamerkilli . Évalué à 1.
sa ma pourtant l'air de fonctionner le scalaire est bien comparé
résultat:
vous avez obtenu le 3 et le 2 soit un total de 5
vous avez obtenu le 5 et le 3 soit un total de 8
vous avez obtenu le 4 et le 5 soit un total de 9
vous avez obtenu le 6 et le 6 soit un total de 12
conclusion: vous avez perdu en 4 coup(s)
par contre j'aimerai donner le choix a l'utilisateur de rejeter les dés ou non , je pense qu'avec une condition booléenne sa fera l'affaire non ?
[^] # Re: une proposition
Posté par Marotte ⛧ . Évalué à 2.
Définitivement, en Python, 2 & 3, comparer un entier à une liste n’a pas de sens.
Il faut utiliser
element in list
pour savoir si un élément se trouve dans une liste, comme l’a montré pstk. Par contre j’ai un problème avec la condition pour le while dans son code.Je ferais :
[^] # Re: une proposition
Posté par pstk (site web personnel) . Évalué à 2.
dans le titre : 'invalid syntax'
Si tu c/c le code, tu verras qu'une bonne partie ce n'est qu'un problème de syntaxe avant l'algorithme lui même.
Pour le reste, je ne peux pas aider :\
[^] # Re: une proposition
Posté par Marotte ⛧ . Évalué à 2.
oui, vu le titre après coup…
son code étant malformé (indentation perdue) il était de fait syntaxiquement foireux… j’ai pas pris la peine de le ré-identer pour le tester…
[^] # Re: une proposition
Posté par gamerkilli . Évalué à 1. Dernière modification le 30 octobre 2016 à 21:25.
bonjour ,merci pour vos reponses oui effectivement il s'agit bien dans OR ..
j'ai testé le code et il fonctionne bien sauf que je n'ai jamais utiliser le sys et le IN pourait tu m'expliquer très rapidement leur utilité? :)
[^] # Re: une proposition
Posté par pstk (site web personnel) . Évalué à 1.
euh… google ? Comme je te l'ai dit, je n'ai jamais fait de python. J'ai simplement googlé pour trouver la syntaxe python de ce que je voulais faire.
le sys , c'est pour arrêter sortir du script quand la condition est validée, à la manière d'un exit dans bash. Sinon ton script s'arrêtera jamais… Essaye sans.
pour le in : http://stackoverflow.com/questions/15112125/how-do-i-test-one-variable-against-multiple-values
[^] # Re: une proposition
Posté par gamerkilli . Évalué à 1.
Oui en gros le IN se traduirait par exemple(4 in nombre) par : 4 apparait dans la variable nombre.
merci beaucoup pour vos réponses a tout les 2 elles m'ont étaient très utiles ! :)
[^] # Re: une proposition
Posté par Marotte ⛧ . Évalué à 3. Dernière modification le 30 octobre 2016 à 22:21.
Pour sys tu peux aller voir là https://docs.python.org/3/library/sys.html, ce serait trop long à expliquer…
Ici il a utilisé la fonction exit() de ce module qui permet de sortir du programme en envoyant un code retour. Je ne vois pas trop pourquoi d’ailleurs car avec la bonne condition dans le while le programme sort de la boucle et envoi exit(0) tout seul parce qu’il a arrive à la fin du script.
Avec les sys.exit(0) là où il les a mis on pourrait faire
while True
pour le coup. Vu que le programme se terminerait si l’une des conditions (total in gagne) ou (total in perdu) était remplie.ça fait while (total != gagne), qui est toujours vrai puisqu’ils n’ont pas le même type, OU perdu, donc la condition est toujours vraie.
Pour l’opérateur 'in' c’est tout simple :
[^] # Re: une proposition
Posté par gamerkilli . Évalué à 1.
oui exacte pour le while true , merci pour le in c'est tout simple en fin de compte ;)
[^] # Re: une proposition
Posté par pstk (site web personnel) . Évalué à 1.
Exact, mais il me semblait que le script ne s'arrêtait pas. Sois j'ai rêvé soit c'est le while qui est effectivement foireux.
[^] # Re: une proposition
Posté par gamerkilli . Évalué à 1.
idem sa ne s’arrête pas
[^] # Re: une proposition
Posté par Marotte ⛧ . Évalué à 2.
Je me permets de reposter ton code légèrement modifié (en fait seulement la condition du while… ton code marchait mais ça faisait bizarre :)
C’est du python 2, en 3 ça n’est pas valide…
On est effectivement obligé d’utiliser sys.exit() car si on met la bonne condition dans le while :
while total not in gagne+perdu
(le '+' n’est pas une addition ici…) et bien le print n’aura pas lieu lorsque l’on gagne ou que l’on perd, on aura que le troisième print, celui du else, qui aura lieu, bien que le programme s’arrête lorsque l’on gagne ou que l’on perd.[^] # Re: une proposition
Posté par Xavier Combelle (site web personnel) . Évalué à 4.
break
qu'unsys.exit(0)
un break permet de sortir seulement de la boucle que de sortir du programmefrom random import *
et préférer les import explicitesif/else
print()
que la commandeprint
voire d'utiliser carrément python3 (à ce stade de l'apprentissage c'est la seule différence, mais python3 résout plein de problèmes)Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.