Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] impossible de sauvegarder PLUISIEURS niveau au jeu mario sokoban.

    26 avril 2006 à 21:23:30

    Bonjour tt le monde,
    J'ai un problème, en mode éditer, j'arrive a me déplacer entre 20 niveaux différents mais quand j'essai de sauvegarder un niveau ca ne marche pas :colere2: (j'arrive à sauvegarder que le premier niveau pas les 19 autre)Voilà le code de ma fonction sauvegarder :
    int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR], long choixLvl)
    {
            FILE* fichier = NULL;
            long lvlChoisi = 0;
        int i = 0, j = 0;
            int caractereLu = 0;

        fichier = fopen("niveaux.lvl", "r+");

        if (fichier == NULL)
            return 0;

            lvlChoisi = choixLvl;
            rewind(fichier);

            while (lvlChoisi > 0)
        {
            caractereLu = fgetc(fichier);
            if (caractereLu == '\n')
                lvlChoisi--;
        }

        for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
            {
                fprintf(fichier, "%d", niveau[j][i]);
            }
        }

        fclose(fichier);
        return 1;
    }

    Merci de votre aide...
    • Partager sur Facebook
    • Partager sur Twitter
      27 avril 2006 à 21:21:12

      J'ai pas tout regardé, mais j'ai l'impression qu'à chaque fois, tu écris en début de fichier, non ?
      • Partager sur Facebook
      • Partager sur Twitter
        27 avril 2006 à 21:45:42

        Non car si j'écrivais au début du fichier à chaque fois, quand je sauvegarderais le lvl 2, j' ecraserait le lvl 1, et ce n'est pas le cas.
        Et de toute facon ce code :

            while (lvlChoisi > 0)
            {
                caractereLu = fgetc(fichier);
                if (caractereLu == '\n')
                    lvlChoisi--;
            }

        Permet de placer le curseur au début de la ligne à écrire.
        J'ai créé un foncion changerLvl (quand on veut changer de niveau logique ^^ )qui marche de la meme façon jusque à la double boucle for, et qui fonctionne nickel...

        Pour revenir à cette fonction, on dirai que quand je suis au niveau + que 0 elle ne sauvegarde pas, en gros j'arrive a sauvegarder que le niveau 0 (le premier) pas les 19 autres...
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          27 avril 2006 à 23:31:14

          salut,

          A quoi sert
          lvlChoisi = choixLvl;
                  rewind(fichier);


          Tu vient d'ouvrir le fichier donc t'as pas besoin de faire un rewind.
          et pourquoi ne pas utiliser directement choixLvl a la place de lvlChoisi ?

          Sinon moi je suis bloqué au même endroit que toi, je peut sauvgarder le niveau 1 mais pas les autres.

          j'te montre ma fonction, peut-être qu'en la voyant sa va te faire penser à une autre idée:

          int sauvegarder_niveau(int map[][NBR_BLOC_HAUTEUR], int niveau)
          {
              FILE* fichier = NULL;

              int i = 0, c = 0;
              char test = 0;

              fichier = fopen("niveaux.lvl", "r+");

              if ( fichier == NULL)
                  return 0;


              if ( niveau )
              {

                  do
                  {
                      test = fgetc(fichier);


                      if ( test == '\n' )
                          i++;

                  } while ( i != niveau );
              }


              for ( i = 0; i < NBR_BLOC_HAUTEUR; i++)
              {
                  for ( c = 0; c < NBR_BLOC_LARGEUR; c++ )
                  {
                      fprintf(fichier, "%d", map[c][i]);
                  }
              }

              fclose(fichier);
              return 1;
          }


          En tout cas je continu de chercher, j'te prévient si je trouve quelque chose !
          • Partager sur Facebook
          • Partager sur Twitter
            27 avril 2006 à 23:36:09

            C vrai le rewind(fichier) ne me sert a rien mais c'est par précaution, par contre pour le "lvlChoisi = choixLvl;" c'est parceke après je fais lvlChoisi--; Vuque je n'est pas envie de mofifier choixLvl car je men ressert dans ma fonction éditer pour choisir le lvl que je veu éditer (change de lvl).....

            EDIT : J'ai fais plusieurs test à l'aide de "stderr", je peu deja assurer que mon problème ne vient pas de la position de mon curseur dans le fichier...
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              27 avril 2006 à 23:47:00

              normalement comme choixLvl n'est pas un pointeur il n'y a pas de raison pour qu'il change de valeur or de la fonction ;)
              • Partager sur Facebook
              • Partager sur Twitter
                27 avril 2006 à 23:51:44

                Oui pas grave ça donne le meme resultat de toute facon ;)
                EDIT : On dirai que quand c'est un autre lvl que le 0 (le premier) la fonction sauvegarderLvl ne marche pas ou n'est pas appeller, pourtant elle renvoie bien 1 à la fin.... o_O
                REDIT : Je viens de refaire un test avec stderr, je simule un enregistrement dedans, et ca marche il écrit bien le bon code modifié, contrairement a niveau.lvl...
                • Partager sur Facebook
                • Partager sur Twitter
                  28 avril 2006 à 9:12:42

                  Comme on se retrouve ! ^^
                  Moi je n'y suis toujours pas arrivé non plus. Je vais essayer de faire ça en binaire (si c'est pas trop compliqué).

                  => ici

                  Si j'y arrive, je vous tien au courrant. ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 avril 2006 à 12:49:15

                    Moi c'est bon ça marche, en faite j'ai fait un niveau par fichier... Donc j'ai du changer toute mes fonction pour l'adapter ;)
                    Je reste persuader qu'il y a une solution a avec un seul fichier .lvl...
                    EDIT : PROBLEME RESOLU
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 avril 2006 à 14:46:16

                      Moi, quand je lisais dans le fichier, je ne pouvais plus écrire... Donc j'ai du faire autrement.
                      Voilà si ça t'intéresse toujours :
                      int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR], int numeroNiveau, char fichierNiveaux, int nb_niveaux)
                      {
                           FILE* fichier = NULL;
                          int i = 0, j = 0;
                          char ligneFichier[nb_niveaux][NB_BLOCS_HAUTEUR*NB_BLOCS_LARGEUR+2];
                             
                          fichier = fopen("niveaux.lvl");
                          if (fichier == NULL) // si l'ouverture a échoué
                              return 0;

                              //J'enregistre tout les lignes donc les niveaux dans mon tableau
                          while (i < nb_niveaux)
                          {
                              fgets(ligneFichier[i], (NB_BLOCS_HAUTEUR*NB_BLOCS_LARGEUR+2), fichier);
                              i++;
                          }

                              fclose(fichier);

                             
                              fichier = fopen("niveaux.lvl");
                          if (fichier == NULL) // si l'ouverture a échoué
                              return 0;

                              //Je remplace par le niveaux modifié au bon endroit
                          for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                          {
                              for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
                              {
                                  switch(niveau[j][i])
                                  {
                                      case 0:
                                          ligneFichier[numeroNiveau-1][(i * NB_BLOCS_LARGEUR) + j] = '0';
                                          break;

                                      case 1:
                                          ligneFichier[numeroNiveau-1][(i * NB_BLOCS_LARGEUR) + j] = '1';
                                          break;

                                      case 2:
                                         ligneFichier[numeroNiveau-1][(i * NB_BLOCS_LARGEUR) + j] = '2';
                                          break;

                                      case 3:
                                         ligneFichier[numeroNiveau-1][(i * NB_BLOCS_LARGEUR) + j] = '3';
                                          break;

                                      case 4:
                                         ligneFichier[numeroNiveau-1][(i * NB_BLOCS_LARGEUR) + j] = '4';
                                          break;

                                      case 5:
                                         ligneFichier[numeroNiveau-1][(i * NB_BLOCS_LARGEUR) + j] = '5';
                                          break;

                                  }

                              }
                          }
                              //je rajoute un retour à la ligne
                          ligneFichier[numeroNiveau-1][NB_BLOCS_HAUTEUR*NB_BLOCS_LARGEUR+1] == '\n';
                              //et j'enregistre le tout
                          for(i = 0 ; i < nb_niveaux ; i++)
                          {
                              fputs(ligneFichier[i], fichier);
                          }
                          fclose(fichier);
                          return 1;
                      }

                      La fonction n'est pas parfaite mais elle fonctionne.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 avril 2006 à 15:10:30

                        Ok oui ca marche aussi voila la mienne :
                        int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR], long choixLvl)
                        {
                                FILE* fichier = NULL;
                                long lvlChoisi = 0;
                            int i = 0, j = 0;
                                int caractereLu = 0;

                            switch (choixLvl)
                                {
                                        case 0:
                                                fichier = fopen("niveau0.lvl", "w");
                                                break;
                                        case 1:
                                                fichier = fopen("niveau1.lvl", "w");
                                                break;
                                        case 2:
                                                fichier = fopen("niveau2.lvl", "w");
                                                break;
                                        case 3:
                                                fichier = fopen("niveau3.lvl", "w");
                                                break;
                                        case 4:
                                                fichier = fopen("niveau4.lvl", "w");
                                                break;
                                        case 5:
                                                fichier = fopen("niveau5.lvl", "w");
                                                break;
                                        case 6:
                                                fichier = fopen("niveau6.lvl", "w");
                                                break;
                                        case 7:
                                                fichier = fopen("niveau7.lvl", "w");
                                                break;
                                        case 8:
                                                fichier = fopen("niveau8.lvl", "w");
                                                break;
                                        case 9:
                                                fichier = fopen("niveau9.lvl", "w");
                                                break;
                                        case 10:
                                                fichier = fopen("niveau10.lvl", "w");
                                                break;
                                        case 11:
                                                fichier = fopen("niveau11.lvl", "w");
                                                break;
                                        case 12:
                                                fichier = fopen("niveau12.lvl", "w");
                                                break;
                                        case 13:
                                                fichier = fopen("niveau13.lvl", "w");
                                                break;
                                        case 14:
                                                fichier = fopen("niveau14.lvl", "w");
                                                break;
                                        case 15:
                                                fichier = fopen("niveau15.lvl", "w");
                                                break;
                                        case 16:
                                                fichier = fopen("niveau16.lvl", "w");
                                                break;
                                        case 17:
                                                fichier = fopen("niveau17.lvl", "w");
                                                break;
                                        case 18:
                                                fichier = fopen("niveau18.lvl", "w");
                                                break;
                                        case 19:
                                                fichier = fopen("niveau19.lvl", "w");
                                                break;
                                }

                            if (fichier == NULL)
                                return 0;

                            for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                            {
                                for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
                                {
                                    fprintf(fichier, "%d", niveau[j][i]);
                                }
                            }
                            fclose(fichier);
                            return 1;
                        }

                        Un peu long mais fonctionne nickel ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          28 avril 2006 à 15:42:41

                          Le problème avec ta fonction c'est que si tu veut rajouter de niveaux t'es obligé de modifier le code et de tout recompiler.

                          Edit: à moins que tu créer un dossier "niveaux" et que tu comptes le nombre de fichier qu'il y a dedans après tu fais 2/3 tites fonctions pi le tour est jouer. M'enfin c'est s'embéter pour rien sur un aussi p'ti jeu ^^
                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 avril 2006 à 16:49:31

                            tomtom91, je trouve ton truc assez laid... J'aurais fait une boucle...

                            for( i = 0; i < 20; i++){
                                if(truc = machin[i]){
                                   fichierAOuvrir = strcat(niveau, i);
                                   fopen(fichierAOuvrir, "w");
                                 }
                            }


                            Ma fonction n'est sûrement pas exacte. J'ai pas bien regardé strcat. Mais un truc qui ressemble, quoi.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 avril 2006 à 17:02:59

                              Tu sait il y a pluisieurs façon de codé...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                28 avril 2006 à 17:08:06

                                Oui, mais la programmation sert aussi à se faciliter la vie. Pas la peine de faire 100 tests si tu as 100 niveaux quand une simple boucle te permet de faire la même chose, quelque soit le nombre de niveaux ;)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 avril 2006 à 17:43:00

                                  OK, je sais je pourrais aller plus vite mais kan j'ai fais ma fonction c'est le premier truc ki mais passer par la tete...
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  [SDL] impossible de sauvegarder PLUISIEURS niveau au jeu mario sokoban.

                                  × 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