Bonjour, je réalise l'exercice du plus ou moins, mon script fonctionne mais une chose me chagrine.
Voici mon script:
import random
def randNombre(debut=1, fin=100):
'Génère un nombre aléatoire compris entre "début" et "fin".'
# Création du nombre en lui-même:
n = random.randrange(debut, fin)
return n
def analyseNombre(nombre, debut=1, fin=100):
'Analyse le nombre entré par le joueur avec le nombre généré aléatoirement'
compteur = []
while 1:
# Récupérer la valeur entrée par le joueur:
print()
jn = input("Entrez un nombre ou tapez 'Enter' pour quitter la partie:")
# Si la valeur entrée par le joueur est un saut de ligne, on
# sort de la fonction:
if jn == '':
print()
print("Vous avez tapé 'Enter' ! Fin de la partie.\n")
break
# Conversion de l'entrée du joueur de str() à int():
jn = int(jn)
# Inscription des valeurs entrées par le joueur dans une liste et indication sur
# la taille de la liste:
compteur.append(jn)
lc = len(compteur)
# Si le nombre est égal à celui entré par le joueur, le joueur
# gagne, on sort de la fonction.
# On affiche aussi le nombre de tentatives 'lc':
if jn == nombre:
print()
print('Bravo vous avez gagné ! Vous avez trouvé en', lc, 'coups.\n')
break
# Si le nombre est plus petit que celui entré par le joueur mais supérieur au nombre
# indiqué comme début:
if jn < nombre and jn >= debut:
print("C'est plus !")
# Si le nombre est plus grand que celui entré par le joueur mais inférieur au nombre
# indiqué comme fin:
if jn > nombre and jn <= fin:
print("C'est moins !")
# Vérification si le nombre entré par le joueur est bien compris
# entre la valeur du début et valeur de fin:
if jn < debut or jn > fin:
print()
print('Veuillez entrer un nombre compris entre', debut, 'et', fin, '!\n')
def niveauJeu():
'Création des niveaux de jeu suivant la valeur entrée par le joueur'
print()
niveau = input('Choisissez le niveau de difficulté (entre 1 et 3):')
niveau = int(niveau)
# Niveau 1: On génère un nombre entre 1 et 10 par appel de la
# fonction randnombre(), puis on débute l'analyse de ce nombre
# par appel de la fonction analyseNombre():
if niveau == 1:
print()
print('Niveau de difficulté 1, nombre compris entre 1 et 10')
n = randNombre(1, 10)
analyseNombre(n, 1, 10)
# Niveau 2:
if niveau == 2:
print()
print('Niveau de difficulté 2, nombre compris entre 1 et 100')
n = randNombre(1, 100)
analyseNombre(n, 1, 100)
# Niveau 3:
if niveau == 3:
print()
print('Niveau de difficulté 3, nombre compris entre 1 et 1000')
n = randNombre(1, 1000)
analyseNombre(n, 1, 1000)
# Si la valeur entrée ne correspond pas à celle attendue, on
# redemande une valeur valide:
if niveau > 3:
niveauJeu()
def startStopJeu():
'Début et arrêt du jeu suivant la valeur entrée du joueur'
while 1:
# Récupérer la décision du joueur de jouer ou non:
i = input("Débuter une nouvelle partie tapez 'Y' sinon tapez 'N':")
# Si la décision est oui, on propose au joueur de choisir le niveau
# de difficulté:
if i == 'Y':
niveauJeu()
# Si la décision est non, on sort de la fonction startStopJeu()
# le jeu s'arrête:
if i == 'N':
print()
print('Vous avez quitté le jeu.')
break
# Test:
startStopJeu()
Et Voici un exemple de message d'erreur:
Traceback (most recent call last):
File "/Users/Asimov/Desktop/Apprendre à programmer avec Python 3 /Annexes/test.py", line 139, in <module>
startStopJeu()
File "/Users/Asimov/Desktop/Apprendre à programmer avec Python 3 /Annexes/test.py", line 126, in startStopJeu
niveauJeu()
File "/Users/Asimov/Desktop/Apprendre à programmer avec Python 3 /Annexes/test.py", line 110, in niveauJeu
niveauJeu()
File "/Users/Asimov/Desktop/Apprendre à programmer avec Python 3 /Annexes/test.py", line 77, in niveauJeu
niveau = int(niveau)
ValueError: invalid literal for int() with base 10: 'J'
En fait dans les fonctions analyseNombre et niveauJeu je souhaiterais mettre une condition pour analyser si la valeur entrée par le joueur peut être ou non convertie en int(), et dans le cas du non, demandé au joueur de retaper une valeur.
Car la bien sur si je joue le jeu tout marche mais si je rentre une valeur de type str() j'ai le droit à un message d'erreur qui est compréhensible.
Voilà désolé je suis pas très explicite, je suis débutant.
Merci par avance pour vos réponses. Bonne Journée.
Par ailleurs si vous pouviez me dire si ce code est buvable ou alors si c'est l'exemple type de ce qu'il ne faut pas faire :p, Promis je ne me vexerais pas. Merci à vous.
En fait dans les fonctions analyseNombre et niveauJeu je souhaiterais mettre une condition pour analyser si la valeur entrée par le joueur peut être ou non convertie en int(), et dans le cas du non, demandé au joueur de retaper une valeur.
Le mieux c'est un try except
Tu peux le tester sans ton code
while True:
try:
n = int(input('Entrer votre nombre : '))
print(n)
break # quitte la boucle
except ValueError:
print("ce n'est pas un nombre")
# retourne au début de ta boucle
Edit: Ton code est trop long et répétitif, analyse ton algo et factorise pour le raccourcir.
Merci fred1599 j'avais du mal avec try.. except j'ai un peu mieux compris grâce à vous.
J'ai pioché aussi dans votre code de ce jeu posté sur ce forum pour deux, trois trucs.
Je n'ai pas encore étudié les dictionnaires donc ne me lancez pas de tomates.
Voici mon code final:
import random
def verifEntree(label, debut, fin):
while True:
try:
entree = int(input(label))
if not debut <= entree <= fin:
print('Erreur entrez un nombre compris entre 1 et', fin)
else:
break
except ValueError:
print('Erreur entrez un nombre compris entre 1 et', fin)
return entree
def niveaux():
niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
if niveau == 1:
fin = 10
if niveau == 2:
fin = 100
if niveau == 3:
fin = 1000
print('Niveau de difficulté:', niveau, )
return fin
def analyseNombre(randn, fin):
compteur = []
print('Vous devez trouver un nombre compris entre 1 et', fin, 'ou <0> pour quitter')
while True:
nj = verifEntree('Entrez votre nombre:', 0, fin)
compteur.append(nj)
if nj == 0:
break
if nj == randn:
print('Bravo vous avez trouvé ! Nombre de coups:', len(compteur))
break
if nj < randn:
print("C'est plus !")
if nj > randn:
print("C'est moins !")
def start():
ni = niveaux()
rn = random.randrange(1, ni)
analyseNombre(rn, ni)
start()
while True:
sj = input('Rejouer <r> ou Quitter <q> ?')
if sj == 'q':
break
if sj == 'r':
start()
Alors j'ai l'impression qu'il est toujours aussi long mais franchement avec mes connaissances actuelles je n'arrive pas à faire moins
def niveaux():
niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
if niveau == 1:
fin = 10
if niveau == 2:
fin = 100
if niveau == 3:
fin = 1000
print('Niveau de difficulté:', niveau, )
return fin
ça fait la même chose ...
def niveaux():
niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
return (10,100,1000)[niveau]
dans la même idée tu peux racoursir le reste du code ... aller, sans trop toucher à la structure.
def analyseNombre(randn, fin):
compteur = []
print('Vous devez trouver un nombre compris entre 1 et', fin, 'ou <0> pour quitter')
nj = True
while nj:
nj = verifEntree('Entrez votre nombre:', 0, fin)
compteur.append(nj)
if nj == randn:
print('Bravo vous avez trouvé ! Nombre de coups:', len(compteur))
break
print("C'est plus !" if nj < randn else "C'est moins !")
Merci josmiley je ne connaissais pas la technique " (10,100,1000)[niveau] ", ça s'appelle comment ? si cela à un nom...
sinon j'ai rajouté niveau -= 1 :
niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
print('Niveau de difficulté:', niveau)
niveau -= 1
return (10, 100, 1000) [niveau]
car je suppose que le "comptage" commençe à partir de zéro.
import random
def verifEntree(label, debut, fin):
while True:
try:
entree = int(input(label))
if not debut <= entree <= fin:
print('Erreur entrez un nombre compris entre 1 et', fin)
else:
break
except ValueError:
print('Erreur entrez un nombre compris entre 1 et', fin)
return entree
def niveaux():
niveau = verifEntree('Choix du niveau: Entrez un nombre compris entre 1 et 3:', 1, 3)
print('Niveau de difficulté:', niveau)
return (10, 100, 1000) [niveau-1]
def analyseNombre(randn, fin):
compteur = []
print('Vous devez trouver un nombre compris entre 1 et', fin, 'ou <0> pour quitter')
while True:
nj = verifEntree('Entrez votre nombre:', 0, fin)
compteur.append(nj)
if nj == 0:
break
if nj == randn:
print('Bravo vous avez trouvé ! Nombre de coups:', len(compteur))
break
if nj < randn:
print("C'est plus !")
else:
print("C'est moins !")
def start():
ni = niveaux()
rn = random.randrange(1, ni)
analyseNombre(rn, ni)
start()
while True:
sj = input('Rejouer <r> ou Quitter <q> ?')
if sj == 'q':
break
if sj == 'r':
start()
if not debut <= entree <= fin:
print('Erreur entrez un nombre compris entre 1 et', fin)
J'aurais pas de pitié pour le mec qui se plante alors qu'on lui demande un nombre dans un intervalle connu, je lui compterais un coup supplémentaire
Personnellement je ne pense pas qu'il y est besoin de tellement de fonctions pour ce genre d'exercice, mais c'est déjà mieux
Aide pour l'exercice du plus ou moins
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.