Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème avec mario sokoban

    15 avril 2006 à 19:30:38

    (Re)bonjour ( déjà 2 topic dans la journée :lol: )

    Voila j'ai fait le TP de m@teo21 sur le sokoban...et j'ai déjà un problème :( .

    Je me suis arrété après avoir fait la sauvegarde de niveau et je me suis dit : " On va essayer voir ce que ça donne."

    Donc je lance, et puis je choisi jouer. Puis la la fenêtre se ferme avec "Process terminated with statuts 1 ( 0 warnings,0 errors)"

    Vous voulez que je poste le code ? car comme vous le savez il est assez long.

    Merci d'avance.

    [EDIT]: je vien de m'apercevoir qu'il y a un fichier stderr avec comme contenu : "Fatal signal: Segmentation Fault (SDL Parachute Deployed)".
    Pourtant je n'ai mis nul part dans le code un : fprintf(stderr ....
    • Partager sur Facebook
    • Partager sur Twitter
      15 avril 2006 à 19:52:47

      Citation : fock

      [EDIT]: je vien de m'apercevoir qu'il y a un fichier stderr avec comme contenu : "Fatal signal: Segmentation Fault (SDL Parachute Deployed)".
      Pourtant je n'ai mis nul part dans le code un : fprintf(stderr ....


      C'est la bibliothèque SDL qui a elle même détécté un problème (Segmentation Fault) et qui a pris l'initiative de tout arréter. Elle a envoyé un message à stderr.

      C'est une pratique courante en cas d'erreur 'mortelle' (fatal error).
      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        15 avril 2006 à 20:04:12

        merci mais tu ne saurais pas d'où viens l'erreur ? si vous avez besoin de code dites le.
        • Partager sur Facebook
        • Partager sur Twitter
          15 avril 2006 à 20:07:23

          Citation : fock

          merci mais tu ne saurais pas d'où viens l'erreur ? si vous avez besoin de code dites le.


          Pointeur non initialisé
          Débordement de tableau...
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            15 avril 2006 à 20:23:22

            Poste ton code, on verra mieux de quelle erreur il s'agit (surtout que Parachute Deployed, il y a plein de possibilités...)
            • Partager sur Facebook
            • Partager sur Twitter
              15 avril 2006 à 21:03:08

              je vais mettre ju.c et main.c car je pense que ça vien d'une de ces 2 fonctions

              main.c :
              /*main.c

              copie de m@teo21

              contient la fonction principal(main).*/


              #include "constantes.h"
              #include "jeu.h"
              #include "editeur.h"
              #include <stdlib.h>
              #include <stdio.h>
              #include <SDL/SDL.h>
              #include <SDL/SDL_image.h>

              int main(int argc, char *argv[])
              {
                      SDL_Surface *ecran = NULL, *menu = NULL;
                      SDL_Rect positionMenu;
                      SDL_Event event;

                      int continuer = 1;

                      SDL_Init(SDL_INIT_VIDEO);



                      SDL_WM_SetIcon(IMG_Load("caisse.jpg"), NULL);

                      ecran = SDL_SetVideoMode(LARGEUR_FENETRE,HAUTEUR_FENETRE,32,SDL_HWSURFACE |SDL_DOUBLEBUF);

                      SDL_WM_SetCaption("Mario Sokoban",NULL);

                      menu = IMG_Load("menu.jpg");
                      positionMenu.y = 0;
                      positionMenu.x = 0;

                      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_KP1:
                                              jouer(ecran);


                                              break;

                                              case SDLK_KP2:

                                              break;
                                      }
                                      break;
                              }

                              SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
                              SDL_BlitSurface(menu,NULL,ecran,&positionMenu);
                              SDL_Flip(ecran);
                      }
                      SDL_FreeSurface(menu);
                      SDL_Quit();


                      return EXIT_SUCCESS;
              }



              jeu.c:
              #include "constantes.h"
              #include "jeu.h"
              #include <stdlib.h>
              #include <stdio.h>
              #include <SDL/SDL.h>
              #include <SDL/SDL_image.h>

              void jouer(SDL_Surface *ecran)
              {
                  SDL_Surface *mario[4] = {NULL}; // 4 surfaces pour chacune des directions de mario
                  SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = 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};


                  mur = IMG_Load("mur.jpg");
                  caisse = IMG_Load("caisse.jpg");
                  caisseOK = IMG_Load("caisse_ok.jpg");
                  objectif = IMG_Load("objectif.png");
                  mario[BAS] = IMG_Load("mario_bas.gif");
                  mario[GAUCHE] = IMG_Load("mario_gauche.gif");
                  mario[HAUT] = IMG_Load("mario_haut.gif");
                  mario[DROITE] = IMG_Load("mario_droite.gif");

                  marioActuel = mario[BAS];

                  if(chargerNiveau(carte))
                  exit(EXIT_FAILURE);


                  for(i = 0; i < NB_BLOCS_HAUTEUR;i++)
                  {
                          for(j = 0; j < NB_BLOCS_LARGEUR;j++)
                          {
                                  if(carte == MARIO)
                                  {
                                          positionJoueur.y = j;
                                          positionJoueur.x = i;
                                          carte[i][j] = VIDE;
                                  }
                          }
                  }

                  SDL_EnableKeyRepeat(100, 100);
                  while(continuer)
                  {
                          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:marioActuel = mario[HAUT];
                                          deplacerJoueur(carte,&positionJoueur,HAUT);
                                          break;
                                          case SDLK_DOWN:
                                          marioActuel = mario[BAS];
                                          deplacerJoueur(carte, &positionJoueur, BAS);
                                          break;
                                          case SDLK_RIGHT:
                                          marioActuel = mario[DROITE];
                                          deplacerJoueur(carte, &positionJoueur, DROITE);
                                          break;
                                          case SDLK_LEFT:
                                          marioActuel = mario[GAUCHE];
                                          deplacerJoueur(carte, &positionJoueur, GAUCHE);
                                          break;
                                  }
                          }

                      SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                      for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
                      {
                          for(j = 0; 0 < 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 OBJECTIF:
                                          SDL_BlitSurface(objectif, NULL, ecran, &position);
                                          objectifsRestants = 1;
                                          break;
                                  }
                          }
                      }
                      if (!objectifsRestants)
                          continuer = 0;

                      position.x = positionJoueur.x * TAILLE_BLOC;
                      position.y = positionJoueur.y * TAILLE_BLOC;
                      SDL_BlitSurface(marioActuel, NULL, ecran, &position);
                      SDL_Flip(ecran);
                  }

                  SDL_EnableKeyRepeat(0, 0);

                  SDL_FreeSurface(mur);
                  SDL_FreeSurface(caisse);
                  SDL_FreeSurface(caisseOK);
                  SDL_FreeSurface(objectif);
                  for (i = 0 ; i < 4 ; i++)
                  SDL_FreeSurface(mario[i]);
              }

              void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
              {

                  switch(direction)
                  {
                      case HAUT:
                              if (pos->y - 1 < 0) // Si le joueur dépasse l'écran, on arrête
                              break;

                              if (carte[pos->x][pos->y - 1] == MUR) // S'il y a un mur, on arrête
                              break;

                              if ((carte[pos->x][pos->y - 1] == CAISSE || carte[pos->x][pos->y - 1] == CAISSE_OK) &&
                                  (pos->y - 2 < 0 || carte[pos->x][pos->y - 2] == MUR ||
                                  carte[pos->x][pos->y - 2] == CAISSE || carte[pos->x][pos->y - 2] == CAISSE_OK))
                                  break;

                              deplacerCaisse(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);

                              pos->y--;
                      break;

                      case BAS:
                      break;

                      case GAUCHE:
                      break;

                      case DROITE:
                      break;
                  }

              }

              void deplacerCaisse(int *premiereCase, int *secondeCase)
              {
                  if (*premiereCase == CAISSE || *premiereCase == CAISSE_OK)
                  {
                      if (*secondeCase == OBJECTIF)
                          *secondeCase = CAISSE_OK;
                      else
                          *secondeCase = CAISSE;

                      if (*premiereCase == CAISSE_OK)
                          *premiereCase = OBJECTIF;
                      else
                          *premiereCase = VIDE;
                  }
              }
              • Partager sur Facebook
              • Partager sur Twitter
                15 avril 2006 à 23:15:31

                Bon en survolant, je vois une petite erreure là:

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

                for(i = 0; i < NB_BLOCS_HAUTEUR;i++)
                    {
                            for(j = 0; j < NB_BLOCS_LARGEUR;j++)
                            {
                                    if(carte == MARIO)
                                    {
                                            positionJoueur.y = j;
                                            positionJoueur.x = i;
                                            carte[i][j] = VIDE;
                                    }
                            }
                    }


                Je crois que t'as inversé i et j
                Mais normalement, si NB_BLOCS_HAUTEUR et NB_BLOCS_LARGEUR représentent la même valeure (12 et 12 il me semble si je me souviens bien du TP), ça ne devrait pas être ça qui cause ton probleme.

                Je continue de chercher :-)
                • Partager sur Facebook
                • Partager sur Twitter
                  15 avril 2006 à 23:22:19

                  je pourrai savoir pourquoi après avoir fini sokoban au menu je ne peux pas appuyer sur jouer il ne se passe rien une fois que je l'ai fait?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 avril 2006 à 23:49:39

                    Tu appuis bien sur la touche '1' de ton pavé numérique? Car la sourie ici ne sert à rien

                    hum fock... la déclaration de ta fonction deplacer joueur, me parait quelque peu douteuse:
                    void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)

                    c'est quoi exactement la nature du premier argument de ta fonction? Un tableau à 2 dimensions qui contient des int? Ou juste un int? Ou un tableau à une seule dimension??
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 avril 2006 à 0:14:08

                      Dans ton jeu.c, il manque :
                      SDL_WaitEvent(&event);


                      avant le switch...
                      Bouh le vilain copier coller à l'arrache :p
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 avril 2006 à 11:22:38

                        :honte::honte: oups merci beaucoup. Mais toujours la même erreur :s .

                        Sinon nonpoluant : C'est du copier coller du cours ça aussi ^^' (C'est un tableau à deux dimensions).
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 avril 2006 à 11:30:58

                          Citation : nonpoluant

                          hum fock... la déclaration de ta fonction deplacer joueur, me parait quelque peu douteuse:

                          void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)


                          c'est quoi exactement la nature du premier argument de ta fonction?


                          Un pointeur sur le premier élément d'un tableau d'int à 2 dimensions.

                          http://mapage.noos.fr/emdel/notes.htm#param_tab
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                            16 avril 2006 à 21:42:36

                            J'ai compiler avec mingw et il me dit :
                            In file included from main.c:8:
                            jeu.h:3:24: calling fdopen: No such file or directory
                            jeu.h:4:24: calling fdopen: Bad file descriptor
                            In file included from jeu.c:2:
                            jeu.h:3:24: calling fdopen: No such file or directory
                            jeu.h:4:24: calling fdopen: Bad file descriptor
                            jeu.c: In function `jouer':
                            jeu.c:17: warning: missing braces around initializer
                            jeu.c:17: warning: (near initialization for `carte[0]')
                            jeu.c:31: warning: implicit declaration of function `chargerNiveau'
                            jeu.c:39: warning: comparison between pointer and integer
                            fichier.c: In function `sauvegarderNiveau':
                            fichier.c:79: warning: control reaches end of non-void function


                            jeu.h:
                            #include "constantes.h"
                            #include <stdlib.h>
                            #include <stdio.h>
                            #include <SDL/SDL.h>
                            #include <SDL/SDL_image.h>

                            void jouer(SDL_Surface * ecran);
                            void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction);
                            void deplacerCaisse(int *premiereCase, int *secondeCase);


                            fichier.c :
                            #include "constantes.h"
                            #include "fichier.h"
                            #include <stdlib.h>
                            #include <stdio.h>
                            #include <SDL/SDL.h>
                            #include <SDL/SDL_image.h>


                            int chargerNiveau(int niveau[][NB_BLOCS_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;
                                }

                                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;
                                        }
                                    }
                                }


                                fclose(fichier);
                                return 1;
                            }

                            int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
                            {
                                int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
                                {
                                    FILE* fichier = NULL;
                                    int i = 0, j = 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++)
                                        {
                                            fprintf(fichier, "%d", niveau[j][i]);
                                        }
                                    }

                                    fclose(fichier);
                                    return 1;
                                }


                            }
                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 avril 2006 à 15:44:41


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

                                  for(i = 0; i < NB_BLOCS_HAUTEUR;i++)
                                  {
                                          for(j = 0; j < NB_BLOCS_LARGEUR;j++)
                                          {
                                                  if(carte == MARIO)
                                                  {
                                                          positionJoueur.y = j;
                                                          positionJoueur.x = i;
                                                          carte[i][j] = VIDE;
                                                  }
                                          }
                                  }

                              Je crois que tu t'es trompé lors de tes boucles:
                              i représente ta largeur et j ta hauteur. Mais lors de tes boucles, tu compares i avec ta hauteur et j avec ta largeur. je dirais que cela viens de ça.

                              carte[i][j] = VIDE;

                              Ici, on voit que ta première dimension est i.

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

                              Et lors de l'initialisation de ton tableau, on voit que la première dimension (donc i) correspond à la largeur.

                              for(i = 0; i < NB_BLOCS_HAUTEUR;i++)

                              Mais lors de la boucle, tu le compare à la hauteur.

                              EDIT: j'ai aussi un peu de peine avec cette ligne:

                              if(carte == MARIO)

                              Rappel: carte est ici un pointeur vers la première cellule de ton tableau, je pense qu'il y manque donc quelque chose ...

                              EDIT2: Il manquerait pas quelque chose à ta fonction deplacerJoueur :-° C'est probablement pas l'origine d'un de tes problèmes mais bon

                              EDIT3:

                              if(chargerNiveau(carte))
                                  exit(EXIT_FAILURE);


                              int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR])
                              {
                                  return 1;
                              }

                              Si mes souvenirs sont bons, 0 = faux, autre chose = vrai.
                              Donc là, si ta fonction chargerNiveau fonctionne correctement, ça quitte le programme. Un peu bizarre non?
                              Essai peut-être ça à la place.

                              if(!chargerNiveau(carte))

                              Etant donné que avec le ! vrai devient faux et vice-versa.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 avril 2006 à 4:36:39

                                Citation : nonpoluant

                                Bon en survolant, je vois une petite erreure là:

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



                                for(i = 0; i < NB_BLOCS_HAUTEUR;i++)
                                    {
                                            for(j = 0; j < NB_BLOCS_LARGEUR;j++)
                                            {
                                                    if(carte == MARIO)
                                                    {
                                                            positionJoueur.y = j;
                                                            positionJoueur.x = i;
                                                            carte[i][j] = VIDE;
                                                    }
                                            }
                                    }




                                Je crois que t'as inversé i et j



                                Citation : Punsh

                                Je crois que tu t'es trompé lors de tes boucles:
                                i représente ta largeur et j ta hauteur. Mais lors de tes boucles, tu compares i avec ta hauteur et j avec ta largeur. je dirais que cela viens de ça.



                                Hé ho Punish, tu te ficherais pas un peu de moi?! :colere::p
                                • Partager sur Facebook
                                • Partager sur Twitter

                                problème avec 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