Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Un problème de variable et de fichiers

+5 votes

Voilà, en spécialité ISN j'ai décidé de recoder un jeu de cartes que j'apprécie le Wazabi, afin de réduire la taille du code central j'ai décidé de faire pleins de fichiers avec des procédures (logique jusque là). Sauf que (je ne vais pas trop détailler les règles) quand le joueur veut jouer une nouvelle fois dans son tour (grâce à l'utilisation d'une procédure dans un autre fichier) quoi qu'il arrive, le nombre de points wazabi est remis à zéro! Que faire?

Voici les portions de codes qui utilisent ce qui est le centre de mon problème

from player_turn import Tour_Joueur as TTT #Import de ma procédure dans le fichier central

Ensuite :

if Wazabi_Player > 0: #Si après la première carte, le joueur à encore des points à dépenser
            print("Wazabi restant = ",Wazabi_Player) #Affichage des points restants
            Use_Ask2 = input("Il vous reste encore des points wazabi! Les utiliser? (y/n) ") #Demande si l'on veut utiliser un autre carte ou non
            Use_Ask2 = str(Use_Ask2) #Variable en mode chaîne de caractères
            if Use_Ask2 == "y": #Réponse Positive
                TTT() #Procédure importée sous un nom plus court 

from all_datas import *
def Tour_Joueur():
    from all_datas import Cartes_Main_Player
    print("Wazabi restant = ",Wazabi_Player)
    Chosen_Card = input("Rentre le nom de la carte exact : ") #Nom de la carte entrée
    Chosen_Card = str(Chosen_Card) #Placement de la réponse dans une variable de type str
    if Chosen_Card in hand: #Vérifie si la carte rentrée existe et est dans la main
        print("Vous utilisez '", Chosen_Card,"'\n\n") #Affichage de la carte utilisée
        hand.remove(Chosen_Card) #On retire de la hand la carte
        liste.append(Chosen_Card) #On la met au paquet
        if Chosen_Card == "Supprimez 1 de vos dés":
            Cartes_Main_Player -= 1
            if Wazabi_Player >= 1:                        
                Dice_Player_1 -= 1
                print("Joueur 1 : Vous avez maintentant", Dice_Player_1 ,"dés\n\n")
                Tour = 1
            else:
                print("PAS ASSEZ DE POINTS WAZABI!")

Ah oui précision : le fichier all_datas contient toutes les variables pour le jeu (dans le fichier, le nombre de points wazabi est à 0).

demandé 23-Mar-2015 par Rythmic Spark (126 points)

Une petite remarque, qui ne répond pas a ta question mais que j’espère tu prendras comme constructive :

  • tes noms de variables sont un mélange de CamelCase et de lower_case_with_underscore. Entre les deux il faut choisir. En python on utilise en principe du CamelCase pour les classes, lower_case_with_underscore pour le reste
  • en python les noms de fonctions/méthodes/variables commencent par des minuscules

La référence pour çà c'est la pep8. Il y a des outils pour valider ton code, comme flake8.

Tout çà se ne sont que des normes que tu es libre de respecter ou non, mais par pitié, pense a ceux qui vont lire ton code :)

Si la meilleure réponse te conviens, clique sur "accepter" pour donner des points à l'auteur.

2 Réponses

+6 votes

réponse courte
Arrête les

from all_data import ...

et écris juste

import all_data

au début de tes fichiers. Ensuite, réfère toi aux variables avec leur chemin complet : all_data.Wazabi_player, all_data.Cartes_Main_Player, all_data.Dice_Player_1, etc.

exemple simple du problème
Considèrons les trois fichiers suivant.

data.py:

# fichier data.py
x = 0

wrong.py:

# fichier wrong.py
def f_wrong():
    from data import x
    x += 1
    print x


f_wrong()
f_wrong()
f_wrong()
f_wrong()

right.py:

# fichier right.py
import data

def f_right():
    data.x += 1
    print data.x


f_right()
f_right()
f_right()
f_right()

'python wrong.py' te donne

1 
1 
1 
1 

Tandis que 'python right.py' te donne

1
2
3
4

pourquoi
Pour comprendre ce qu'il se passe, il faut comprendre comment Python gère les variables (des éléments ici : http://sametmax.com/valeurs-et-references-en-python/) mais aussi la porté des noms de variables et un peu sur les espaces de noms.

Ce n'est pas la partie la plus intuitive de Python, mais on peut retenir que le 'from truc import *' est à proscrire.

PS: réponse recode tout
Vu ce que tu souhaites réaliser, il serait logique de te suggérer de te tourner vers de la programation objet. Les objets sont en effet un moyen de conserver / modifier un état bien plus recommender que ton utilisation des variables dans un module.

répondu 23-Mar-2015 par bubulle (2,066 points)
edité 23-Mar-2015 par bubulle

Réécrire une partie du code, oui, mais pas d'orienté-objet : d'autres notions (nommage des variables, imports, structure modulaire) sont plus importantes, surtout au niveau ISN.

Lucas, je suis d'accord. Disons que le post-scriptum est une ouverture pour un éventuel futur.

–2 votes

Merci mais j'ai réussi à trouver ma réponse, j'ai utilisé les commande de type file.open() file.write(),... afin de stocker mes variables ^^
Je vais pouvoir désormais commencer à coder mon I.A

répondu 24-Mar-2015 par Rythmic Spark (126 points)

Tu veux écrire tes variables dans un fichier ?
A moins que tu ne veuilles récupérer leurs valeurs entre deux exécutions de ton programme, je pense que c'est une solution pour le moins alambiquée.

C'est justement ce que je veux faire en fait

Peut-être que le module shelve t’intéressera alors ? (voir ici ou )

...