Salut,
d'un point de vue sémantique, un while smthg==True se remplace par while smthg . C'est tout l'intérêt des booléens qui remplacent avantageusement les prédicats. Faire un prédicat pour checker si un booléen est True fait perdre du sens au booléen.
De même pour un while smthg == False qui se remplace par while not smthg .
Enfin, à la fin, c'est un peu dommage de mettre les actions qui se font si l'on quitte dans la boucle de jeu (et c'est aussi dommage de faire un append dans le if et dans le else, autant le mettre en dehors).
Du coup, j'aurais plutôt vu un truc dans ce genre là pour la fin :
while continuer
...
liste_coups.append(nbres_coup)
continuer = not(input("Quitter ? ").lower() in ['o','oui','y','yes'])
print("Voici la liste de vos coups {}".format(liste_coups))
</pre>
Mais sinon, le code est assez propre, lisible et il fonctionne. Donc c'est déjà l'essentiel.
Si le prédicat input("Quitter ? ").lower() in ['o','oui','y','yes'] est vrai, le joueur veut quitter. Il faut donc mettre le booléen continuer à False.
Si en revanche le prédicat input("Quitter ? ").lower() in ['o','oui','y','yes'] est faux, le joueur ne veux pas quitter. Il faut donc mettre le booléen continuer à True.
Autrement dit, le booléen continuer est le contraire du fait que le joueur veuille quitter, d'où le not.
De manière similaire à l'histoire du while smthg , les if condition : booléen=True ; else : booléen=False se remplacent simplement par booléen=condition .
Je me suis prêté à l'exercice non sans quelques petites difficultés (mais j'avais déjà développé ce programme en JustBasic et voulais lui donner les mêmes caractéristiques).
- Un menu de 1 à 4 (1-3 = difficulté, 4 = quitter) ;
- Compteur de "coups" ;
- Possibilité de rejouer, retourner au menu ou quitter.
Débutant complètement dans le Python (et la prog en général depuis très peu de temps), je suppose qu'il est possible de fortement simplifier mon code, et j'aimerais bien avoir quelques pistes en ce sens si quelqu'un a un peu de temps pour m'orienter.
# Le jeu du plus ou du moins en Python
import os
from random import randrange
from math import floor
nbMin = 1
play = True
while play:
print ("\n\n°o. Le jeu du plus ou du moins .o°\n\n")
print ("Menu\n\n")
print ("1 - Trouvez le nombre mystère entre 1 et 99\n2 - Trouvez le nombre mystère entre 1 et 999\n3 - Trouvez le nombre mystère entre 1 et 9999\n4 - Quitter\n\n")
choix = 0
continuer = True
while choix < 1 or choix > 4:
try:
choix = int(floor(float(input("Votre choix est : "))))
except ValueError:
print("Vous devez taper un chiffre.")
continue
if choix < 1 or choix > 4:
print ("Vous devez saisir un chiffre entre 1 et 4.")
elif choix == 1:
nbMax = 99
elif choix == 2:
nbMax = 999
elif choix == 3:
nbMax = 9999
elif choix == 4:
continuer = False
play = False
while continuer:
essais = 1
nbMystere = randrange(nbMin, nbMax)
nbEntre = 0
while nbEntre != nbMystere:
try:
nbEntre = int(floor(float(input("\nQuelle est votre proposition, de {} à {} ?\n".format(nbMin, nbMax)))))
except ValueError:
print("Vous devez taper un nombre.")
continue
if nbEntre < nbMin or nbEntre > nbMax:
print ("Vous devez saisir un nombre entre {} et {}.".format(nbMin, nbMax))
elif nbEntre > nbMystere:
print ("Le nombre mystère est plus petit que {}".format(nbEntre))
essais += 1
elif nbEntre < nbMystere:
print ("Le nombre mystère est plus grand que {}".format(nbEntre))
essais += 1
else:
print ("Bravo ! Le nombre mystère est bien {}. Vous l'avez trouvé en {} coups !\n".format(nbEntre, essais))
rePlay = 0
while rePlay < 1 or rePlay > 3:
try:
rePlay = int(floor(float(input("Souhaitez-vous rejouer (1), retourner au menu (2) ou quitter (3) ?\n\n"))))
except ValueError:
print("Vous devez taper un chiffre.")
continue
if rePlay < 1 or rePlay > 3:
print ("Vous devez saisir un chiffre entre 1 et 3.")
elif rePlay == 2:
continuer = False
elif rePlay == 3:
continuer = False
play = False
os.system ("pause")
Bravo pour ce petit programme fonctionnel. Alors comme tu demandes des commentaires, en voici, qui je l'espère seront constructifs.
Tout d'abord, il faut enlever la ligne 78. C'est inutile, et l'utilisateur est censé lancer le script depuis le terminal ou en utilisant IDLE ou un autre IDE, donc la fenêtre ne se refermera pas.
Pour tes print, tu pourrais utiliser la notation avec trois guillemets et rendre le tout plus lisible
print("""
°o. Le jeu du plus ou du moins .o°
Menu
1 - Trouvez le nombre mystère entre 1 et 99
2 - Trouvez le nombre mystère entre 1 et 999
3 - Trouvez le nombre mystère entre 1 et 9999
4 - Quitter
""")
</pre>
Pour le input, je n'utiliserais pas le floor, mais simplement choix = int(input("Votre choix est : ")) en indiquant en message d'erreur qu'il faut entrer un entier. De toute manière tu ne peux pas gagner à ce jeu si tu mettais 73.4 alors que le nombre mystère est 73.
En ligne 25, c'est juste une proposition, mais tu peux ré-écrire la condition if not 1 <= choix <= 4:. C'est à mes yeux un poil plus lisible, mais peut-être tout le monde ne le verrait pas pareil.
Pour tes while, au lieu de chaque fois initialiser une variable avec une valeur, puis rentrer dans le while, tu pourrais entrer dans un while True et mettre un break quand la condition est réalisée:
while True:
try:
choix = int(input("Votre choix est : "))
except ValueError:
print("Vous devez taper un nombre entier.")
continue
if not 1 <= choix <= 4:
print ("Vous devez saisir un nombre entre 1 et 4.")
else:
if choix == 1:
nb_max = 99
elif choix == 2:
nb_max = 999
elif choix == 3:
nb_max = 9999
elif choix == 4:
continuer = False
play = False
break
Pour tes while, au lieu de chaque fois initialiser une variable avec une valeur, puis rentrer dans le while, tu pourrais entrer dans un while True et mettre un break quand la condition est réalisée:
Hmm, non. Je pense pas que ce soit un bon conseil. J'aime bien savoir à quoi sert une boucle avant d'en lire le contenu, et pour ça la meilleure façon de s'y prendre est :
nb_max = None
while nb_max is None:
# blablablabla
# blablablablabla
# blabla
Ici, pas besoin de lire le contenu de la boucle (que j'ai remplacé par des "blabla") pour savoir que cette boucle sert à initialiser nb_max.
Pour le contenu de cette boucle, on peut remarquer également que la conversion du choix de l'utilisateur (numéro dans un menu) en un entier n'est pas nécessaire. En fait, une façon simple d'isoler la correspondance pour la rendre plus facilement réglable serait celle-ci :
MENU_DIFFICULTE = {
'1': 99,
'2': 999,
'3': 9999
}
nb_max = None
while nb_max is None:
choix = input("Niveau de difficulté (entre 1 et 3 ou 'Q' pour quitter): ")
choix = choix.lower().strip()
nb_max = MENU_DIFFICULTE.get(choix, None)
if choix == 'q':
raise SystemExit(0)
- Ligne 78 : je suis sur Windows et à moins que le programme ne plante (ça arrive, si, si), je n'utilise pas trop l'IDLE, je lance directement le programme ;
- C'est vrai que le print utilisé de cette manière est beaucoup plus lisible ! ;
- Le floor n'est pas une bonne option de base, c'est vrai, puisqu'il peut donner une victoire en cas de saisie d'un nombre décimal, c'était pour "aller plus vite" en ôtant une erreur potentielle, en fait (et j'ai appris en passant que floor existait :p) ;
- if not 1 <= choix >= 4: est très lisible pour moi après une première gymnastique de cerveau, à voir si je penserai à l'avenir "si plus petit que ou plus grand que" ou "entre tant et tant", je n'avais même pas songé à cette écriture, j'aime bien ! ;
- Ce n'est pas un peu risqué de prendre l'habitude d'entrer dans une boucle sans variable initialisée et de pouvoir se trouver à oublier d'initialiser une valeur (pas forcément sur la condition de la boucle) par la suite ? J'ai bien lu et compris le while True / break, mais j'ai l'impression que c'est laisser beaucoup de liberté à la boucle (peut-être bizarre comme impression...).
Ce n'est pas un peu risqué de prendre l'habitude d'entrer dans une boucle sans variable initialisée et de pouvoir se trouver à oublier d'initialiser une valeur (pas forcément sur la condition de la boucle) par la suite ? J'ai bien lu et compris le while True / break, mais j'ai l'impression que c'est laisser beaucoup de liberté à la boucle (peut-être bizarre comme impression...).
Si, et je suis d'accord avec toi, d'où mon post.
Les boucles infinies s'avèrent de temps en temps nécessaires, cela dit (pour gérer une boucle événementielle, par exemple). Mais dans le cas général il vaut mieux les éviter au profit de constructions plus intelligibles.
Pour le contenu de cette boucle, on peut remarquer également que la conversion du choix de l'utilisateur (numéro dans un menu) en un entier n'est pas nécessaire. En fait, une façon simple d'isoler la correspondance pour la rendre plus facilement réglable serait celle-ci :
MENU_DIFFICULTE = {
'1': 99,
'2': 999,
'3': 9999
}
nb_max = None
while nb_max is None:
choix = input("Niveau de difficulté (entre 1 et 3 ou 'Q' pour quitter): ")
choix = choix.lower().strip()
nb_max = MENU_DIFFICULTE.get(choix, None)
if choix == 'q':
raise SystemExit(0)
Je comprends le début, c'est un peu comme le .format que j'utilise dans un print auquel on rajoute des conditions (enfin, je crois). Par contre les lignes 10 et 11 ressemblent un peu à du chinois.
Pour la boucle while, tout dépend de ce qu'on veut accomplir. Parfois on a besoin plutôt d'une construction dans le style do ... while qui n'existe pas en tant que tel en Python. La manière de le faire est
while True:
<setup code>
if not <condition>:
break
<loop body>
</pre>
Voir le PEP 315 qui a été rejeté. Aussi un article intéressant est loop and a half.
Mais je suis d'accord que parfois c'est plus lisible d'avoir la condition en haut. L'avantage du while True est qu'on initialise qu'un fois la variable, au moment de l'input, et non avec une valeur choisie avec soin afin de faire échouer la condition du while.
# -*-coding:Utf-8 -*
from random import randrange
partie = True
while partie == True:
print("Voilà le but du jeu, je vais choisir au hasard un nombre compris entre 1 et 100 et vous allez essayer de le deviner, je vous ferai savoir si le nombre saisie est trop petit ou trop grand.")
nmb_correct = randrange(1, 101)
nmb = 0
while nmb != nmb_correct:
nmb = input("Quel est le nombre ?: ")
try:
nmb = int(nmb)
except ValueError:
print("Vous n'avez pas saisi un nombre.")
continue
if not 1 <= nmb <= 100:
print("Il faut saisir un nombre entre 1 et 100")
continue
elif nmb == nmb_correct:
print("Félicitations, vous avez trouvé le bon nombre !!!")
elif nmb_correct < nmb:
print("C'est trop grand !")
continue
elif nmb < nmb_correct:
print("C'est trop petit !")
continue
partie = False
a = 1
while a != "o" and a != "n":
a = input(" Vous voulez rejouer ? [o/n]: ")
a = a.strip().lower()
if a != "o" and a != "n":
print("Veuillez saisir o ou n seulement.")
a = 1
if a == "o":
partie = True
import random
import os
nb_rand = random.randrange(1, 100)
nb_test = 0
while nb_test != nb_rand:
nb_test = input("choisissez un nombre: ")
if nb_test > nb_rand:
print("votre nombre est trop grand")
elif nb_test < nb_rand:
print("votre nombre est trop petit")
else:
print("Vous avez gagné!")
os.system("pause")
Je parlais de la présentation . Ton code n'est pas formaté comparé à celui des autres (cadre noir, coloration syntaxique, numéro de ligne, ...). Pour ce faire, il faut mettre ton code dans les balises correspondantes: </> et choisir le langage python .
Et comme je l'ai dit, tu peux directement éditer ton premier message (pas besoin d'en créer un autre)
#/usr/bin/python
#*-*coding:utf-8*-*
"""Excercice Python no2: Jeu du plus ou moins
Par JeroomuSama"""
from random import randint
nombre_entre = int(0)
nombre_cpu = int(0)
score = float(0)
nb_de_coups = int(0)
sortie_boucle = False
victoire = False
nombre_cpu = randint(1,100)
game_paused = raw_input("Pour quitter le jeu, tapez 'quit' au lieu d'entrer votre nombre...")
while nombre_cpu != nombre_entre and sortie_boucle == False:
try:
nombre_entre = raw_input('Entrez un nombre compris entre 1 et 100: ')
if nombre_entre == "quit":
sortie_boucle = True
else:
nombre_entre = int(nombre_entre)
except ValueError:
print "Veillez à n'entrer que des caractères numériques..."
if nb_de_coups > 0:
nb_de_coups -= 1
#--------------------------------------------------------------------------#
nb_de_coups += 1
if nombre_cpu == nombre_entre and isinstance (nombre_entre, int):
victoire = True
sortie_boucle = True
elif nombre_cpu > nombre_entre and isinstance (nombre_entre, int):
print "Le nombre attendu est plus grand que ",nombre_entre," !"
elif nombre_cpu < nombre_entre and isinstance (nombre_entre, int):
print "Le nombre attendu est plus petit que ",nombre_entre," !"
else:
print "..."
#-------------------------------------<
score = (99 / nb_de_coups) * 112
if victoire == True:
print "Félicitations, vous avez trouvé le nombre caché en ",nb_de_coups," coups !"
print "Votre score pour cette partie est de: ",score," Points."
else:
print "Merci d'avoir joué, passez une excellente journée :)"
Merci pour le rappel du "Break", c'est vrai que je n'y pense jamais
Pour la variable "victoire" c'est plus propre, si le joueur quitte la partie avec le mot clef "quit" le texte final ne sera pas le même que s'il remporte la partie.
j'ai retiré les variables inutiles et sorti les lignes qui ne servaient à rien dans les boucles.
#/usr/bin/python
#*-*coding:utf-8*-*
from random import randint
nombre_entre = 0
nb_de_coups = 0
nombre_cpu = randint(1,100)
raw_input("Pour quitter le jeu, tapez 'quit' au lieu d'entrer votre nombre...")
while nombre_cpu != nombre_entre:
nombre_entre = raw_input('Entrez un nombre compris entre 1 et 100: ')
if nombre_entre == "quit":
print "Merci d'avoir joué, passez une excellente journée :)"
break
try:
nombre_entre = int(nombre_entre)
except ValueError:
print "Veillez à n'entrer que des caractères numériques..."
print "..."
continue
#--------------------------------------------------------------------------#
nb_de_coups += 1
if nombre_cpu > nombre_entre:
print "Le nombre attendu est plus grand que ",nombre_entre," !"
elif nombre_cpu < nombre_entre:
print "Le nombre attendu est plus petit que ",nombre_entre," !"
#-------------------------------------<
else:
print "Félicitations, vous avez trouvé le nombre caché en ",nb_de_coups," coups !"
score = (99 / nb_de_coups) * 112
print "Votre score pour cette partie est de: ",score," Points."
Bin on arrive exactement au même résulta sauf qu'on voit bien que c'est pas la même personne qui a programmé les deux bordels
Ta façon de faire est mieux, elle va à l'essentiel et je vais retenir deux ou trois choses de ça, merci
Par contre je préfère déclarer mes variables en début de code plutôt que de le faire directement dans un calcul en plein milieu du bordel (comme ici avec la variable "score", tu l'as enlevée en haut mais tu t'en sers quand même en bas... Ca fonctionne et c'est pas grave mais moi je préfère tout de même les déclarer au début avec la valeur "0" pour les int).
Voici un code qui fonctionne parfaitement avec les idées d'amélioration :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
////////// le nombre cacher ///////////////////
/*
int nombre = 0;
printf("\n \n ");
scanf("%d",&nombre);
if(nombre != 47 ){
while(nombre != 47)
{
printf("\n \n Résseyer on sait jamais \n \n");
scanf("%d",&nombre);
}
}else{
printf("\n \n \n \n ");
}
printf("\n \n yeeesss vous avez reussi \n \n ");
*/
// boucle qui se répete un certain nombre de fois
/*
int compteur = 0 ;
while(compteur <= 3 ){
printf("avant %d",compteur);
compteur++;
printf("apres %d \n \n \n ",compteur);
}
*/
// boucle 2 : do .... while
//do{
// instructions
// }while(/* conditions */);
// boucle 3 : for
// for(initialisation;condition;incrementation){
// instruction
// }
//// chapitre 8 /////////////
int nombreMystere = 0 ;
int nombre = 0 ;
int compteur = 0 ;
int continuerPartie = 0 ;
int choix = 0 ;
int niveau = 0 ;
printf(" \n ******** menu ********** \n");
printf(" \n **** vous avez 2 jeu **** \n");
printf(" \n **** le 11 ou le 22 ****** \n");
printf(" \n ** Faite votre le 11 ou 22 ** \n");
scanf("%d",&choix);
if(choix == 11)
{
// c'est le mode 1 le pc qui génére le nombre mystére
do
{
printf("Vous avez trois niveau de dificulter \n ");
printf(" \n Niveau 1 ---> entre 1 et 100");
printf(" \n Niveau 2 ---> entre 1 et 1000");
printf(" \n Niveau 3 ---> entre 1 et 10000");
printf(" \n Veuiller taper le numero de votre niveau :");
scanf("%d",&niveau);
if(niveau == 1){
// c'est deux lignes génére un nombre mystére
srand(time(NULL));
nombreMystere = (rand() % (100 - 1 + 1)) + 1;
}else if(niveau == 2) {
// c'est deux lignes génére un nombre mystére
srand(time(NULL));
nombreMystere = (rand() % (1000 - 1 + 1)) + 1;
}else{
// c'est deux lignes génére un nombre mystére
srand(time(NULL));
nombreMystere = (rand() % (10000 - 1 + 1)) + 1;
}
// le jeu commence
printf(" \n \n Bienvenu dans le jeu Plus ou moins \n \n");
printf(" Deviner le nombre : \n \n ");
scanf("%d",&nombre);
while(nombre != nombreMystere){
if(nombre > nombreMystere){
compteur++;
printf("\n C'est moins \n \n ");
printf("Quel est le nombre ? ");
scanf("%d",&nombre);
}else{
compteur++;
printf("\n C'est plus \n \n ");
printf("Quel est le nombre ? ");
scanf("%d",&nombre);
}
}
printf(" \n woooow Felicitation vous avez trouver le nombre mystere en %d woooow \n \n \n",compteur);
printf(" vous voulez commencer une Nouvelle Partie si oui entrer le nombre 10 sinon entrer le nombre 0 : \n \n ");
scanf("%d",&continuerPartie);
}while(continuerPartie == 10);
printf("\n \n Aller a Bientot bye bye \n \n ");
}else{
// c'est le mode 2 c'est vous que vous choisiser le nombre mystére
printf(" \n Bienvenue au jeu 22 \n");
printf("Vous avez trois niveau de dificulter \n ");
printf(" \n Niveau 1 ---> entre 1 et 100");
printf(" \n Niveau 2 ---> entre 1 et 1000");
printf(" \n Niveau 3 ---> entre 1 et 10000");
printf(" \n Veuiller taper le numero de votre niveau :");
scanf("%d",&niveau);
if(niveau == 1){
printf("choisisez un nombre entre 1 et 100");
scanf("%d",&nombreMystere);
}else if(niveau == 2) {
printf("choisisez un nombre entre 1 et 1000");
scanf("%d",&nombreMystere);
}else{
printf("choisisez un nombre entre 1 et 10000");
scanf("%d",&nombreMystere);
}
do
{
// le jeu commence
printf(" \n \n le jeu 22 commence \n \n");
printf(" Deviner le nombre : \n \n ");
scanf("%d",&nombre);
while(nombre != nombreMystere){
if(nombre > nombreMystere){
compteur++;
printf("\n C'est moins \n \n ");
printf("Quel est le nombre ? ");
scanf("%d",&nombre);
}else{
compteur++;
printf("\n C'est plus \n \n ");
printf("Quel est le nombre ? ");
scanf("%d",&nombre);
}
}
printf(" \n woooow Felicitation vous avez trouver le nombre mystere en %d woooow \n \n \n",compteur);
printf(" vous voulez commencer une Nouvelle Partie si oui entrer le nombre 10 sinon entrer le nombre 0 : \n \n ");
scanf("%d",&continuerPartie);
}while(continuerPartie == 10);
printf("\n \n Aller a Bientot bye bye \n \n ");
}
return 0;
}
Idée pour améliorer l'exercice : Comment cacher le nombre entrer par le joueur A ?
J'apprend le Python et je viens de finir le premier chapitre.
Voilà ma solution à l'exercice :
#config:utf-8
from random import randrange
continuer = True
print("Bonjour et bienvenue au jeu du nombre mystère !")
while continuer==True:
nb=0
nbmys=0
nbmys=randrange(1,100)
while nb!=nbmys:
nb=input("Quel est le nombre mystère ? (entre 1 et 100)")
nb=int(nb)
if nb>nbmys:
print("Le nombre mystère est plus petit !")
elif nb<nbmys:
print("Le nombre mystère est plus grand !")
print("Bravo ! Le nombre mystère était bien",nbmys)
quitter=input("Voulez-vous continuer à jouer ? (o/n)")
if quitter=="n":
print("A la prochaine !")
continuer=False
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.