Projet

Signaler
-
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
-
Bonjour à tous,
Je suis actuellement scolarisé en Terminale avec l'option NSI.
Depuis quelques temps, je me suis lancé dans un programme assez complexe (pour moi).
Reproduire le jeu "10FastFinger" en python.
Cependant, je rencontre quelques difficutés :
Voici le début de mon code suivi de quelques idées pour le rétrécir :


"""But de ce programme : Reproduire le jeu 10FastFinger"""
"""Partie du jeu :"""
import time

print("Les mots sont : ainsi, fois, tout, cent, amour, reprendre, devenir, jusque, rue, monsieur, mari, ville, falloir, maison, quel, peu, tenir, air, bien, beau ")
t=time.time() 
while 1:
    if time.time()-t < 30:
        score = 0
        a=input("Mot(ainsi) : ")
        if a == "ainsi":
            score+=1
        else : 
            score+=0
        b=input("Mot(fois) : ")
        if b == "fois":
            score+=1
        else : 
            score+=0
        c=input("Mot(tout) : ")
        if c == "tout":
            score+=1
        else : 
            score+=0
        d=input("Mot(cent) : ")
        if d == "cent":
            score+=1
        else : 
            score+=0
        e=input("Mot(amour) : ")
        if e == "amour":
            score+=1
        else : 
            score+=0
        f=input("Mot(reprendre) : ")
        if f == "reprendre":
            score+=1
        else : 
            score+=0
        g=input("Mot(devenir) : ")
        if g == "devenir":
            score+=1
        else : 
            score+=0
        h=input("Mot(jusque) : ")
        if h == "jusque":
            score+=1
        else : 
            score+=0
        i=input("Mot(rue) : ")
        if i == "rue":
            score+=1
        else : 
            score+=0
        j=input("Mot(monsieur) : ")
        if j == "monsieur":
            score+=1
        else : 
            score+=0
        k=input("Mot(mari) : ")
        if k == "mari":
            score+=1
        else : 
            score+=0
        l=input("Mot(ville) : ")
        if l == "ville":
            score+=1
        else : 
            score+=0
        m=input("Mot(falloir) : ")
        if m == "falloir":
            score+=1
        else : 
            score+=0
        n=input("Mot(maison) : ")
        if n == "maison":
            score+=1
        else : 
            score+=0
        o=input("Mot(quel) : ")
        if o == "quel":
            score+=1
        else : 
            score+=0
        p=input("Mot(peut) : ")
        if p == "peut":
            score+=1
        else : 
            score+=0
        q=input("Mot(tenir) : ")
        if q == "tenir":
            score+=1
        else : 
            score+=0
        r=input("Mot(air) : ")
        if r == "air":
            score+=1
        else : 
            score+=0
        s=input("Mot(bien) : ")
        if s == "bien":
            score+=1
        else : 
            score+=0
        t=input("Mot(beau) : ")
        if t == "beau":
            score+=1
        else : 
            score+=0
        u=input("Mot(connaître) : ")
        if u == "connaître":
            score+=1
        else : 
            score+=0
        v=input("Mot(mettre) : ")
        if v == "mettre":
            score+=1
        else : 
            score+=0
        w=input("Mot(puis) : ")
        if w == "puis":
            score+=1
        else : 
            score+=0   
        x=input("Mot(ciel) : ")
        if x == "ciel":
            score+=1
        else : 
            score+=0
        y=input("Mot(sans) : ")
        if y == "sans":
            score+=1
        else : 
            score+=0
        z=input("Mot(votre) : ")
        if z == "votre":
            score+=1
        else : 
            score+=0
        aa=input("Mot(premier) : ")
        if aa == "premier":
            score+=1
        else : 
            score+=0
        ab=input("Mot(avoir) : ")
        if ab == "avoir":
            score+=1
        else : 
            score+=0
        ac=input("Mot(avec) : ")
        if ac == "avec":
            score+=1
        else : 
            score+=0
        ad=input("Mot(chambre) : ")
        if ad == "chambre":
            score+=1
        else : 
            score+=0
        ae=input("Mot(ami) : ")
        if ae == "ami":
            score+=1
        else : 
            score+=0
        af=input("Mot(ni) : ")
        if af == "ni":
            score+=1
        else : 
            score+=0
        ag=input("Mot(noir) : ")
        if ag == "noir":
            score+=1
        else : 
            score+=0
        ah=input("Mot(chaque) : ")
        if ah == "chaque":
            score+=1
        else : 
            score+=0
        ai=input("Mot(aimer) : ")
        if ai == "aimer":
            score+=1
        else : 
            score+=0
        aj=input("Mot(parler) : ")
        if aj == "parler":          
            score+=1
        else : 
            score+=0
    else :
        print("Le temps est écoulé")
            
print("Bien joué, vous avez fini, votre score est de :",score,"en 30 secondes")
moyenne = 16
score_min=score*2
print("Vous avez tapé",score_min,"de mots en 1 minute")
if score > moyenne:
    print("Bravo, vous êtes au dessus de la moyenne")
else : 
    print("Votre score est en dessous de la moyenne, retentez votre chance")

--------------------------------------------------------------------------------------------------------------------------------------
Je créé donc un chronomètre au début de mon programme et par la suite dans une boucle, j'utilise le moyen "input" pour avoir la réponse de l'utilisateur.
Problème : unsupported operand type(s) for -: 'float' and 'str'

Quelques idées :

import random
MaListe=["chaque","jeu","jouer","mettre","puis","ciel","amour","cent","tout","..."]
random.choice(MaListe)

#J'essaie de faire aléatoirement prendre un mot dans une liste

Je pense également qu'il est préférable de faire une boucle ou je regroupe tous les inputs.


Cordialement,

Nathan

54 réponses

Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Voilà qui est mieux.

J'ai donc pu tester.
Je constate que tous les mots m'ont été proposés, puis ça plante quand ça veut recommencer.
C'est cette ligne qui plante
if time.time()-t < 30:


Le message d'erreur indique qu'on ne peut pas faire une opération "-" avec un float et un string.

Que peut on conclure sur le fait qu'à la première itération time.time() - t c'est possible et pas à la seconde?
La réponse est en lien avec le fait que tous les mots ont été demandés.
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Non, la boucle est bien infinie.
Et puis, ça ne plante pas sur cette ligne
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Si ça rendait 0 à la deuxième itération, c’est que l’opération serait possible, or elle ne l’est plus.
Le message d’erreur dit qu’on ne peut pas faire moins entre un float et un str
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Mets un print(t) juste avant la ligne qui plante.
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Ça ne change pas le programme, mais tu verras ce qu’il y a dedans juste avant de planter
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Voilà tu viens d'éprouver la frustration du piège le plus "con" de Python:
On peut faire n'importe quoi avec les variables.

Pour moi c'est une erreur à la conception du langage (et une des 2 raisons pour lesquelles je ne l'aime pas), mais selon les promoteurs de Python ça participe à sa simplicité d'apprentissage.

Maintenant que tu as galéré 2 jours là dessus, tu ne l'oublieras pas de si tôt. La prochaine fois que tu auras une incompatibilité de type, à minima tu penseras à tester le contenu des variables au moment où ça plante et en conditions réelles

Oui changer le nom de variable va résoudre ce problème.
Mais d'ailleurs, je ne comprends même pas pourquoi tu as changé de variable à chaque input, tu aurais utilisé "mot" ou "rep" ou "entree" à chaque fois cela aurait très bien fonctionner.

Deux conseils dans les noms de variables :
  • utilise des noms forts (des mots entiers, des expressions {éventuellement en camel case, par exemple laReponseALaQuestionDeux} )
  • ne nomme jamais une variable comme un mot clé, et oui c'est possible en Python, mais ça fout vraiment la garouille.....



Passons au problème suivant.
Tu as mis un temps limité à 30 secondes, pourtant je peux mettre le temps que je veux à faire la première série de mots. Pourquoi?
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Essaye
while 1:
    if time.time()-t < 30:
        score = 0
        rep=input("Mot(ainsi) : ")
        if rep == "ainsi":
            score+=1
            print(score)
        else : 
            score+=0
        rep=input("Mot(fois) : ")
        if rep == "fois":
            score+=1
            print(score)
        else : 
            score+=0
        rep=input("Mot(tout) : ")
        if rep == "tout":
            score+=1
            print(score)
        else : 
            score+=0


Et dis moi si selon toi le mot saisi n'est pas vérifié.

Et au passage si
car le score ne bouge pas lui-même.
est exact
Le mot ainsi, fois, tout est vérifié et le score augmente. Donc mettre la même variable à tous les inputs ne changent rien au programme.
Le score est également exact
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Bien, mais ça ne nous dit toujours pas pourquoi j'ai tout mon temps pour répondre à la première série de mots
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Non, rien à voir avec le score
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Regarde ce code
while 1:
    print("test de la durée")
    if time.time()-t < 30:
        score = 0
        
        rep=input("Mot(ainsi) : ")
        if rep == "ainsi":
            score+=1
        else : 
            score+=0
        print("durée de jeu ", time.time()-t)
    
        rep=input("Mot(fois) : ")
        if rep == "fois":
            score+=1
        else : 
            score+=0
        print("durée de jeu ", time.time()-t)
        
        rep=input("Mot(tout) : ")
        if rep == "tout":
            score+=1
        else : 
            score+=0
        print("durée de jeu ", time.time()-t)
        


et cette capture


Pourquoi, alors qu'il m'a fallut 36 secondes pour saisir "fois", le programme me demande "tout" ?
Je ne sais pas, il doit y avoir un problème avec cette ligne :
if time.time()-t < 30:

Je veux que le code s'arrête après 30 secondes.
Je pense que c'est parce que je n'ai pas dis au programme de commencer le chronomètre à 0.
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Pour l'instant on s'en fout, y'a des erreurs partout dans ton code, on va pas les régler d'un coup de baguette magique.

La question actuelle est pourquoi si j'attends plus 30 secondes avant de saisir le premier mot c'est accepté, ainsi que tous les autres?

Ou la même question différemment énoncée, pourquoi ça ne te l'affiche qu'après avoir saisi tous les mots?
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Voilà, tu touches du doigt le fond de ce problème.

Pour bien faire, il faudrait vérifier le temps passé à chaque saisie.
On ne va pas le corriger de suite, car cela pourrait bien se régler presque tout seul par la suite. Mais pour avancer il était important que tu comprennes la raison

Pour la suite, 2 réflexions à mener dans l'ordre que tu veux
  • tu vas analyser ces 4 lignes, comme on l'a fait plus haut et essayer de les rationaliser

        if a == "ainsi":
            score+=1
        else : 
            score+=0
  • tu as constaté qu'une fois que le programme indique que le temps est dépassé, il le fait à l'infini. Il faudrait que cela s'arrête. Comment faire?

Analyse :

Si la variable a = est égale au mot "ainsi"
1 est ajouté au score
Sinon
Le score ne bouge pas
Mais je ne vois pas comment rationaliser davantage.

Par ailleurs, le programme indique que le temps est dépassé mais à l'infini car il est dans la boucle while. Je ne peux pas retirer la tabulation car le else est lui même aussi dans ma boucle while (et qu'il doit répondre au if)

J'ai essayé de changer le else en elif :
elif time.time()-t == 30:
        print("Le temps est écoulé")

Mais cela n'affiche même pas le print.

De plus, j'ai également essayé avec ceci :
elif time.time()-t >= 30:
        print("Le temps est écoulé")

Mais c'est comme le else, ça affiche infiniment.
Alors comment afficher qu'une seule fois avec le print lorsque ce dernier est dans une boucle infinie ?

Merci d'avance.
Nathan
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499 > Ayress
Commençons par ceci
Si la variable a = est égale au mot "ainsi"
1 est ajouté au score
Sinon
Le score ne bouge pas


Ça n'est pas tout à fait exact, en réalité c'est
i la variable a = est égale au mot "ainsi"
1 est ajouté au score
Sinon
0 est ajouté au score

Vu comme ça, tu voies ce qui pourrait être rationnalisé?


Ensuite
Alors comment afficher qu'une seule fois avec le print lorsque ce dernier est dans une boucle infinie ?

La réponse est presque dans la question.
>
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021

Bonjour,

Je pense qu'il est possible de retirer le else ainsi que score=+0.

Pour ce qui est du print dans la boucle, puis-je enlever les tablulations pour qu'il ne soit pas dans la boucle while ? Mais je dois enlever aussi le else.
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Exactement.

Pour le problème suivant, je reviens dans la soirée
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
On va réduire à un seul mot pour le problème suivant.

Ça donne ça
import time

print("Les mots sont : ainsi, fois, tout, cent, amour, reprendre, devenir, jusque, rue, monsieur, mari, ville, falloir, maison, quel, peu, tenir, air, bien, beau ")
t=time.time() 
while time.time()-t < 30:
    score = 0
    a=input("Mot(ainsi) : ")
    if a == "ainsi":
        score+=1
        
print("Le temps est écoulé")
print("score ", score)


Joue et dis moi ce qui ne va pas, et si possible comment le corriger

Il n'y a que le mot ainsi, donc il est répété à l'infini pendant 30 secondes.
Au bout de 30 secondes, le programme ne s'arrête que lorsque j'ai fini d'écrire mon mot.
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499 > Ayress
Et t'as fait quel score?
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Je t'avais demandé quel score tu fais?
Je viens de faire 35 avec le programme de base.
J'ai finalement tout repris depuis le début :
Voici où j'en suis arrivé :
import random 
import time
t = time.time() 
K=['ainsi','fois','sans','tout','cent','amour','reprendre','devenir','jusque','rue','monsieur','mari','ville','falloir','maison','quel','peut','tenir','air','bien','beau','connaître','mettre','avoir','chambre','noir','chaque','aimer','parler','premier']
score=0
while score<30:
    mot=random.choice(K)
    print(f"Écrivez le mot :\033[31m",mot,"\033[0m","votre score est de",score)
    rep=input("Écrivez le  mot")
    if mot == rep:
        score+=1
moy=60
if time.time()-t < moy:
    print(f"Félicitation vous êtes au dessus de la moyenne, vous avez écrit 30 mots en",time.time()-t,"secondes")
else : 
    print("Ton temps est supérieur à la moyenne, vous avez écrit 30 mots en",time.time()-t,"secondes :)")

Qu'en pensez vous ? Pouvons nous l'améliorer ?
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499 > Ayress
Tu as donc corrigé le bug du score.....

D'un point de vue fonctionnel, le bug que tu avais constaté, à savoir que le dernier mot est accepté après le délai est toujours présent.

Ici
moy=60
if time.time()-t < moy:
    print(f"Félicitation vous êtes au dessus de la moyenne, vous avez écrit 30 mots en",time.time()-t,"secondes")
else : 
    print("Ton temps est supérieur à la moyenne, vous avez écrit 30 mots en",time.time()-t,"secondes :)")

C'est incorect, le temps est fixe à 30 secondes (enfin une fois le problème précédent réglé), c'est le nombre de mots qui varit


D'un point de vue interface

2 fois "Ecrivez le mot" pour une seule saisie, score à 0 alors que je n'ai pas encore commencé.

Et là
"Ton temps est supérieur à la moyenne, vous avez écrit"
tutoiement et vouvoiement dans la même phrase.


Enfin, et ça n'est pas un problème en soi, sauf si tu le décides.
En faisant le random de la sorte, il est possible que le même mot soit demandé de nombreuses fois et un jamais, même si tu laisses 5 minutes.
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Bonjour, lire un texte tout en gras ça donne l'impression de se faire crier dessus.
Et se faire crier dessus, ça ne donne pas envie d'aider.

D'autre part, en Python il y a un truc indispensable -> l'indentation.

Pour quelle soit conservée sur le forum, il faut faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Bonjour,
L'écriture en gras ne sert qu'à séparer mes commentaires au code. Mon intention était d'aider le lecteur et non pas de lui manquer de respect.
Ci-dessous, le code avec les balises adaptées :

import time

print("Les mots sont : ainsi, fois, tout, cent, amour, reprendre, devenir, jusque, rue, monsieur, mari, ville, falloir, maison, quel, peu, tenir, air, bien, beau ")
t=time.time() 
while 1:
    if time.time()-t < 30:
        score = 0
        a=input("Mot(ainsi) : ")
        if a == "ainsi":
            score+=1
        else : 
            score+=0
        b=input("Mot(fois) : ")
        if b == "fois":
            score+=1
        else : 
            score+=0
        c=input("Mot(tout) : ")
        if c == "tout":
            score+=1
        else : 
            score+=0
        d=input("Mot(cent) : ")
        if d == "cent":
            score+=1
        else : 
            score+=0
        e=input("Mot(amour) : ")
        if e == "amour":
            score+=1
        else : 
            score+=0
        f=input("Mot(reprendre) : ")
        if f == "reprendre":
            score+=1
        else : 
            score+=0
        g=input("Mot(devenir) : ")
        if g == "devenir":
            score+=1
        else : 
            score+=0
        h=input("Mot(jusque) : ")
        if h == "jusque":
            score+=1
        else : 
            score+=0
        i=input("Mot(rue) : ")
        if i == "rue":
            score+=1
        else : 
            score+=0
        j=input("Mot(monsieur) : ")
        if j == "monsieur":
            score+=1
        else : 
            score+=0
        k=input("Mot(mari) : ")
        if k == "mari":
            score+=1
        else : 
            score+=0
        l=input("Mot(ville) : ")
        if l == "ville":
            score+=1
        else : 
            score+=0
        m=input("Mot(falloir) : ")
        if m == "falloir":
            score+=1
        else : 
            score+=0
        n=input("Mot(maison) : ")
        if n == "maison":
            score+=1
        else : 
            score+=0
        o=input("Mot(quel) : ")
        if o == "quel":
            score+=1
        else : 
            score+=0
        p=input("Mot(peut) : ")
        if p == "peut":
            score+=1
        else : 
            score+=0
        q=input("Mot(tenir) : ")
        if q == "tenir":
            score+=1
        else : 
            score+=0
        r=input("Mot(air) : ")
        if r == "air":
            score+=1
        else : 
            score+=0
        s=input("Mot(bien) : ")
        if s == "bien":
            score+=1
        else : 
            score+=0
        t=input("Mot(beau) : ")
        if t == "beau":
            score+=1
        else : 
            score+=0
        u=input("Mot(connaître) : ")
        if u == "connaître":
            score+=1
        else : 
            score+=0
        v=input("Mot(mettre) : ")
        if v == "mettre":
            score+=1
        else : 
            score+=0
        w=input("Mot(puis) : ")
        if w == "puis":
            score+=1
        else : 
            score+=0   
        x=input("Mot(ciel) : ")
        if x == "ciel":
            score+=1
        else : 
            score+=0
        y=input("Mot(sans) : ")
        if y == "sans":
            score+=1
        else : 
            score+=0
        z=input("Mot(votre) : ")
        if z == "votre":
            score+=1
        else : 
            score+=0
        aa=input("Mot(premier) : ")
        if aa == "premier":
            score+=1
        else : 
            score+=0
        ab=input("Mot(avoir) : ")
        if ab == "avoir":
            score+=1
        else : 
            score+=0
        ac=input("Mot(avec) : ")
        if ac == "avec":
            score+=1
        else : 
            score+=0
        ad=input("Mot(chambre) : ")
        if ad == "chambre":
            score+=1
        else : 
            score+=0
        ae=input("Mot(ami) : ")
        if ae == "ami":
            score+=1
        else : 
            score+=0
        af=input("Mot(ni) : ")
        if af == "ni":
            score+=1
        else : 
            score+=0
        ag=input("Mot(noir) : ")
        if ag == "noir":
            score+=1
        else : 
            score+=0
        ah=input("Mot(chaque) : ")
        if ah == "chaque":
            score+=1
        else : 
            score+=0
        ai=input("Mot(aimer) : ")
        if ai == "aimer":
            score+=1
        else : 
            score+=0
        aj=input("Mot(parler) : ")
        if aj == "parler":          
            score+=1
        else : 
            score+=0
    else :
        print("Le temps est écoulé")
            
print("Bien joué, vous avez fini, votre score est de :",score,"en 30 secondes")
moyenne = 16
score_min=score*2
print("Vous avez tapé",score_min,"de mots en 1 minute")
if score > moyenne:
    print("Bravo, vous êtes au dessus de la moyenne")
else : 
    print("Votre score est en dessous de la moyenne, retentez votre chance")


Merci,
Nathan
Bonsoir,

Donc comment faire l'opération des chaînes de caractères pour avoir le score du joueur ?
Existe-il une fonction adaptée ?
Est-ce mieux d'importer le module "random" pour aléatoirement prendre un mot dans une liste ? Mais alors comment savoir si le mot tapé est correct ou pas ?
Par ailleurs, je pense ici, que le code pour réaliser le chronomètre n'est pas bon.

Merci et bonne soirée,

Nathan
Messages postés
15381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 janvier 2021
499
Avant d’imaginer des améliorations, corrige ton problème actuel.

Tu n’as pas répondu à ma question.
Le problème vient-il de ma boucle while ? La première itération est possible mais pas la deuxième car la boucle n'est pas infinie. Je pense ici qu'il faut changer la ligne comme ceci :
while True:

Ici, la boucle est infinie