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

Multi73 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   -  
 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 !
A voir également:

7 réponses

jee pee Messages postés 41518 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
Bonjour,

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


0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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.
0
Multi73 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   2
 
J'en avais fait un une fois mais en suivant une vidéo en même temps.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Multi73 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention  
 
c'est un sujet assez complexe, qui mérite plus d'étude.
0
Multi73 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   2 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
ok la je regarde le site que Dal m'as donner
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Multi73 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   2
 
Merci !
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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))
0
flopython78
 
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 !
0