Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sokoban

gestion des niveaux...

    20 avril 2006 à 23:12:07

    Bonsoir à toutes et à tous.
    Voilà je me suis pencher je le problème de la gestion des niveaux pour le sokoban.
    Voici mon code qui place le curseur en fonction des niveaux (enfin je crois, car j'ai pas l'impression qu'elle fonctionne :p )

    int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR], int lvl)

    {
        FILE* fichier=NULL;
        char ligneFichier[(NB_BLOCS_LARGEUR*NB_BLOCS_HAUTEUR)+1]={0};
        int i=0,j;
        char caractereLu=NULL;

        fichier=fopen("niveaux.lvl","r");
        if(fichier==NULL)
            return EXIT_FAILURE;

        while(caractereLu != EOF || i<lvl)
        {
        caractereLu=fgetc(fichier);
        if(caractereLu == '\n')
            i++;
        }

        fgets(ligneFichier, (NB_BLOCS_LARGEUR*NB_BLOCS_HAUTEUR)+1, fichier);


    Le problème doit venir de la boucle while, mais je n'arrive pas à faire en sorte que le curseur se déplace jusqu'à ce qu'il rencontre un saut de ligne.

    (pour information, dans le fichier niveaux.lvl chaque ligne correspond à un niveau)

    D'avance merci pour votre aide.

    @+
    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2006 à 23:21:43

      Utilise la fonction fseek :
      int fseek(FILE* pointeurSurFichier, long deplacement, int origine);

      C'est ce que j'ai fait, ça donne ça :
      int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR], int numNiveau)
      {
          FILE* fichier = NULL;
          char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
          int i = 0, j = 0;

          fichier = fopen("niveaux.lvl", "r");
          if (fichier == NULL)
              return 0;

          fseek(fichier, (NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 2) * (numNiveau - 1), SEEK_SET);

          fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);


      Et ça fonctionne parfaitement.
      • Partager sur Facebook
      • Partager sur Twitter
        21 avril 2006 à 1:04:12

        J'avais voulu l'utiliser mais je n'y était pas arrivé.

        fseek(fichier, (NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 2) * (numNiveau - 1), SEEK_SET);


        Mais j'avou que j'ai quelque petit problème à comprendre ton "calcul".
        Pourquoi rajouter 2, et pourquoi multiplier le tout par numNiveau-1 ??

        D'avance merci.
        • Partager sur Facebook
        • Partager sur Twitter
          21 avril 2006 à 7:25:40

          Si vous voulez faire ça, faut ouvrir le fichier en mode binaire.
          • Partager sur Facebook
          • Partager sur Twitter
            21 avril 2006 à 11:12:07

            Bonjour,
            je crois que le problème vient de là :

                while(caractereLu != EOF || i<lvl)


            Avec un 'ou', la boucle va continuer jusqu'à la fin du fichier car caractereLu sera égal à EOF qu(à la fin.
            Par contre avec un 'et', il faut que les deux conditions soient justes :


                while(caractereLu != EOF && i<lvl)

            Normalement, la boucle devrait fonctionner.
            J'espère t'avoir aidé.
            • Partager sur Facebook
            • Partager sur Twitter

            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