IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

probleme incrementation dans jeu


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 10
    Points
    10
    Par défaut probleme incrementation dans jeu
    bonjour tout le monde!
    voilà j'ai un probleme, je n'arrive pas à changer la valeur d'une variable dans mon jeux. Je met le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    clairiere1 = {'piege' : piege1, 'nom' :"Maison du Chaperon rouge", 'choix chemin': [clairiere3, clairiere2]}
    clairiere2 = {'piege' : piege2, 'nom' : "La clairiere de la joie", 'choix chemin': [clairiere1, clairiere3]}
    clairiere3 = {'piege' : piege3, 'nom' : "La clairiere du Loup-garou", choix chemin': [clairiere1, clairiere2]}
     
     
     
    def choix_chemin(position_joueur):
     
     
        if position_joueur.has_key('choix_chemin')==True:
            if len (position_joueur['choix_chemin'])==1 :
                print "tapez ","1","pour allez à ", position_joueur['choix_chemin'][0]['nom']
            else :    
                for i in range(len(position_joueur['choix_chemin'])) :
                    print "tapez ",i,"pour allez à ", position_joueur['choix_chemin'][i]['nom']
            c=input ("Quel est votre choix ?")
        print 'nouvelle clairiere', position_joueur['choix_chemin'][c]['nom']
        print 'ancienne ',position_joueur['nom']
        return position_joueur['choix_chemin'][c]
    def deplacer_perso(position_joueur) :
     
        position_joueur=choix_chemin(position_joueur)
        return
    la variable que je veux changer c'est position_joueur et c'est un dico.en fait position_joueur est tout d'abords dans la clairiere1, donc position_joueur=clairiere1. les dico clairiere ont une clé 'choix chemin' avec comme valeur une liste.c'est dans cette liste que le joueur va choisir sa prochaine clairiere, sauf que quand il choisi, position joueur reste toujours =clairiere1!je n'arrive pas à changer la variable!
    Alors siouplait, aidez moi, j'en ai besion, c'est pour l'école et pour mardi!
    Merci et bonne aprem

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    C'est un problème de référence, tu réaffectes une valeur à ta variable position_joueur dans le contexte local (la fonction deplacer_perso) sans préciser que tu veux agir sur la variable globale, donc soit tu laisses tomber la fonction deplacer_perso et tu affectes dans le contexte global (là où tu appellerais la fonction), soit tu précises à l'interpréteur que tu veux utiliser la variable globale position_joueur (mot-clé global), auquel cas le return est inutile, ainsi que le passage en argument de l'ancienne position, vu que c'est une variable globale.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    j'ai déjà essayer avec 'global', mais ça marchait pas non plus.

    auquel cas le return est inutile, ainsi que le passage en argument de l'ancienne position, vu que c'est une variable globale
    ça par contre je comprend pas ce que tu veux dire.

    j'avais essayer d'affecter directement position_joueur dans la fonction, mais le shell me disait un truc du genre "réference before assignement".

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Citation Envoyé par hulkyoann Voir le message
    j'avais essayer d'affecter directement position_joueur dans la fonction, mais le shell me disait un truc du genre "réference before assignement".
    Définis la variable globale avant (en lui donnant une valeur de départ)

    Concernant ton essai avec le mot-clé global, montre ton code, personne ne pourra te donner de réponse sinon.

  5. #5
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Bonjour,

    Ce que je vois :
    Tu définis clairiere1 avec clairiere2 et qui n'existent pas encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clairiere1 = {'piege' : piege1, 'nom' :"Maison du Chaperon rouge", 'choix chemin': [clairiere3, clairiere2]}
    => Différencier le nom du lieu de l'objet

    il manque un ' avant choix chemin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clairiere3 = {'piege' : piege3, 'nom' : "La clairiere du Loup-garou", choix chemin': [clairiere1, clairiere2]}
    Tu peux résoudre le problème d'accès à tes variables en utilisant une classe où les variables deviennent disponibles de partout comme self.position_joueur et self.lieu dans l'exemple suivant :
    => plus besoin de les passer en paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
     
    class Jeux():
     
        def __init__(self):
            self.lieu={}
            self.lieu["clairiere1"] = {'piege' : "piege1", 'nom' :"Maison du Chaperon rouge", 'choix_chemin': ["clairiere3", "clairiere2"]}
            self.lieu["clairiere2"] = {'piege' : "piege2", 'nom' : "La clairiere de la joie", 'choix_chemin': ["clairiere1", "clairiere3"]}
            self.lieu["clairiere3"] = {'piege' : "piege3", 'nom' : "La clairiere du Loup-garou", 'choix_chemin': ["clairiere1", "clairiere2"]}
     
        def choix_chemin(self):
            pos=self.lieu[self.position_joueur]
            if pos.has_key('choix_chemin')==True: 
                for i,lieu in enumerate(pos['choix_chemin']) :
                    print "tapez ",i,"pour allez à ", lieu
                c=input ("Quel est votre choix ?")
            self.position_joueur=pos['choix_chemin'][c]
     
        def deplacer_perso(self) :
            self.choix_chemin()
            print "Vous êtes à "+self.position_joueur
     
    jeux=Jeux()
    jeux.position_joueur="clairiere1"
    while True:
        jeux.deplacer_perso()

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    clairiere1 = {'piege' : piege1, 'nom' :"Maison du Chaperon rouge", 'choix chemin': [clairiere3, clairiere2]}
    clairiere2 = {'piege' : piege2, 'nom' : "La clairiere de la joie", 'choix chemin': [clairiere1, clairiere3]}
    clairiere3 = {'piege' : piege3, 'nom' : "La clairiere du Loup-garou", 'choix chemin': [clairiere1, clairiere2]}
     
     
     
    def choix_chemin(position_joueur):
        global position_joueur
     
        if position_joueur.has_key('choix_chemin')==True:
            if len (position_joueur['choix_chemin'])==1 :
                print "tapez ","1","pour allez à ", position_joueur['choix_chemin'][0]['nom']
            else :    
                for i in range(len(position_joueur['choix_chemin'])) :
                    print "tapez ",i,"pour allez à ", position_joueur['choix_chemin'][i]['nom']
            c=input ("Quel est votre choix ?")
        print 'nouvelle clairiere', position_joueur['choix_chemin'][c]['nom']
        print 'ancienne ',position_joueur['nom']
        return position_joueur['choix_chemin'][c]
    def deplacer_perso(position_joueur) :
     
        position_joueur=choix_chemin(position_joueur)
        return
    En fait c'est la même chose qu'avant, mais avec "global position_joueur" en plus. Mais je ne sais pas trop comment ça marche le mot-clé global.

    Merci alexdevl pour ton exemple avec le code, mais je ne dois pas le faire avec les class. Mais c'est vrai que c'est moi chiant avec les class.
    Par contre j'ai réglé le probleme des clairiere que j'utilisait avant de les définir.

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Citation Envoyé par oiffrig Voir le message
    C'est un problème de référence, tu réaffectes une valeur à ta variable position_joueur dans le contexte local (la fonction deplacer_perso) sans préciser que tu veux agir sur la variable globale, donc soit tu laisses tomber la fonction deplacer_perso et tu affectes dans le contexte global (là où tu appellerais la fonction), soit tu précises à l'interpréteur que tu veux utiliser la variable globale position_joueur (mot-clé global), auquel cas le return est inutile, ainsi que le passage en argument de l'ancienne position, vu que c'est une variable globale.
    Ok pour la référence oiffrig mais global c'est à proscrire pour un débutant à mon avis (porte ouverte à toutes les fenêtres et +).
    Personnellement je préconise de commencer avec self ou mieux (bien mieux) return (et vu les return du code de base je pense que c'est la politique du prof).

    Citation Envoyé par hulkyoann Voir le message
    Merci alexdevl pour ton exemple avec le code, mais je ne dois pas le faire avec les class.
    Classes ? Ou ? C'est des dico.
    A mon avis la solution d'alexdevl, avec self, est pour le moment la meilleure réponse.
    Sur son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
     
    class Jeux():
     
        def __init__(self):
            self.lieu={}
            self.lieu["clairiere1"] = {"piege":"piege1", "nom":"la maison du Chaperon rouge","choix_chemin":["clairiere3", "clairiere2"]}
            self.lieu["clairiere2"] = {"piege":"piege2", "nom":"la clairiere de la joie","choix_chemin":["clairiere1", "clairiere3"]}
            self.lieu["clairiere3"] = {"piege":"piege3", "nom":"la clairiere du Loup-garou","choix_chemin":["clairiere1", "clairiere2"]}
     
        def choix_chemin(self):
            pos=self.lieu[self.position_joueur]
            if pos.has_key("choix_chemin")==True: 
                for i,lieu in enumerate(pos["choix_chemin"]):
                    print "Tapez",i,"pour allez à",self.lieu[lieu]['nom']
                c=input ("Quel est votre choix ? ")
            self.position_joueur=pos["choix_chemin"][c]
            return self.lieu[self.position_joueur]
     
        def deplacer_perso(self):
            pos = self.choix_chemin()
            print "Vous êtes à",pos['nom']
     
    jeux=Jeux()
    jeux.position_joueur="clairiere1"
    while True:
        jeux.deplacer_perso()
    A toi de gérer les erreurs (ne doute pas que ton prof regarderas le forums).

    @+
    Merci d'utiliser le forum pour les questions techniques.

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Nan, mais ça c'est les classes, puisqu'on définie une classe Jeux.
    Par contre, le code qu'a fait alexdevl ne peut pas aller dans mon code. J'explique: Dans mes dictionnaires clairiere, y'a la clé piège qui renvoie à un dico piege1 ou piege2 (etc) qui enlève des points de vie au joueur, donc je ne peu pas le mettre en chaine de caractère. Pareil pour position_joueur, il doit être un dico parce que dans le reste du code de mon jeu, il sert dans chaque fonction.
    Je ne sais pas si je suis très clair, mais j'essaie de l'être!
    Merci et bonne journée à tous!

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    c'est bon j'ai réglé le probleme, il suffisait de mettre global position_joueur.
    Mais maintenant c'est dans un autre module dans ma fonction pieges() que ça merde.
    Maintenant, le shell me dit que position_joueur n'est pas définit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    from environnement import *
    def pieges():
        global position_joueur
        if position_joueur.has_key('piege')==True:
            piege=position_joueur['piege']
            parametre_joueur['PV'] = parametre_joueur['PV'] - piege['PV']
            parametre_joueur['PS'] = parametre_joueur['PS'] - piege['PS']
            parametre_joueur['PF'] = parametre_joueur['PF'] - piege['PF']
            print piege['texte']
     
            print parametre_joueur['PV'], position_joueur['nom']
        return
    Pourtant j'importe le module environnement (là ou il y a la fonction choix_chemin, et la ou je définie la variable position_joueur), mais il ne l'importe pas, enfin on dirait.
    C'est le position_joueur dans le if qu'il désigne comme pas définit.
    Merci et bonne journée.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    oui c'est normal, mais pourquoi tu ne passes pas d'arguments, ça serait tellement plus simple ...
    bon, je suis une brèle en python, mais c'est quoi ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def choix_chemin(position_joueur):
        global position_joueur
         ...
    ...
    si position_joueurbest passé en argument, ça a rien à faire dans global, non ?

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par josmiley Voir le message
    bon, je suis une brèle en python, mais c'est quoi ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def choix_chemin(position_joueur):
        global position_joueur
         ...
    ...
    si position_joueurbest passé en argument, ça a rien à faire dans global, non ?
    oui je me suis trompé. Xcusez-moi. En fait j'ai réglé tout mes problèmes maintenant, et j'ai tout mis en argument, c'est carrement mieux!
    Merci à Tous en tout cas!

  12. #12
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par hulkyoann Voir le message
    En fait j'ai réglé tout mes problèmes maintenant, et j'ai tout mis en argument, c'est carrement mieux!
    Merci à Tous en tout cas!
    Et cela donne quoi ? (Il nous manque le def piege) C'est juste pour voir.

    Un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #!/usr/bin/env python
    # -*- coding: ISO8859-1 -*-
    #
    #
    lieu={}
    lieu["clairiere1"] = {"piege":"piege1", "nom":"la maison du Chaperon rouge","choix_chemin":["clairiere3", "clairiere2"]}
    lieu["clairiere2"] = {"piege":"piege2", "nom":"la clairiere de la joie","choix_chemin":["clairiere1", "clairiere3"]}
    lieu["clairiere3"] = {"piege":"piege3", "nom":"la clairiere du Loup-garou","choix_chemin":["clairiere1", "clairiere2"]}
     
    piege={}
    piege["piege1"] = {"PV":0, "PS":0,"PF":2, "texte":"Vous tombez dans un trou : -2 PF"}
    piege["piege2"] = {"PV":0, "PS":2,"PF":0, "texte":"Vous tombez sur votre belle mere : -2 PS"}
    piege["piege3"] = {"PV":2, "PS":0,"PF":0, "texte":"Vous tombez sur le Loup-garou : -2 PV"}
     
    parametre_joueur = {'PV':10, 'PS':10, 'PF':10}
     
    position_joueur=lieu['clairiere1']
     
    Separateur = "\n" + (80 * "*") # \n ou os.linesep 
     
    def choix_chemin(position_joueur):
        if len (position_joueur['choix_chemin'])==1:
            print "tapez","1","pour allez à", position_joueur['choix_chemin'][0]['nom']
        else :    
            for i in range(len(position_joueur['choix_chemin'])):
                print "tapez",i,"pour allez à", lieu[position_joueur['choix_chemin'][i]]['nom']
        c=input ("Quel est votre choix ? ")
        print Separateur
        print 'nouvelle clairiere', lieu[position_joueur['choix_chemin'][c]]['nom']
        print 'ancienne clairiere', position_joueur['nom']
        position_joueur = lieu[position_joueur['choix_chemin'][c]]
        return position_joueur
     
    def pieges(position_joueur):
        lepiege=position_joueur['piege']
        parametre_joueur['PV'] = parametre_joueur['PV'] - piege[lepiege]['PV']
        parametre_joueur['PS'] = parametre_joueur['PS'] - piege[lepiege]['PS']
        parametre_joueur['PF'] = parametre_joueur['PF'] - piege[lepiege]['PF']
        print piege[lepiege]['texte']
        print "Etat du personnage :"
        print parametre_joueur['PV'], "PV"
        print parametre_joueur['PS'], "PS"
        print parametre_joueur['PF'], "PF"
        return parametre_joueur
     
    print Separateur
    while parametre_joueur['PV']:
        position_joueur=choix_chemin(position_joueur)
        parametre_joueur=pieges(position_joueur)
    print Separateur
    print "Fin..."
    Bon courage pour demain.

    @+
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. [MySQL] probleme d'incrementation dans ma boucle
    Par brice14000 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/04/2009, 13h47
  2. Probleme d'incrementation dans une requete
    Par amne26 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 27/03/2009, 22h47
  3. [FLASH MX2004] Problème accent dans un XML
    Par cinetryx dans le forum Flash
    Réponses: 10
    Dernier message: 30/05/2007, 00h26
  4. Réponses: 3
    Dernier message: 26/01/2004, 17h59
  5. [BCB6] Probleme onglet dans IDE
    Par bgautier dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/01/2004, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo