Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable qui ne s'actualise pas

15 décembre 2021 à 14:37:31

Bonjour, alors voilà je suis lycéen et on crée un projet de jeu dans lequel on doit utiliser des fonctions et j'utilise une fonction dans une fonction principale, le problème est que j'initialise une variable dans ma fonction principale mais je n'arrive pas à l'utiliser dans mes fonctions secondaires, la variable ne s'actualise pas peu importe les opérations que je lui inflige. Je vous mets mon code ci-dessous : 

def choix_joueur(allumettes):

    from IPython.display import clear_output

    from time import sleep    

    print("Combien d'allumettes prenez-vous ? (1, 2 ou 3)") 

    user = int(input())

    if user > 3 or user < 1 :

        print("Vous devez prendre entre 1 et 3 allumettes !")

        sleep(1.5)

        clear_output()

        choix_joueur(allumettes)

    else : 

        allumettes -= user

        if allumettes == 1 :

            print("Vous avez gagné!")

            sleep(2)

            print("Voulez-vous recommencer une partie ? Oui / Non ")

            restart = int(input())

            if restart == "Oui" :

                partie()

def choix_bot(allumettes):

    from IPython.display import clear_output

    from random import randint

    from time import sleep         

    bot = randint(1, 3)

    sleep(1)

    if bot == 1 :

        print(f'Je prends 1 allumette')

    else:

        print(f'Je prends {bot} allumettes')

    allumettes -= bot

    if allumettes == 1 :

        print("Vous avez perdu !")

        sleep(2)

        print("Voulez-vous recommencer une partie ? Oui / Non ")

        restart = int(input())

        if restart == "Oui" :

            partie()

def jeu_allumettes():

    from time import sleep

    from IPython.display import clear_output

    print("Avec combien d'allumettes voulez-vous jouer ?")

    allumettes = int(input())

    while allumettes > 0 :

        choix_joueur(allumettes)

        choix_bot(allumettes)

        sleep(1.5)

        print(f'Il reste {allumettes} allumettes')

        sleep(2)

        clear_output()



Voici ce que je reçois après avoir choisi le nombre d'allumettes que je retire et ce qui est problématique c'est que je choisis 20 allumettes pour jouer mais que la variable n'est pas modifiée :

Je prends 2 allumettes
Il reste 20 allumettes

-
Edité par RetroTeens 15 décembre 2021 à 15:29:31

  • Partager sur Facebook
  • Partager sur Twitter
15 décembre 2021 à 15:22:02

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Merci de colorer votre code à l'aide du bouton Code

Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: python;">Votre code ici</pre>.

Merci de modifier votre message d'origine en fonction.

Liens conseillés

  • Partager sur Facebook
  • Partager sur Twitter
15 décembre 2021 à 15:35:45

RetroTeens a écrit:

Voici ce que je reçois après avoir choisi le nombre d'allumettes que je retire et ce qui est problématique c'est que je choisis 20 allumettes pour jouer mais que la variable n'est pas modifiée


Par défaut, les variables d'une fonction sont locales (et n'existent que lorsque la fonction s'exécute). Une fonction s'utilise d'abord pour effectuer une opération avec un ou plusieurs paramètres et récupérer le résultat.

Pas facile de se lancer dans un projet où on veut utiliser des fonctions sans trop savoir tout ça... mais vous avez plein de tutos à portée de clic pour apprendre.

  • Partager sur Facebook
  • Partager sur Twitter
15 décembre 2021 à 17:51:03

Et "récupérer" ça veut dire exécuter l'instruction "return" puis placer le résultat dans une variable dans la fonction appelante.

-
Edité par PierrotLeFou 15 décembre 2021 à 17:53:01

  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

15 décembre 2021 à 18:52:05

PierrotLeFou a écrit:

Et "récupérer" ça veut dire exécuter l'instruction "return" puis placer le résultat dans une variable dans la fonction appelante.

On suppose connaître la forme y = f(x) de ses souvenirs de maths. Après voir comment on réalise ce concept de fonction avec Python, c'est le sujet d'un ou plusieurs chapitres de tous les tutos... et avec Python, une fonction retourne toujours quelque chose même sans "return"

  • Partager sur Facebook
  • Partager sur Twitter
15 décembre 2021 à 22:25:26

Pour répondre à votre question, il faudrait que vos fonctions renvoient le nouveau nombre d'allumettes, du genre :

n=choix_joueur(allumettes)
 
p=choix_bot(allumettes)


Mais fondamentalement votre conception de programme n'est pas bonne, on ne voit pas quel est le rôle de choix_joueur ou de choix_bot (pas la peine de créer une fonction pour capturer un nombre ou tirer un nombre au hasard).  Et ce n'est pas à ces fonctions de gérer le jeu, ce que fait par exemple le bout de code :

    if allumettes == 1 :
 
        print("Vous avez perdu !")
 
        sleep(2)
 
        print("Voulez-vous recommencer une partie ? Oui / Non ")
 
        restart = int(input())
 
        if restart == "Oui" :
 
            partie()

Vos fonctions contiennent de la duplication de code ce qui est un signe qu'elles sont mal conçues. Je ne suis pas même pas sûr que vous sachiez exactement ce que votre jeu est censé faire et ça, ça ne peut pas donner du bon code.

En réalité, il faut pas mal de temps (des mois voire des années) avant de bien savoir utiliser des fonctions parce que ça va de pair avec concevoir un programme, créer des abstractions, découper en tâches, etc Par contre, il faut absolument savoir le rôle des paramètres/arguments, le rôle du return, le caractère local des variables dans une fonction, la notion d'appel d'une fonction (votre code ci-dessus ne fait rien, la fonction principale n'est pas appelée), le fait qu'une fonction puisse modifier des arguments mutables, etc.

Si vous aviez un vrai bot (une IA) et/ou une interface graphique, il y aurait peut-être matière à utiliser des fonctions de manière significative mais là le jeu est trop simple.

-
Edité par PascalOrtiz 15 décembre 2021 à 22:26:40

  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2021 à 10:40:24

Ok alors j'ai changé mon code et j'utilise le return mais ça change toujours rien

Je suis obligé d'utiliser ces fonctions car mon prof me le demande. Mon code marchait sans ces fonctions.

def choix_joueur(allumettes):
    from IPython.display import clear_output
    from time import sleep
    
    print("Combien d'allumettes prenez-vous ? (1, 2 ou 3)") 
    user = int(input())

    if user > 3 or user < 1 :
        print("Vous devez prendre entre 1 et 3 allumettes !")
        sleep(1.5)
        clear_output()
        choix_joueur(allumettes)
    else : 
        allumettes-=user
    return allumettes
def choix_bot(allumettes):
    from IPython.display import clear_output
    from random import randint
    from time import sleep     
    
    bot = randint(1, 3)

    sleep(1)

    if bot == 1 :
        print(f'Je prends 1 allumette')
    else:
        print(f'Je prends {bot} allumettes')
    
    allumettes -= bot
    return allumettes
def jeu_allumettes():
    from time import sleep
    from IPython.display import clear_output
    
    print("Avec combien d'allumettes voulez-vous jouer ?")
    allumettes = int(input())
    
    while allumettes > 0 :
        choix_joueur(allumettes)
        if allumettes == 1 :
            print("Vous avez gagné!")

            sleep(2)

            print("Voulez-vous recommencer une partie ? Oui / Non ")

            restart = int(input())
            if restart == "Oui" :
                partie()
            elif restart == "Non":
                break
        choix_bot(allumettes)
        if allumettes == 1 :
            print("Vous avez perdu !")

            sleep(2)
            
            print("Voulez-vous recommencer une partie ? Oui / Non ")

            restart = int(input())
            if restart == "Oui" :
                partie()
            elif restart == "Non":
                break
        sleep(1.5)

        print(f'Il reste {allumettes} allumettes')

        sleep(2)

        clear_output()
def partie():
    from getpass import getpass
    print("Appuyez sur Entrée pour jouer")
    whatever = getpass()
    jeu_allumettes()

-
Edité par RetroTeens 23 décembre 2021 à 10:45:56

  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2021 à 11:13:04

si tu ne récupères pas le return de tes fonctions, ça ne marchera forcément pas.

allumettes=choix_joueur(allumettes)

allumettes=choix_bot(allumettes)

  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2021 à 11:41:48

Ok merci beaucoup ! Je suis qu'un débutant je pense que ça se voit xD Juste où est ce que je suis censé mettre ça exactement ?

-
Edité par RetroTeens 23 décembre 2021 à 11:43:12

  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2021 à 11:47:07

RetroTeens a écrit:

Ok merci beaucoup ! Je suis qu'un débutant je pense que ça se voit xD Juste où est ce que je suis censé mettre ça exactement ?

Si vous débutez, vous n'avez aucune bonne raison d'écrire une fonction récursive... (et de vous y prendre les pieds).
  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2021 à 11:56:26

RetroTeens a écrit:

Ok merci beaucoup ! Je suis qu'un débutant je pense que ça se voit xD Juste où est ce que je suis censé mettre ça exactement ?

-
Edité par RetroTeens il y a 5 minutes


à la place de tes appels actuels à ces fonctions : ligne 9 et 22 de jeu_allumettes

La récursivité dont parle mps est l'appel à choix_joueur(allumettes) dans choix_joueur en cas de mauvaise réponse; ça peut/doit se modifier par une boucle while 

  • Partager sur Facebook
  • Partager sur Twitter