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

Fermé
Multi73 Messages postés 88 Date d'inscription dimanche 13 septembre 2020 Statut Membre Dernière intervention 4 mai 2022 - 29 juin 2021 à 18:52
 flopython78 - 22 juil. 2021 à 14:32
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

jee pee Messages postés 39582 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 17 avril 2024 9 224
Modifié le 29 juin 2021 à 19:10
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 22696 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471
30 juin 2021 à 08:54
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 dimanche 13 septembre 2020 Statut Membre Dernière intervention 4 mai 2022 2
1 juil. 2021 à 12:04
J'en avais fait un une fois mais en suivant une vidéo en même temps.
0
yg_be Messages postés 22696 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024 1 471 > Multi73 Messages postés 88 Date d'inscription dimanche 13 septembre 2020 Statut Membre Dernière intervention 4 mai 2022
1 juil. 2021 à 12:57
c'est un sujet assez complexe, qui mérite plus d'étude.
0
Multi73 Messages postés 88 Date d'inscription dimanche 13 septembre 2020 Statut Membre Dernière intervention 4 mai 2022 2 > yg_be Messages postés 22696 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 avril 2024
1 juil. 2021 à 12:58
ok la je regarde le site que Dal m'as donner
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 30 juin 2021 à 10:48
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 30 juin 2021 à 12:29
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 dimanche 13 septembre 2020 Statut Membre Dernière intervention 4 mai 2022 2
1 juil. 2021 à 12:06
Merci !
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 1 juil. 2021 à 17:00
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
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