Problème de variable quand j'utilise la fonction def

Signaler
Messages postés
84
Date d'inscription
dimanche 13 septembre 2020
Statut
Membre
Dernière intervention
1 juillet 2021
-
 flopython78 -
Bonjour,
J'ai créé un jeu pierre, feuille, ciseaux.
Mais le programme m'affiche plein d'erreur, car les variables je ne les ai pas définis dans la même def de mon programme.
Et je ne peux pas mettre les variables
score_joueur
et
score_ordi
dans la def
q_if2 
car cela remettrai tout le temps les variables a zéro.
Est-il possible de faire autrement ?
Si oui comment ?

Voici mon programme:

import random
import time
import os
os.system("color c")
with open("pierre_feuille_ciseaux.txt", "r+") as file:
    word_lists = file.readlines()
    choix_pc = random.choice(word_lists)
    choix_pc = choix_pc.rstrip()
class info():
    def q_if1(self):
        score_joueur = 0
        score_ordi = 0
        print("Bienvenue dans le jeux pierre feuille ciseaux.")
        time.sleep(2)

    def q_if2(self):
        choix = input("Choisissez entre: pierre, feuille, ou ciseaux")
        time.sleep(1)
        print("L'ordinateur à choisi le mots: ", choix_pc)
        time.sleep(2)
        if choix_pc == "pierre" and choix == "feuille":
            score_joueur += 1
            print("Vous avez gagner un points en plus.\n Votre score est de", score_joueur, "points. \n Le score de l'ordinateur est de", score_ordi, "points")
            time.sleep(2)
        if choix_pc == "pierre" and choix == "ciseaux":
            score_ordi += 1
            print("Vous avez perdu.\n Votre score est de", score_joueur, "points. \n Le score de l'ordinateur est de", score_ordi, "points")
            time.sleep(2)
        if choix_pc == "feuille" and choix == "pierre":
            score_ordi += 1
            print("Vous avez perdu.\n Votre score est de", score_joueur, "points. \n Le score de l'ordinateur est de", score_ordi, "points")
            time.sleep(2)
        if choix_pc == "feuille" and choix == "ciseaux":
            score_joueur += 1
            print("Vous avez gagner un points en plus.\n Votre score est de", score_joueur, "points. \n Le score de l'ordinateur est de", score_ordi, "points")
            time.sleep(2)
        if choix_pc == "ciseaux" and choix == "pierre":
            score_joueur += 1
            print("Vous avez gagner un points en plus.\n Votre score est de", score_joueur, "points. \n Le score de l'ordinateur est de", score_ordi, "points")
            time.sleep(2)
        if choix_pc == "ciseaux" and choix == "feuille":
            score_ordi += 1
            print("Vous avez perdu.\n Votre score est de", score_joueur, "points. \n Le score de l'ordinateur est de", score_ordi, "points")
            time.sleep(2)
        if choix_pc == choix:
            print("Votre choix et le choix de l'ordinateur est le même donc je ne mets pas de points !")
            time.sleep(2)
        if score_joueur == 5:
            print("Bravo tu as gagner car ton score est de 5 et le score de l'ordinateur est de:", score_ordi, "bien joué !")
            time.sleep(6)
        if score_ordi == 5:
            print("Tu as perdu car le score de l'ordinateur est de 5 et ton score est de:", score_joueur, "!")
q_if1()
q_if2()
if score_ordi == 5:
    time.sleep(10)
    exit()

if score_joueur == 5:
    time.sleep(10)
    exit()


Merci !

7 réponses

Messages postés
32509
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
23 juillet 2021
7 826
Bonjour,

Tu utilises des variables globales. Ou ni classe, ni fonction mais juste une boucle style
while score_joueur < 5 and scrore_ordi < 5: 


Messages postés
16418
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juillet 2021
877
bonjour,
est-ce ton premier exercice avec une classe?
les noms que tu utilises (info, q_if1, q_if2) ne signifient rien. c'est peut-être une indication que cela est mal conçu.
Messages postés
84
Date d'inscription
dimanche 13 septembre 2020
Statut
Membre
Dernière intervention
1 juillet 2021

J'en avais fait un une fois mais en suivant une vidéo en même temps.
Messages postés
16418
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juillet 2021
877 >
Messages postés
84
Date d'inscription
dimanche 13 septembre 2020
Statut
Membre
Dernière intervention
1 juillet 2021

c'est un sujet assez complexe, qui mérite plus d'étude.
Messages postés
84
Date d'inscription
dimanche 13 septembre 2020
Statut
Membre
Dernière intervention
1 juillet 2021
>
Messages postés
16418
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juillet 2021

ok la je regarde le site que Dal m'as donner
Messages postés
1106
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
20 juillet 2021
122
Bonjour,

Ca me parait bien long tout ça, on peut faire plus simple:

score_joueur = score_ordi = 0
définir une liste des choix : pierre, feuille, ciseaux
définir une liste des précédences entre objets : [pierre, ciseaux],[ciseaux, feuille],[feuille, pierre]
l'utilisateur entre son choix
l'ordi tire au hasard dans la liste des choix
on met ces 2 choix dans une liste : [utilisateur, ordi]

si choix_1 = choix_2: match nul
si liste = l'une des listes de la liste des précédences, l'utilisateur gagne: score_joueur +=1
si l'inverse de la liste = l'une des listes de la liste des précédences, l'ordi gagne : score_ordi += 1
Messages postés
5583
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
9 juillet 2021
942
Salut Multi73,

Il y a plusieurs problèmes dans ton code. Comme le dit jee pee tu ne boucles pas, donc tu joues une seule fois. yg_be et Phil_1857 en signalent d'autres, mais ton code en l'état ne peut pas fonctionner car tu n'utilises pas correctement la classe que tu définis en faisant plusieurs erreurs empêchant toute exécution.

Si tu crées une classe à partir de la ligne 9
class info():
, pour utiliser cette classe, il te faut ensuite créer un objet utilisant cette classe.

Donc avant les lignes 53 et 54 :

q_if1()
q_if2()


tu peux créer un objet nommé, par exemple,
jeu
utilisant cette classe :

jeu = info()


Ensuite, tu peux utiliser cet objet, et notamment les fonctions (méthodes) qu'il définit :

jeu.q_if1()
jeu.q_if2()


Au sujet de ta question concernant les variables de score utilisées, tu peux procéder ainsi :
  • définir les variables utilisées par la classe au sein de cette classe, en dehors de toutes méthodes (ou dans la méthode spéciale
    __init__()
    )
  • référencer ces variables au sein de tes fonctions avec le mot clef
    self
    , qui indique que tu accèdes dans ta classe à des variables appartenant à la classe


Par exemple, ton code à partie de la ligne 9 pourrait ressembler à cela :

class info():
    score_joueur = 0
    score_ordi = 0
    def q_if1(self):
        print("Bienvenue dans le jeux pierre feuille ciseaux.")
        time.sleep(2)

    def q_if2(self):
        choix = input("Choisissez entre: pierre, feuille, ou ciseaux")
        time.sleep(1)
        print("L'ordinateur à choisi le mots: ", choix_pc)
        time.sleep(2)
        if choix_pc == "pierre" and choix == "feuille":
            self.score_joueur += 1
            print("Vous avez gagner un points en plus.\n Votre score est de", self.score_joueur, "points. \n Le score de l'ordinateur est de", self.score_ordi, "points")
            time.sleep(2)
        (...)


Tu devrais revoir ton cours ou un manuel concernant l'usage des classes, ou un tutoriel simple comme : https://www.w3schools.com/python/python_classes.asp

Dal
Messages postés
84
Date d'inscription
dimanche 13 septembre 2020
Statut
Membre
Dernière intervention
1 juillet 2021

Merci !
Messages postés
1106
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
20 juillet 2021
122
Bonjour,

Sinon, sans parler de classes, on peut faire simple pour le calcul du gagnant :
import random

choix = {'p':'pierre', 'f':'feuille', 'c':'ciseaux'}
precedences = ['feuillepierre', 'pierreciseaux', 'ciseauxfeuille']
points_joueur, points_ordi = 0,0

while(True):
    joueur = input('\nVotre choix (p, f, c) ou <q>uitter : ')
    if(joueur == 'q'): break

    joueur = choix[joueur]
    ordi = random.choice([val for val in choix.values()])
    print('joueur : {}  ordi : {}'.format(joueur, ordi))

    if(joueur == ordi):
        print('match nul')
    else:
        jeu = joueur+ordi
        jeu_inv = ordi+joueur
        for p in precedences:
            if(jeu == p):
                print('joueur gagne !')
                points_joueur += 1
            elif(jeu_inv == p):
                print('ordi gagne !')
                points_ordi += 1

print('\nJoueur : {} points   ordi : {} points'.format(points_joueur, points_ordi))
au début de ton "def", met la ligne :

global valeur1,valeur2,valeur3

Tu n'est pas obligé de mettre 3 valeurs, si tu en a besoin de plus ou de moins !