Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide sauvegarde

projet ISN

    18 mai 2015 à 15:54:05

    Bonjour a tous .
    Pour mon épreuve d ISN ,moi et un ami avons choisi de faire une copie de cookie clicker avec pygame .
    Notre projet est terminée dans le domaine de ce que nous savons faire...


    Maintenant on veut ajouter des améliorations a notre programme et la on sèche complètement.. le plus gros problème et la création d'un fichier pour sauvegarder les donnée du jeu avec le nom du joueur pour continuer une partie ou voir les meilleurs scores .


    On a parcouru pas mal de sujet et on sait écrire et lire un fichier mais on galère a enregistré nos variables ,listes .. et a les récupérer avec le nom du joueur . Bon voila voila ^^ 
    Un lien pour le dossier du jeu:

    https://mega.co.nz/#fm/cAlwjBYD 

    N'hesitez pas a proposer d'autre modification .
    Merci d'avance  

    -
    Edité par miniskateur77 18 mai 2015 à 17:38:29

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2015 à 17:44:59

      Tournes toi vers la sérialisation avec le module pickle, ça te permettra de ne pas t'emmerder avec le type de tes variables. Tu mets toutes tes variables que tu veux sauvegarder dans une liste, un tuple ou un objet et tu sérialise le tout.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        18 mai 2015 à 17:59:13

        Salut,

        Personnellement je partirai sur du JSON, qui est plus rapide que pickle pour quasiment tous les types de données (excepté les float). De plus, la (dé)sérialisation JSON est facile à implémenté sur tes classes. Cependant, JSON est human-readable, donc à toi de voir si tu veux que tes données soient sauvegardées en clair. Et pour finir, JSON est universel (ou presque). La plupart des langages possèdent une librairie pour (dé)sérialiser du JSON. Ca ne représente rien pour ton projet ISN, mais sur des gros projets multi-langages (notamment le développement web), JSON est largement recommandé.

        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2015 à 18:10:08

          Comme vous débutez, mon conseil serait de tout simplement apprendre à sauvegarder vos données dans un fichier texte. Mettez-vous d'accord sur une structure, comme par exemple une ligne par score, avec sur chaque ligne le score, suivi d'un espace, suivi du nom du joueur.

          Tu crées 2 fonctions. Une qui lit le fichier texte et qui remplit les variables nécessaire de ton programme (listes ou autre). Une qui fait l'inverse: on lui passe les variables avec les infos nécessaires (une liste avec des tuples nom / score par exemple) et elle écrit le tout dans un fichier.

          • Partager sur Facebook
          • Partager sur Twitter
            20 mai 2015 à 16:51:37

            Bonjour tout d’abord merci pour vos réponses 
            Bon j'ai essayer de faire un petit programme pour lire et enregistrer mon fichier texte  

            Nom=raw_input()
            Score=int(input())
            
            Fichier = open('Donnees.txt','a')
            Fichier.write(Nom+' '+str(Score))
            
            
            Fichier = open('Donnees.txt','r')	
            Donnees = Fichier.read()
            print(Donnees)
            

            ça fonctionne plutôt bien mais ce serais possible de pouvoir savoir si le nom et déja sur le fichier et par exemple juste changer le score ? Ou alors ce n'est pas la bonne façon de faire ?
            Pour pickle je ne comprend pas comment écrire les dico et les tuple 

            je suis allez voir Json aussi mais je crains que ce soit pire ^^'

            • Partager sur Facebook
            • Partager sur Twitter
              20 mai 2015 à 17:03:47

              Voilà un exemple pour pickle si jamais :

              import pickle
              
              mon_dictionnaire = {"nom" : "gerard", "score" : 2}
              
              def save(dic) :
                  pickle.dump(dic, open("donnees.txt", "wb"))
              
              def load() :
                  dic = pickle.load(open("donnees.txt", "rb"))
                  return dic
              
              save(mon_dictionnaire)
              new_dic = load()
              print new_dic



              • Partager sur Facebook
              • Partager sur Twitter
                20 mai 2015 à 17:32:23

                apres sinon quand on utilise save(dic) sa supprime le fichier et le change non ? Comment faire si deux personne et score sont sur le fichier ?

                J'ai fait un petit programme pour montrer se que je voudrais faire, surement faux mais c'est le principe et apres il faudrais que j'integre ça avec le tien pour pouvoir sauvegarder mes liste Joueur et Score

                Joueur=[]
                Scores=[]
                nom=raw_input()
                score=int(input()) 
                a=len(Joueur)
                
                 for noms in range(a): #On parcours la liste de joueurs
                    
                    if nom==Joueur[noms]:  #Si le joueur existe 
                        rang=noms
                        Scores[rang]=score  #On change son score
                        
                    else:                    #Sinon on ajoute son nom 
                        Joueur.append(nom)   #et son score
                        Scores.append(score)

                -
                Edité par miniskateur77 20 mai 2015 à 18:20:11

                • Partager sur Facebook
                • Partager sur Twitter
                  20 mai 2015 à 17:55:32

                  Je t'ai donné un dictionnaire bidon mais tu peux faire ça par exemple (supprime le fichier donnees.txt dans un premier temps si tu en as deja un) :

                  import pickle, os
                  
                  def save(dic) :
                      pickle.dump(dic, open("donnees.txt", "wb"))
                  
                  def load() :
                      if not os.path.isfile("donnees.txt") : return {}
                      dic = pickle.load(open("donnees.txt", "rb"))
                      return dic
                  
                  dic = load()
                  nom=raw_input("name :")
                  score=int(input("score :")) 
                  dic[nom] = score
                  save(dic)
                  print dic

                  Pour la syntaxe de dico, tu parles du fonctionnement ? C'est un système de clé valeur :

                  dic = {} # dic vide
                  #{}
                  dic = {"cle" : "valeur"}
                  #{'cle': 'valeur'}
                  dic["cle2"] = "valeur2"
                  #{'cle2': 'valeur2', 'cle': 'valeur'}
                  dic["cle2"] = "valeur3"
                  #{'cle2': 'valeur3', 'cle': 'valeur'}





                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    20 mai 2015 à 18:06:12

                    Pas de doute, c'est soit pickle soit json, sachant qu'ici la partie efficacité est tout à fait inopportune... mais j'ai une principale considération pour le module json avec lequel j'ai trouvé une plus grande stabilité.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 mai 2015 à 18:48:05

                      L'idée est toujours de lire les données en mémoire, de les modifier si nécessaire et de tout ré-écrire (en écrasant les anciennes données).

                      #!/usr/bin/env python3
                      # -*- coding: utf-8 -*-
                      
                      import os, operator
                      
                      def load_scores(scores):
                          if not os.path.exists('scores.txt'):
                              return
                          with open('scores.txt', 'r') as f:
                              content = f.read()
                              for line in content.splitlines():
                                  name, score = line.split(';')
                                  scores.append((name, int(score)))
                      
                      def save_scores(scores):
                          with open('scores.txt', 'w') as f:
                              for name, score in scores:
                                  f.write('{};{}\n'.format(name, score))
                      
                      def show_scores(scores):
                          for name, score in scores:
                              print('{:20} : {:>}'.format(name, score))
                              
                              
                      scores = []
                      load_scores(scores)
                      show_scores(scores)
                      name = input("Entrez votre nom: ")
                      score = int(input("Quel est votre score: "))
                      scores.append((name, score))
                      scores = sorted(scores, key=operator.itemgetter(1), reverse=True)[:5]
                      
                      show_scores(scores)
                      save_scores(scores)
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 mai 2015 à 18:57:25

                        Merci pour ton programme Dan mais il dépasse mes capacité et j'ai essayé et il y a un message d'erreur

                         name = input("Entrez votre nom: ")

                          File "<string>", line 1, in <module>
                        NameError: name 'Vincent' is not defined

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 mai 2015 à 19:07:55

                          T'es sous Python 2. Remplace tous les input par raw_input.

                          -
                          Edité par Dan737 20 mai 2015 à 19:18:03

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 mai 2015 à 19:15:37

                            Oui j'utilise python xy en 2. et pygame .

                            Ok ok jvais modifier tout ça

                             Edit:

                            Génial !! Maintenant je doit réussir a mettre ça dans mon programme principal xP
                            Et c'est possible de ne pas recréer une ligne si le nom existe déjà ?

                            -
                            Edité par miniskateur77 20 mai 2015 à 19:20:35

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Aide sauvegarde

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown