Partage
  • Partager sur Facebook
  • Partager sur Twitter

[aide] Lecture fichier

lire une ligne précise

    23 août 2006 à 13:56:47

    Bonjour,

    je travail sur une amélioration du Sokoban et je stock mes niveau dans un fichier "niveau.lvl".

    Le premier niveau est stocker a la ligne 1, le second a la ligne 2 ...

    Le seul problème c'est que je n'arrive pas a dire a mon programme. " je veux le second niveau va lire la ligne 2"

    Soit il lit tout, ca m'interesse pas, soit il lit que la première, mais c'est monotone apres comme jeu.

    Merci de votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      23 août 2006 à 14:04:36

      ton fichier est structur comme ca ???
      niveau/n
      niveau/n
      niveau/n

      si oui tu place le curseur a (niveau * tailleniveau)+1 avec fseek
      niveau = niveau 1, 2,3 ...
      taille niveau= le nombre de lettre dans ton niveau...
      +1 pour le /n
      puis tu lis la ligne jusqu'au /n avec fgets
      • Partager sur Facebook
      • Partager sur Twitter
        23 août 2006 à 14:09:00

        Merchiii :p

        vais essayer ca tout de suite.

        => normalement problème resolu.

        Merci encore.
        • Partager sur Facebook
        • Partager sur Twitter
          23 août 2006 à 17:18:46

          Citation : T4g1

          tu places le curseur à (niveau * tailleniveau)+1 avec fseek


          Euh niveau * (tailleniveau + 1) plutôt...
          • Partager sur Facebook
          • Partager sur Twitter
            23 août 2006 à 17:21:56

            Ah oui, j'ai pas fait attention... Merci de la correction
            • Partager sur Facebook
            • Partager sur Twitter
              23 août 2006 à 17:28:37

              Ba j'ai encore des problèmes. J'ai fais ce que tu m'as conseillé, mais il refuse de charger d'autre niveau que le premier.
              int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR], int numeroNiveau)
              {
                  FILE* fichier = NULL;
                  char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
                  int i = 0, j = 0, deplacement = 0;

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

                  deplacement = numeroNiveau*( NB_BLOCS_HAUTEUR*NB_BLOCS_LARGEUR + 1);

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

                  for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                  {
                      for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
                      {
                          switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
                          {
                              case '0':
                                  niveau[j][i] = 0;
                                  break;
                              case '1':
                                  niveau[j][i] = 1;
                                  break;
                              case '2':
                                  niveau[j][i] = 2;
                                  break;
                              case '3':
                                  niveau[j][i] = 3;
                                  break;
                              case '4':
                                  niveau[j][i] = 4;
                                  break;
                              case '5':
                                  niveau[j][i] = 5;
                                  break;
                              case '6':
                                  niveau[j][i] = 6;
                                  break;
                          }
                      }
                  }

                  fclose(fichier);
                  return 1;
              }

              Ca c'est ma fonction qui charge le nievau. Je lui envoie le numéro du Niveau que je veux charger. Tant que ce normbre est 0 ca va, mais si il prend une autre valeur, le programme se lance, mais refuse d'afficher le niveau quand on lui demande.


                  int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
                  int numeroNiveau = 0;

              // Chargement du niveau
                  if (!chargerNiveau(carte, numeroNiveau))
                      exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau
              • Partager sur Facebook
              • Partager sur Twitter
                23 août 2006 à 17:31:33

                deplacement = numeroNiveau*( NB_BLOCS_HAUTEUR*NB_BLOCS_LARGEUR + 1);
                fseek(fichier, deplacement, SEEK_SET );

                fait plutot

                fseek(fichier, numeroNiveau*( NB_BLOCS_HAUTEUR*NB_BLOCS_LARGEUR + 1), SEEK_SET );
                • Partager sur Facebook
                • Partager sur Twitter
                  23 août 2006 à 17:34:41

                  Oki merci,

                  comme ca c'est plus propre mais il refuse quand meme d'ouvrir mon niveau 2.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 août 2006 à 17:35:24

                    t'est sur de la taille de tes niveaux ??? verifie ton fichier

                    As tu des erreur dans ta compilation ???
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 août 2006 à 17:43:00

                      je viens encore de vérifier mon fichier et le lvl2 a bien le meme nombre de caractere que le lvl1 ( 16*12 +1 exactement)

                      Si non il met aucune erreur a la compilation. Le problème arrive apres le lancement du programme.

                      Je le lance, il passe l'intro nickel puis quand j'appuye sur jouer il sembre vouloir afficher mon niveau un miliseconde puis revient sur le menu. Alors que quand je demande l'ouverture du lvl1 il l'ouvre normalement.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 août 2006 à 17:45:01

                        fais voir ton code apres
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 août 2006 à 17:51:17

                          voila toute ma fonction :


                          void jouer(SDL_Surface* ecran)
                          {
                              SDL_Surface *perso[4] = {NULL}; // 4 surfaces pour chacune des directions de perso
                              SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL;
                              SDL_Surface *persoActuel = NULL, *sol = NULL, *herbe = NULL;

                              SDL_Rect position, positionJoueur;
                              SDL_Event event;

                              int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
                              int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
                              int numeroNiveau = 1; // avec 0 c'est Ok avec 1 ca va pas

                              // Chargement des sprites (décors, personnage...)
                              mur = IMG_Load("mur.gif");
                              caisse = IMG_Load("caisse.jpg");
                              caisseOK = IMG_Load("caisse_ok.jpg");
                              objectif = IMG_Load("objectif.gif");
                              sol = IMG_Load("sol.gif");
                              herbe = IMG_Load("herbe.gif");
                              perso[SUD] = IMG_Load("perso_sud.png");
                              perso[OUEST] = IMG_Load("perso_ouest.png");
                              perso[NORD] = IMG_Load("perso_nord.png");
                              perso[EST] = IMG_Load("perso_est.png");

                              persoActuel = perso[SUD]; // perso sera dirigé vers le bas au départ

                              // Chargement du niveau
                              if (!chargerNiveau(carte, numeroNiveau))
                                  exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau

                              // Recherche de la position de perso au départ
                              for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
                              {
                                  for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
                                  {
                                      if (carte[i][j] == PERSO) // Si perso se trouve à cette position sur la carte
                                      {
                                          positionJoueur.x = i;
                                          positionJoueur.y = j;
                                          carte[i][j] = SOL;
                                      }
                                  }
                              }

                              // Activation de la répétition des touches
                              SDL_EnableKeyRepeat(100, 100);

                              while (continuer)
                              {
                                  SDL_WaitEvent(&event);
                          switch(event.type)
                          {
                              case SDL_QUIT:
                                  continuer = 0;
                                  break;
                              case SDL_KEYDOWN:
                                  switch(event.key.keysym.sym)
                                  {
                                      case SDLK_ESCAPE:
                                          continuer = 0;
                                          break;
                                      case SDLK_UP:
                                          persoActuel = perso[NORD];
                                          deplacerJoueur(carte, &positionJoueur, NORD);
                                          break;
                                      case SDLK_DOWN:
                                          persoActuel = perso[SUD];
                                          deplacerJoueur(carte, &positionJoueur, SUD);
                                          break;
                                      case SDLK_RIGHT:
                                          persoActuel = perso[EST];
                                          deplacerJoueur(carte, &positionJoueur, EST);
                                          break;
                                      case SDLK_LEFT:
                                          persoActuel = perso[OUEST];
                                          deplacerJoueur(carte, &positionJoueur, OUEST);
                                          break;
                                  }
                                  break;
                          }

                                  // Effacement de l'écran
                                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                                  // Placement des objets à l'écran
                                  objectifsRestants = 0;

                                  for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
                                  {
                                      for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
                                      {
                                          position.x = i * TAILLE_BLOC;
                                          position.y = j * TAILLE_BLOC;

                                          switch(carte[i][j])
                                          {
                                              case MUR:
                                                  SDL_BlitSurface(mur, NULL, ecran, &position);
                                                  break;
                                              case CAISSE:
                                                  SDL_BlitSurface(caisse, NULL, ecran, &position);
                                                  break;
                                              case CAISSE_OK:
                                                  SDL_BlitSurface(caisseOK, NULL, ecran, &position);
                                                  break;
                                              case SOL:
                                                  SDL_BlitSurface(sol, NULL, ecran, &position);
                                                  break;
                                              case HERBE:
                                                  SDL_BlitSurface(herbe, NULL, ecran, &position);
                                                  break;
                                              case OBJECTIF:
                                                  SDL_BlitSurface(objectif, NULL, ecran, &position);
                                                  objectifsRestants = 1;
                                                  break;
                                          }
                                      }
                                  }

                                  // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
                                  if (!objectifsRestants)
                                      continuer = 0;

                                  // On place le joueur à la bonne position
                                  position.x = positionJoueur.x * TAILLE_BLOC;
                                  position.y = positionJoueur.y * TAILLE_BLOC;
                                  SDL_BlitSurface(persoActuel, NULL, ecran, &position);



                                  SDL_Flip(ecran);
                              }

                              // Désactivation de la répétition des touches (remise à 0)
                              SDL_EnableKeyRepeat(0, 0);

                              // Libération des surfaces chargées
                              SDL_FreeSurface(mur);
                              SDL_FreeSurface(caisse);
                              SDL_FreeSurface(caisseOK);
                              SDL_FreeSurface(objectif);
                              SDL_FreeSurface(herbe);
                              SDL_FreeSurface(sol);
                              for (i = 0 ; i < 4 ; i++)
                                  SDL_FreeSurface(perso[i]);
                          }

                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 août 2006 à 18:07:54

                            je vois pas d'erreur, t'est sur qu'il y as des objectif??
                            • Partager sur Facebook
                            • Partager sur Twitter

                            [aide] Lecture fichier

                            × 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