Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les fichiers

remplacer un caractère par un autre.

    13 juin 2006 à 21:41:56

    Bonjour à tous !
    J'ai un problème (encore o_O , et oui :p ) dans le jeu que je suis en train de créer je veux que quand j'ai tué un adversaire celui-ci disparaisse de la carte.
    J'ai donc créer une fonction editer_niveau, qui doit editer la carte pour que l'adversaire qui est mort n'y apparaisse plus.
    Je me position à l'endroit où ce trouve le chiffre désignant le-dit adversaire grâce à un fseek, seulement maintenant je voudrait savoir comment effacer le chiffre positionné juste après le curseur et écrire celui symbolisant le vide à la place.
    Je ne vois pas quelle fonction utilisé pour effacer seulement un caractère ...
    En existe-t-il une ?
    Je vous remercie par avance de vos réponse et vous souhaite une bonne soirée.
    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2006 à 21:45:28

      Citation : Dark-Side

      Je me position à l'endroit où ce trouve le chiffre désignant le-dit adversaire grâce à un fseek, seulement maintenant je voudrait savoir comment effacer le chiffre positionné juste après le curseur et écrire celui symbolisant le vide à la place.
      Je ne vois pas quelle fonction utilisé pour effacer seulement un caractère ...
      En existe-t-il une ?
      Je vous remercie par avance de vos réponse et vous souhaite une bonne soirée.


      Pour remplacer un caractère par un autre :
      • ouvrir en "r+"
      • se positionner avec fseek() (il vaut mieux être sûr de son coup)
      • ecrire un caractère avec fputc().
      • fermer

      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        13 juin 2006 à 21:49:22

        J'ai bien ouvert en r+, je me suis positionné avec fseek (je suis sur de moi), j'ai bien compris qu'il faut utiliser fputc() mais comment faire pour effacer un seul caractère et pas tout le fichier ? :(
        Merci d'avance de votre aide.
        • Partager sur Facebook
        • Partager sur Twitter
          13 juin 2006 à 21:58:13

          Je vais dire une bêtise, mais l'utilisation de fseek n'est-elle pas à 100 % sûre uniquement dans un fichier binaire (soit, sous UNIX, d'un fichier texte) ?

          Jusqu'à présent j'ai préféré utiliser une fonction telle que :

          void fgo(FILE* fp, char cible)
          {
              char c;
              while ((c = fgetc(fp)) != cible)
                  ;
          }


          Ai-je eu tort ? :euh:
          • Partager sur Facebook
          • Partager sur Twitter
            14 juin 2006 à 8:26:20

            Citation : mleg

            Je vais dire une bêtise, mais l'utilisation de fseek n'est-elle pas à 100 % sûre uniquement dans un fichier binaire (soit, sous UNIX, d'un fichier texte) ?

            Jusqu'à présent j'ai préféré utiliser une fonction telle que :

            void fgo(FILE* fp, char cible)
            {
                char c;
                while ((c = fgetc(fp)) != cible)
                    ;
            }



            Ai-je eu tort ? :euh:



            Non tu as surement raison mais bon ...
            Et est-ce que tu sais comment effacer un unique caractère ?
            Merci d'avance.
            • Partager sur Facebook
            • Partager sur Twitter
              14 juin 2006 à 9:28:26

              Citation : Dark-Side

              J'ai bien ouvert en r+, je me suis positionné avec fseek (je suis sur de moi), j'ai bien compris qu'il faut utiliser fputc() mais comment faire pour effacer un seul caractère et pas tout le fichier ? :(
              Merci d'avance de votre aide.


              Comme je te l'ai dit, on ne peut que remplacer un caractère existant par un autre.
              Sinon, pour le mode, oui, fseek() est effectivement plus sûr en mode binaire ("r+b").

              Soit un ficher composé de 3 bytes. Les 2 premiers sont fixes et valent 0xAA et 0x55. Le troisième peut prendre la valeur 0 à 255.

              #include <stdio.h>

              static void put_file (char const *fname, int value)
              {
                 if (value < 256)
                 {
                    FILE *fp = fopen (fname, "r+b");
                    if (fp == NULL)
                    {
                       fp = fopen (fname, "wb");
                       if (fp != NULL)
                       {
                          fputc(0xAA, fp);
                          fputc(0x55, fp);
                          fputc(value, fp);
                          fclose (fp);
                          printf ("AA55 %d written\n", value);
                       }
                       else
                       {
                          perror (fname);
                       }
                    }
                    else
                    {
                       if (fseek (fp, 2, SEEK_SET) == 0)
                       {
                          fputc(value, fp);
                          printf ("%d written\n", value);
                       }
                       else
                       {
                          perror (fname);
                       }
                       fclose (fp);
                    }
                 }
                 else
                 {
                    fprintf (stderr, "value is too large\n");
                 }
              }

              static int get_file (char const *fname, int *p_value)
              {
                 int err = 0;
                 FILE *fp = fopen (fname, "rb");
                 if (fp != NULL)
                 {
                    if (fgetc(fp) == 0xAA
                            && fgetc(fp) == 0x55)
                    {
                       rewind (fp);
                       if (fseek (fp, 2, SEEK_SET) == 0)
                       {
                          int value = fgetc(fp);
                          printf ("%d read\n", value);
                          if (p_value != NULL)
                          {
                             *p_value = value;
                          }
                       }
                       else
                       {
                          perror (fname);
                          err = 1;
                       }
                    }
                    else
                    {
                       fprintf (stderr, "file signature error\n");
                       err = 1;
                    }
                    fclose (fp);
                 }
                 else
                 {
                    perror (fname);
                    err = 1;
                 }
                 return err;
              }

              int main()
              {
              #define FNAME "test.dat"
                 {
                    int x = 123;
                    put_file (FNAME, x);
                 }

                 {
                    int x;
                    int err = get_file (FNAME, &x);
                    if (!err)
                    {
                       printf ("x = %d\n", x);
                    }
                 }

                 {
                    int x = 254;
                    put_file (FNAME, x);
                 }

                 {
                    int x;
                    int err = get_file (FNAME, &x);
                    if (!err)
                    {
                       printf ("x = %d\n", x);
                    }
                 }

                 return 0;
              }


              123 written
              123 read
              x = 123
              254 written
              254 read
              x = 254

              Press ENTER to continue.
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                14 juin 2006 à 12:07:39

                Donc je n'ai aucun moyen de modifier ma carte ?
                Bon je vais réflechir à un autre moyen ...
                Merci quand même ... :(

                EDIT : après reflexion j'ai fait ça :
                int editer_niveau(int largeur, int hauteur)
                {
                    FILE* fichier = NULL;
                    int i = 0, j = 0;
                    int niveau[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};

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

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

                    fclose(fichier);
                    return 1;
                }


                Seulement voila : ça ne marche pas ...
                En faite ça m'efface tout !
                La carte entière est vide !
                Comment puis je faire pour editer ma carte ?
                Merci d'avance.

                EDIT 2:
                Voici ce que je trouve dans le fichier stderr :
                Fatal signal: Segmentation Fault (SDL Parachute Deployed)
                Voila donc est-ce que quelqu'un sait d'où peu venir l'erreur ?
                • Partager sur Facebook
                • Partager sur Twitter
                  14 juin 2006 à 13:50:31

                  Citation : Dark-Side

                  Donc je n'ai aucun moyen de modifier ma carte ?


                  J'en était résté à un fichier... Il y a 2 modifications possible :
                  • Ajouter en fin de fichier ("a")
                  • Remplacer un ou des bytes ("r+b")

                  Sinon, pour insérer, raccourcir, etc., il fait créer un nouveau fichier avec les données de l'ancien et les nouvelles données ...

                  Citation : Pas de titre


                  Bon je vais réflechir à un autre moyen ...
                  Merci quand même ... :(

                  EDIT : après reflexion j'ai fait ça :

                  int editer_niveau(int largeur, int hauteur)
                  {
                  <...>
                      fichier = fopen("niveaux.lvl", "w");
                  <...>

                  }



                  Seulement voila : ça ne marche pas ...
                  En faite ça m'efface tout !
                  La carte entière est vide !
                  Comment puis je faire pour editer ma carte ?
                  Merci d'avance.


                  C'est sûr que "w" ça crée un nouveau fichier...
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    14 juin 2006 à 14:11:50

                    Merci ça a marché en r+ !
                    Enfin marché ma carte n'est pas effacé seulement le fichier se ferme à la fin du combat :colere2:
                    Je vais vous montrer mon code j'espère que vous pourrez m'aider :

                    jeu.c


                    while (continuer)
                        {
                            if (carte[position_perso.x + 1][position_perso.y] == DC ||
                            carte[position_perso.x - 1][position_perso.y] == DC ||
                            carte[position_perso.x][position_perso.y - 1] == DC ||
                            carte[position_perso.x][position_perso.y + 1] == DC)
                            {
                                droide.type_d_adversaire = DC;
                                combat(ecran, &droide, &joueur);
                                if (joueur.point_de_vie <= 0)
                                {
                                    // game over
                                }
                                else
                                {
                                    if (carte[position_perso.x + 1][position_perso.y] == DC)
                                    {
                                        largeur = position.x + 1;
                                        hauteur = position.y;
                                    }
                                    else if (carte[position_perso.x - 1][position_perso.y] == DC)
                                    {
                                        largeur = position.x - 1;
                                        hauteur = position.y;
                                    }
                                    else if (carte[position_perso.x][position_perso.y + 1] == DC)
                                    {
                                        largeur = position.x;
                                        hauteur = position.y + 1;
                                    }
                                    else if (carte[position_perso.x][position_perso.y - 1] == DC)
                                    {
                                        largeur = position.x;
                                        hauteur = position.y - 1;
                                    }
                                    editer_niveau(largeur, hauteur);
                                    chargerNiveau(carte);// Chargement du niveau
                                    if (!chargerNiveau(carte))
                                        exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau


                                    /* ////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\ */

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

                            }

                            if (carte[position_perso.x + 1][position_perso.y] == DD ||
                            carte[position_perso.x - 1][position_perso.y] == DD ||
                            carte[position_perso.x][position_perso.y - 1] == DD ||
                            carte[position_perso.x][position_perso.y + 1] == DD)
                            {
                                droide.type_d_adversaire = DD;
                                combat(ecran, &droide, &joueur);
                                if (joueur.point_de_vie <= 0)
                                {
                                    // game over
                                }
                                else
                                {
                                    if (carte[position_perso.x + 1][position_perso.y] == DD)
                                    {
                                        largeur = position.x + 1;
                                        hauteur = position.y;
                                    }
                                    else if (carte[position_perso.x - 1][position_perso.y] == DD)
                                    {
                                        largeur = position.x - 1;
                                        hauteur = position.y;
                                    }
                                    else if (carte[position_perso.x][position_perso.y + 1] == DD)
                                    {
                                        largeur = position.x;
                                        hauteur = position.y + 1;
                                    }
                                    else if (carte[position_perso.x][position_perso.y - 1] == DD)
                                    {
                                        largeur = position.x;
                                        hauteur = position.y - 1;
                                    }
                                    editer_niveau(largeur, hauteur);
                                    chargerNiveau(carte);// Chargement du niveau
                                    if (!chargerNiveau(carte))
                                        exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau


                                    /* ////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\ */

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

                            if (carte[position_perso.x + 1][position_perso.y] == SDC ||
                            carte[position_perso.x - 1][position_perso.y] == SDC ||
                            carte[position_perso.x][position_perso.y - 1] == SDC ||
                            carte[position_perso.x][position_perso.y + 1] == SDC)
                            {
                                droide.type_d_adversaire = SDC;
                                combat(ecran, &droide, &joueur);
                                if (joueur.point_de_vie <= 0)
                                {
                                    // game over
                                }
                                else
                                {
                                    if (carte[position_perso.x + 1][position_perso.y] == SDC)
                                    {
                                        largeur = position.x + 1;
                                        hauteur = position.y;
                                    }
                                    else if (carte[position_perso.x - 1][position_perso.y] == SDC)
                                    {
                                        largeur = position.x - 1;
                                        hauteur = position.y;
                                    }
                                    else if (carte[position_perso.x][position_perso.y + 1] == SDC)
                                    {
                                        largeur = position.x;
                                        hauteur = position.y + 1;
                                    }
                                    else if (carte[position_perso.x][position_perso.y - 1] == SDC)
                                    {
                                        largeur = position.x;
                                        hauteur = position.y - 1;
                                    }
                                    editer_niveau(largeur, hauteur);
                                    chargerNiveau(carte);// Chargement du niveau
                                    if (!chargerNiveau(carte))
                                        exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau


                                    /* ////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\ */

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

                            SDL_WaitEvent(&event);
                            switch(event.type)
                            {
                                case SDL_QUIT:
                                    continuer = 0;
                                    break;
                                case SDL_KEYUP:
                                    switch (event.key.keysym.sym)
                                    {
                                        case SDLK_ESCAPE:
                                            continuer = 0;
                                            break;
                                    }
                                    break;
                                case SDL_KEYDOWN:
                                    switch (event.key.keysym.sym)
                                    {
                                        case SDLK_UP:
                                            perso= clone[HAUT];
                                            deplacer_joueur(carte, &position_perso, HAUT);
                                            break;
                                        case SDLK_DOWN:
                                            perso= clone[BAS];
                                            deplacer_joueur(carte, &position_perso, BAS);
                                            break;
                                        case SDLK_LEFT:
                                            perso= clone[GAUCHE];
                                            deplacer_joueur(carte, &position_perso, GAUCHE);
                                            break;
                                        case SDLK_RIGHT:
                                            perso= clone[DROITE];
                                            deplacer_joueur(carte, &position_perso, DROITE);
                                            break;
                                    }
                                    break;
                            }

                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 188, 188, 188));

                            // Placement des objets à l'écran
                            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 DC:
                                            SDL_BlitSurface(dc, NULL, ecran, &position);
                                            break;
                                        case DD:
                                            SDL_BlitSurface(dd, NULL, ecran, &position);
                                            break;
                                        case CLONE:
                                            SDL_BlitSurface(clone[BAS], NULL, ecran, &position);
                                            break;
                                        case SDC:
                                            SDL_BlitSurface(sdc, NULL, ecran, &position);
                                    }
                                }
                            }

                            // On place le joueur à la bonne position
                            position.x = position_perso.x * TAILLE_BLOC;
                            position.y = position_perso.y * TAILLE_BLOC;
                            SDL_BlitSurface(perso, NULL, ecran, &position);
                            SDL_Flip(ecran);
                        }


                    J'ai aussi essayé en w+ et là encore une fois la carte est vide à la fin du combat !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 juin 2006 à 12:35:19

                      Quelqu'un sait d'où ça peut venir ??? :euh:
                      Parce que moi je suis perdu :'(
                      Merci d'avance.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 juin 2006 à 16:01:51

                        Je sais je n'avais pas récupéré les informations de l'ancien fichier !
                        Voilà maintenant ma fonction editer_niveau :
                        int editer_niveau(int largeur, int hauteur)
                        {
                            FILE* fichier = NULL;
                            char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
                            int i = 0, j = 0;
                            int niveau[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};

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

                            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++)
                                {

                                    if (niveau[j][i] == niveau[largeur][hauteur])
                                    {
                                        fprintf(fichier, "VIDE", niveau[j][i]);
                                    }
                                    else
                                    {
                                        fprintf(fichier, "%d", niveau[j][i]);
                                    }
                                }
                            }

                            fclose(fichier);
                            return 1;
                        }


                        Malheureusement la carte n'est toujours pas modifié :'(
                        Pouvez vous m'aider ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 juin 2006 à 17:19:05

                          Citation : Dark-Side

                          Je sais je n'avais pas récupéré les informations de l'ancien fichier !
                          Voilà maintenant ma fonction editer_niveau :

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

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

                              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++)
                                  {

                                      if (niveau[j][i] == niveau[largeur][hauteur])
                                      {
                                          fprintf(fichier, "VIDE", niveau[j][i]);
                                      }
                                      else
                                      {
                                          fprintf(fichier, "%d", niveau[j][i]);
                                      }
                                  }
                              }

                              fclose(fichier);
                              return 1;
                          }



                          Malheureusement la carte n'est toujours pas modifié :'(
                          Pouvez vous m'aider ?


                          Il me semble avoir déjà expliqué que "r+b" ne fonctionnait réellement qu'en mode binaire avec un fichier dont on connait les données byte par byte.

                          Tout le contraire du mode texte que tu utilises. Dans ton cas, le plus simple est de construire un nouveau fichier et de jouer avec remove() rename()...

                          A part ça, il faut peut être un coup de rewind() pour ecrire par dessus ce qu'il y avait déjà...
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                            16 juin 2006 à 17:38:06

                            Rewind() ?
                            Désolé mais je ne connais pas (ce n'est pas dans les cours de m@téo), pourrais tu me donner un cours exemple s'il te plait ?
                            Merci (beaucoup) d'avance !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 juin 2006 à 17:51:58

                              rewind est dans le cours de M@teo ! (revenir au début du fichier si mes osuvenir sont bon !)

                              Sinon tu enregistre tous les caratères dans un tableau de char (donc une chaine :p ) et tu cherche le caractères de ton ennemi et tu fais un remplacment comme dans n'importe quel tableau ensuite tu 'recolle' le tableau dans le fichier (préalablement vidé ! "w+" je crois !)

                              J'espère n'avoir pas dis de conneries mais sur le plan de la logique c'est une méthode qui marche !
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 juin 2006 à 18:09:04

                                Ah oui pour rewind c'est juste désolé.
                                Sinon pierre le problème c'est que j'ai plusieur fois un ennemi du même type (un droide de combat) ...
                                Je ne peux donc pas faire ce que tu as dit :'(
                                Voila si quelqu'un a une autre idée ...

                                2e EDIT: encore une modification :
                                int editer_niveau(int largeur, int hauteur)
                                {
                                    FILE* fichier = NULL;
                                    int i = 0, j = 0;
                                    char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
                                    int copie_ligne_fichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
                                    int niveau[NB_BLOCS_LARGEUR ][NB_BLOCS_HAUTEUR] = {0};

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

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

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

                                    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':
                                                    copie_ligne_fichier[j*i] = 0;
                                                    break;
                                                case '1':
                                                    copie_ligne_fichier[j*i] = 1;
                                                    break;
                                                case '2':
                                                    copie_ligne_fichier[j*i] = 2;
                                                    break;
                                                case '3':
                                                    copie_ligne_fichier[j*i] = 3;
                                                    break;
                                                case '4':
                                                    copie_ligne_fichier[j*i] = 4;
                                                    break;
                                                case '5':
                                                    copie_ligne_fichier[j*i] = 5;
                                                    break;
                                            }

                                            if (niveau[i][j] == niveau[hauteur][largeur])
                                            {
                                                fprintf(fichier, "VIDE", copie_ligne_fichier[hauteur*largeur]);
                                            }
                                            else
                                            {
                                                fprintf(fichier, "%d", copie_ligne_fichier[j*i]);
                                            }
                                        }
                                    }

                                    fclose(fichier);
                                    return 1;
                                }

                                Seulement ce qui est bizarre, quand je me bat contre un SDC, la carte se recharge sans modification, quand je combat contre un Dc, le programme se ferme et quand je le rouvre la carte est effacée :'(
                                Voila le code peut-etre que vous releverez une erreur.

                                jeu.c


                                if (carte[position_perso.x + 1][position_perso.y] == DC ||
                                        carte[position_perso.x - 1][position_perso.y] == DC ||
                                        carte[position_perso.x][position_perso.y - 1] == DC ||
                                        carte[position_perso.x][position_perso.y + 1] == DC)
                                        {
                                            droide.type_d_adversaire = DC;
                                            combat(ecran, &droide, &joueur);
                                            if (joueur.point_de_vie <= 0)
                                            {
                                                // game over
                                            }
                                            else
                                            {
                                                if (carte[position_perso.x + 1][position_perso.y] == DC)
                                                {
                                                    largeur = position.x + 1;
                                                    hauteur = position.y;
                                                }
                                                else if (carte[position_perso.x - 1][position_perso.y] == DC)
                                                {
                                                    largeur = position.x - 1;
                                                    hauteur = position.y;
                                                }
                                                else if (carte[position_perso.x][position_perso.y + 1] == DC)
                                                {
                                                    largeur = position.x;
                                                    hauteur = position.y + 1;
                                                }
                                                else if (carte[position_perso.x][position_perso.y - 1] == DC)
                                                {
                                                    largeur = position.x;
                                                    hauteur = position.y - 1;
                                                }
                                                editer_niveau(largeur, hauteur);
                                                if (!editer_niveau(largeur, hauteur))
                                                    exit(EXIT_FAILURE);

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


                                                /* ////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\ */

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

                                        }

                                        if (carte[position_perso.x + 1][position_perso.y] == DD ||
                                        carte[position_perso.x - 1][position_perso.y] == DD ||
                                        carte[position_perso.x][position_perso.y - 1] == DD ||
                                        carte[position_perso.x][position_perso.y + 1] == DD)
                                        {
                                            droide.type_d_adversaire = DD;
                                            combat(ecran, &droide, &joueur);
                                            if (joueur.point_de_vie <= 0)
                                            {
                                                // game over
                                            }
                                            else
                                            {
                                                if (carte[position_perso.x + 1][position_perso.y] == DD)
                                                {
                                                    largeur = position.x + 1;
                                                    hauteur = position.y;
                                                }
                                                else if (carte[position_perso.x - 1][position_perso.y] == DD)
                                                {
                                                    largeur = position.x - 1;
                                                    hauteur = position.y;
                                                }
                                                else if (carte[position_perso.x][position_perso.y + 1] == DD)
                                                {
                                                    largeur = position.x;
                                                    hauteur = position.y + 1;
                                                }
                                                else if (carte[position_perso.x][position_perso.y - 1] == DD)
                                                {
                                                    largeur = position.x;
                                                    hauteur = position.y - 1;
                                                }
                                                editer_niveau(largeur, hauteur);
                                                if (!editer_niveau(largeur, hauteur))
                                                    exit(EXIT_FAILURE);

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


                                                /* ////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\ */

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

                                        if (carte[position_perso.x + 1][position_perso.y] == SDC ||
                                        carte[position_perso.x - 1][position_perso.y] == SDC ||
                                        carte[position_perso.x][position_perso.y - 1] == SDC ||
                                        carte[position_perso.x][position_perso.y + 1] == SDC)
                                        {
                                            droide.type_d_adversaire = SDC;
                                            combat(ecran, &droide, &joueur);
                                            if (joueur.point_de_vie <= 0)
                                            {
                                                // game over
                                            }
                                            else
                                            {
                                                if (carte[position_perso.x + 1][position_perso.y] == SDC)
                                                {
                                                    largeur = position.x + 1;
                                                    hauteur = position.y;
                                                }
                                                else if (carte[position_perso.x - 1][position_perso.y] == SDC)
                                                {
                                                    largeur = position.x - 1;
                                                    hauteur = position.y;
                                                }
                                                else if (carte[position_perso.x][position_perso.y + 1] == SDC)
                                                {
                                                    largeur = position.x;
                                                    hauteur = position.y + 1;
                                                }
                                                else if (carte[position_perso.x][position_perso.y - 1] == SDC)
                                                {
                                                    largeur = position.x;
                                                    hauteur = position.y - 1;
                                                }
                                                editer_niveau(largeur, hauteur);
                                                if (!editer_niveau(largeur, hauteur))
                                                    exit(EXIT_FAILURE);

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


                                                /* ////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\ */

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


                                Merci d'avance de votre aide.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 juin 2006 à 10:56:28

                                  EDIT: YESSSSSSSSSSSSSSSSS ! (je sais y faut pas crier mais je suis trop content :D )
                                  Ca marche enfin !
                                  Enfin ça marche, ça m'efface le perso que je viens de tuer de l'ecran + 1 ou 2 autres du meme type :o
                                  Je vous redonne le code de la fontion qui doit editer la carte :
                                  int editer_niveau(int niveau[][NB_BLOCS_HAUTEUR], int largeur, int hauteur)
                                  {
                                      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;

                                      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] = 0;
                                                      break;
                                                  case '4':
                                                      niveau[j][i] = 4;
                                                      break;
                                                  case '5':
                                                      niveau[j][i] = 5;

                                              }

                                              if (niveau[j][i] == niveau[largeur][hauteur])
                                              {
                                                  niveau[j][i] = 0;
                                              }
                                          }
                                      }

                                      fclose(fichier);
                                      fichier = fopen("niveaux.lvl", "w");
                                      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;
                                  }


                                  2e EDIT: Le problème vient peut-etre de la fonction jeu donc je vous donne aussi le code de la boucle principale :
                                  while (continuer)
                                      {
                                          joueur.point_de_vie = 200;
                                          joueur.point_d_action = 6;
                                          if (carte[position_perso.x + 1][position_perso.y] == DC ||
                                          carte[position_perso.x - 1][position_perso.y] == DC ||
                                          carte[position_perso.x][position_perso.y - 1] == DC ||
                                          carte[position_perso.x][position_perso.y + 1] == DC)
                                          {
                                              droide.type_d_adversaire = DC;
                                              combat(ecran, &droide, &joueur);
                                              if (joueur.point_de_vie <= 0)
                                              {
                                                  SDL_BlitSurface(game_over, NULL, ecran, &position_gm);
                                                  SDL_Flip(ecran);
                                                  SDL_Delay(10000);
                                                  return EXIT_SUCCESS;
                                              }
                                              else
                                              {
                                                  if (carte[position_perso.x + 1][position_perso.y] == DC)
                                                  {
                                                      largeur = position_perso.x + 1;
                                                      hauteur = position_perso.y;
                                                  }
                                                  else if (carte[position_perso.x - 1][position_perso.y] == DC)
                                                  {
                                                      largeur = position_perso.x - 1;
                                                      hauteur = position_perso.y;
                                                  }
                                                  else if (carte[position_perso.x][position_perso.y + 1] == DC)
                                                  {
                                                      largeur = position_perso.x;
                                                      hauteur = position_perso.y + 1;
                                                  }
                                                  else if (carte[position_perso.x][position_perso.y - 1] == DC)
                                                  {
                                                      largeur = position_perso.x;
                                                      hauteur = position_perso.y - 1;
                                                  }
                                                  editer_niveau(carte, largeur, hauteur);
                                                  if (!editer_niveau(carte, largeur, hauteur))
                                                      exit(EXIT_FAILURE);

                                              }

                                          }

                                          if (carte[position_perso.x + 1][position_perso.y] == DD ||
                                          carte[position_perso.x - 1][position_perso.y] == DD ||
                                          carte[position_perso.x][position_perso.y - 1] == DD ||
                                          carte[position_perso.x][position_perso.y + 1] == DD)
                                          {
                                              droide.type_d_adversaire = DD;
                                              combat(ecran, &droide, &joueur);
                                              if (joueur.point_de_vie <= 0)
                                              {
                                                  SDL_BlitSurface(game_over, NULL, ecran, &position_gm);
                                                  SDL_Flip(ecran);
                                                  SDL_Delay(10000);
                                                  return EXIT_SUCCESS;
                                              }
                                              else
                                              {
                                                  if (carte[position_perso.x + 1][position_perso.y] == DD)
                                                  {
                                                      largeur = position_perso.x + 1;
                                                      hauteur = position_perso.y;
                                                  }
                                                  else if (carte[position_perso.x - 1][position_perso.y] == DD)
                                                  {
                                                      largeur = position_perso.x - 1;
                                                      hauteur = position_perso.y;
                                                  }
                                                  else if (carte[position_perso.x][position_perso.y + 1] == DD)
                                                  {
                                                      largeur = position_perso.x;
                                                      hauteur = position_perso.y + 1;
                                                  }
                                                  else if (carte[position_perso.x][position_perso.y - 1] == DD)
                                                  {
                                                      largeur = position_perso.x;
                                                      hauteur = position_perso.y - 1;
                                                  }
                                                  editer_niveau(carte, largeur, hauteur);
                                                  if (!editer_niveau(carte, largeur, hauteur))
                                                      exit(EXIT_FAILURE);


                                              }
                                          }

                                          if (carte[position_perso.x + 1][position_perso.y] == SDC ||
                                          carte[position_perso.x - 1][position_perso.y] == SDC ||
                                          carte[position_perso.x][position_perso.y - 1] == SDC ||
                                          carte[position_perso.x][position_perso.y + 1] == SDC)
                                          {
                                              droide.type_d_adversaire = SDC;
                                              combat(ecran, &droide, &joueur);
                                              if (joueur.point_de_vie <= 0)
                                              {
                                                  SDL_BlitSurface(game_over, NULL, ecran, &position_gm);
                                                  SDL_Flip(ecran);
                                                  SDL_Delay(10000);
                                                  return EXIT_SUCCESS;
                                              }
                                              else
                                              {
                                                  if (carte[position_perso.x + 1][position_perso.y] == SDC)
                                                  {
                                                      largeur = position_perso.x + 1;
                                                      hauteur = position_perso.y;
                                                  }
                                                  else if (carte[position_perso.x - 1][position_perso.y] == SDC)
                                                  {
                                                      largeur = position_perso.x - 1;
                                                      hauteur = position_perso.y;
                                                  }
                                                  else if (carte[position_perso.x][position_perso.y + 1] == SDC)
                                                  {
                                                      largeur = position_perso.x;
                                                      hauteur = position_perso.y + 1;
                                                  }
                                                  else if (carte[position_perso.x][position_perso.y - 1] == SDC)
                                                  {
                                                      largeur = position_perso.x;
                                                      hauteur = position_perso.y - 1;
                                                  }
                                                  editer_niveau(carte, largeur, hauteur);
                                                  if (!editer_niveau(carte, largeur, hauteur))
                                                      exit(EXIT_FAILURE);

                                              }
                                          }

                                          SDL_WaitEvent(&event);
                                          switch(event.type)
                                          {
                                              case SDL_QUIT:
                                                  continuer = 0;
                                                  break;
                                              case SDL_KEYUP:
                                                  switch (event.key.keysym.sym)
                                                  {
                                                      case SDLK_ESCAPE:
                                                          continuer = 0;
                                                          break;
                                                  }
                                                  break;
                                              case SDL_KEYDOWN:
                                                  switch (event.key.keysym.sym)
                                                  {
                                                      case SDLK_UP:
                                                          perso= clone[HAUT];
                                                          deplacer_joueur(carte, &position_perso, HAUT);
                                                          break;
                                                      case SDLK_DOWN:
                                                          perso= clone[BAS];
                                                          deplacer_joueur(carte, &position_perso, BAS);
                                                          break;
                                                      case SDLK_LEFT:
                                                          perso= clone[GAUCHE];
                                                          deplacer_joueur(carte, &position_perso, GAUCHE);
                                                          break;
                                                      case SDLK_RIGHT:
                                                          perso= clone[DROITE];
                                                          deplacer_joueur(carte, &position_perso, DROITE);
                                                          break;
                                                  }
                                                  break;
                                          }

                                          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 188, 188, 188));

                                          // Placement des objets à l'écran
                                          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 DC:
                                                          SDL_BlitSurface(dc, NULL, ecran, &position);
                                                          break;
                                                      case DD:
                                                          SDL_BlitSurface(dd, NULL, ecran, &position);
                                                          break;
                                                      case CLONE:
                                                          SDL_BlitSurface(clone[BAS], NULL, ecran, &position);
                                                          break;
                                                      case SDC:
                                                          SDL_BlitSurface(sdc, NULL, ecran, &position);
                                                  }
                                              }
                                          }

                                          // On place le joueur à la bonne position
                                          position.x = position_perso.x * TAILLE_BLOC;
                                          position.y = position_perso.y * TAILLE_BLOC;
                                          SDL_BlitSurface(perso, NULL, ecran, &position);
                                          SDL_Flip(ecran);
                                      }


                                  Voila merci d'avance de votre aide.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 juin 2006 à 11:04:26

                                    Ce problème est vraiment bizarre je ne vois pas d'où il peut venir ...
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Les fichiers

                                    × 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