Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sokoban qui se ferme tout seul

    14 décembre 2007 à 15:07:55

    SLT les zeros

    Je bloque au tuto du sokoban. Mon pragramme se ferme que j'appuie sur la touche 1 dans le menu principal, qui est censé faire demarrer le jeu.
    Le pire c'est que j'ai verifié sur la version telkechargeable de mateo et j'ai fait pareil que lui.
    En plus, cette version telechargeable ne marche pas non plus sur mon pc. Quand je suis sur le menu, meme en appuyant sur 1, ca ne bouge pas.

    J'utilise toujours dev c++ sous windows.
    Voici un lien vers le tuto : TUTO : TP mario sokoban .
    Et un autre vers le telechargement du programme de mateo : Telecharger le mario sokoban de m@téo.

    J'ai deja verifié le fichier stderr.txt mais il est vide.
    J'ai bien crée un fichier niveaux.lvl avec le code de chiffre qui initialise le niveau (contenu :111110011111111114000001111100011001033101011011000002001211100101000011111100011211111111111001111130000001111111111111111111111111111111111111)

    Voici mon code :

    main.c :
    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. #include <SDL/SDL.h>
    4. #include <SDL/SDL_image.h>
    5. #include "constantes.h"
    6. #include "jeu.h"
    7. int main(int argc, char *argv[])
    8. {
    9.     SDL_Surface *ecran = NULL, *menu = NULL;
    10.     SDL_Rect positionMenu;
    11.     positionMenu.x = 0;
    12.     positionMenu.y = 0;
    13.     SDL_Event event;
    14.     int continuer = 1;
    15.     if(SDL_Init(SDL_INIT_VIDEO) == -1)
    16.     {
    17.                                fprintf(stderr, "erreur d'initialisation de la SDL : %s\n", SDL_GetError());
    18.                                exit(EXIT_FAILURE);
    19.     }
    20.     SDL_WM_SetIcon(IMG_Load("caise_ok.jpg"), NULL);
    21.     ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE| SDL_DOUBLEBUF);
    22.     SDL_WM_SetCaption("sokoban -- Par Pierre Lorent.", NULL);
    23.     menu = IMG_Load("menu.jpg");
    24.     while(continuer)
    25.     {
    26.                     SDL_WaitEvent(&event);
    27.                     switch(event.type)
    28.                     {
    29.                                       case SDL_QUIT :
    30.                                            continuer = 0;
    31.                                            break;
    32.                                       case SDL_KEYDOWN :
    33.                                            switch(event.key.keysym.sym)
    34.                                            {
    35.                                                            case SDLK_1 :
    36.                                                                 jouer(ecran);
    37.                                                                 break;
    38.                                                            case SDLK_2 :
    39.                                                                 //editeur(ecran);
    40.                                                                 break;
    41.                                                            case SDLK_ESCAPE :
    42.                                                                 continuer = 0;
    43.                                                                 break;        
    44.                                            }
    45.                                            break;
    46.                     }
    47.                     SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
    48.                     SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
    49.                     SDL_Flip(ecran);
    50.     }    
    51.     SDL_FreeSurface(menu);
    52.     SDL_Quit();
    53.     return EXIT_SUCCESS;
    54. }


    jeu.c:

    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. #include <SDL/SDL.h>
    4. #include <SDL/SDL_image.h>
    5. #include "constantes.h"
    6. #include "jeu.h"
    7. void jouer(SDL_Surface* ecran)
    8. {
    9.      SDL_Surface *mario[4] = {NULL};
    10.      SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = NULL;
    11.      SDL_Rect position, positionJoueur;
    12.      SDL_Event event;
    13.      int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
    14.      int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
    15.      mur = IMG_Load("mur.jpg");
    16.      caisse = IMG_Load("caisse.jpg");
    17.      caisseOK = IMG_Load("caisse_ok.jpg");
    18.      objectif = IMG_Load("objectif.jpg");
    19.      mario[HAUT] = IMG_Load("mario_haut.gif");
    20.      mario[BAS] = IMG_Load("mario_bas.gif");
    21.      mario[GAUCHE] = IMG_Load("mario_gauche.gif");
    22.      mario[DROITE] = IMG_Load("mario_droite.gif");
    23.      marioActuel = mario[BAS];
    24.      if(!chargerNiveau(carte))
    25.           exit(EXIT_FAILURE);
    26.      for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
    27.      {
    28.          for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
    29.          {
    30.              if (carte[i][j] == MARIO)
    31.              {
    32.                 positionJoueur.x = i;
    33.                 positionJoueur.y = j;
    34.                 carte[i][j] = VIDE;
    35.              }
    36.          }
    37.      }
    38.      SDL_EnableKeyRepeat(100, 100);
    39.      while(continuer)
    40.      {
    41.                SDL_WaitEvent(&event);
    42.                switch(event.type)
    43.                {
    44.                        case SDL_QUIT:
    45.                             continuer = 0;
    46.                             break;
    47.                        case SDL_KEYDOWN:
    48.                             switch(event.key.keysym.sym)
    49.                             {
    50.                                                         case SDLK_ESCAPE:
    51.                                                              continuer = 0;
    52.                                                              break;
    53.                                                         case SDLK_UP:
    54.                                                              marioActuel = mario[HAUT];
    55.                                                              deplacerJoueur(carte, &positionJoueur, HAUT);
    56.                                                              break;
    57.                                                         case SDLK_DOWN:
    58.                                                              marioActuel = mario[BAS];
    59.                                                              deplacerJoueur(carte, &positionJoueur, BAS);
    60.                                                              break;
    61.                                                         case SDLK_RIGHT:
    62.                                                              marioActuel = mario[DROITE];
    63.                                                              deplacerJoueur(carte, &positionJoueur, DROITE);
    64.                                                              break;
    65.                                                         case SDLK_LEFT:
    66.                                                              marioActuel = mario[GAUCHE];
    67.                                                              deplacerJoueur(carte, &positionJoueur, GAUCHE);
    68.                                                              break;
    69.                             }
    70.                             break;
    71.                }
    72.                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    73.                objectifsRestants = 0;
    74.                for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
    75.                {
    76.                    for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
    77.                    {
    78.                        position.x = i * TAILLE_BLOC;
    79.                        position.y = j * TAILLE_BLOC;
    80.                        switch(carte[i][j])
    81.                        {
    82.                                           case MUR:
    83.                                                SDL_BlitSurface(mur, NULL, ecran, &position);
    84.                                                break;
    85.                                           case CAISSE:
    86.                                                SDL_BlitSurface(caisse, NULL, ecran, &position);
    87.                                                break;
    88.                                           case CAISSE_OK:
    89.                                                SDL_BlitSurface(caisseOK, NULL, ecran, &position);
    90.                                                break;
    91.                                           case OBJECTIF:
    92.                                                SDL_BlitSurface(objectif, NULL, ecran, &position);
    93.                                                objectifsRestants = 1;
    94.                                                break;
    95.                        }
    96.                    }
    97.                }
    98.                if (!objectifsRestants)
    99.                   continuer = 0;  
    100.                position.x = positionJoueur.x * TAILLE_BLOC;
    101.                position.y = positionJoueur.y * TAILLE_BLOC;
    102.                SDL_BlitSurface(marioActuel, NULL, ecran, &position);
    103.                SDL_Flip(ecran);
    104.      }
    105.      SDL_EnableKeyRepeat(0, 0);
    106.      SDL_FreeSurface(mur);
    107.      SDL_FreeSurface(caisse);
    108.      SDL_FreeSurface(caisseOK);
    109.      SDL_FreeSurface(objectif);
    110.      for (i = 0 ; i < 4 ; i++)
    111.          SDL_FreeSurface(mario[i]);
    112. }
    113. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
    114. {
    115.      switch(direction)
    116.      {
    117.            case HAUT :
    118.                 if (pos->y - 1 < 0)
    119.                    break;
    120.                 if (carte[pos->x][pos->y - 1] == MUR)
    121.                    break;
    122.                 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))
    123.                    break;
    124.                 deplacerCaisse(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);
    125.                 pos->y--;
    126.                 break;
    127.            case BAS :
    128.                 if (pos->y + 1 > HAUTEUR_FENETRE)
    129.                    break;
    130.                 if (carte[pos->x][pos->y + 1] == MUR)
    131.                    break;
    132.                 if ((carte[pos->x][pos->y + 1] == CAISSE || carte[pos->x][pos->y + 1] == CAISSE_OK) && (pos->y + 2 > HAUTEUR_FENETRE || carte[pos->x][pos->y + 2] == MUR || carte[pos->x][pos->y + 2] == CAISSE || carte[pos->x][pos->y + 2] == CAISSE_OK))
    133.                    break;
    134.                 deplacerCaisse(&carte[pos->x][pos->y + 1], &carte[pos->x][pos->y + 2]);
    135.                 pos->y++;
    136.                 break;
    137.            case DROITE :
    138.                 if (pos->x + 1 > LARGEUR_FENETRE)
    139.                    break;
    140.                 if (carte[pos->x + 1][pos->y] == MUR)
    141.                    break;
    142.                 if ((carte[pos->x + 1][pos->y] == CAISSE || carte[pos->x + 1][pos->y] == CAISSE_OK) && (pos->x + 2 > LARGEUR_FENETRE || carte[pos->x + 2][pos->y] == MUR || carte[pos->x + 2][pos->y] == CAISSE || carte[pos->x + 2][pos->y] == CAISSE_OK))
    143.                    break;
    144.                 deplacerCaisse(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);
    145.                 pos->x++;
    146.                 break;
    147.            case GAUCHE :
    148.                 if (pos->x - 1 < 0)
    149.                    break;
    150.                 if (carte[pos->x - 1][pos->y] == MUR)
    151.                    break;
    152.                 if ((carte[pos->x - 1][pos->y] == CAISSE || carte[pos->x - 1][pos->y] == CAISSE_OK) && (pos->x - 2 < 0 || carte[pos->x - 2][pos->y] == MUR || carte[pos->x - 2][pos->y] == CAISSE || carte[pos->x - 2][pos->y] == CAISSE_OK))
    153.                    break;
    154.                 deplacerCaisse(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);
    155.                 pos->x--;
    156.                 break;
    157.      }
    158. }
    159. void deplacerCaisse(int *premiereCase, int *secondeCase)
    160. {
    161.     if (*premiereCase == CAISSE || *premiereCase == CAISSE_OK)
    162.     {
    163.         if (*secondeCase == OBJECTIF)
    164.             *secondeCase = CAISSE_OK;
    165.         else
    166.             *secondeCase = CAISSE;
    167.         if (*premiereCase == CAISSE_OK)
    168.             *premiereCase = OBJECTIF;
    169.         else
    170.             *premiereCase = VIDE;
    171.     }
    172. }


    fichier.c:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <stdio.h>
    4. #include <SDL/SDL.h>
    5. #include <SDL/SDL_image.h>
    6. #include "constantes.h"
    7. #include "fichiers.h"
    8. int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    9. {
    10.     FILE* fichier = NULL;
    11.     char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
    12.     int i = 0, j = 0;
    13.     fichier = fopen("niveaux.lvl", "r");
    14.     if (fichier == NULL)
    15.         return 0;
    16.     fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);
    17.     for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
    18.     {
    19.         for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
    20.         {
    21.             switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
    22.             {
    23.                 case '0':
    24.                     niveau[j][i] = 0;
    25.                     break;
    26.                 case '1':
    27.                     niveau[j][i] = 1;
    28.                     break;
    29.                 case '2':
    30.                     niveau[j][i] = 2;
    31.                     break;
    32.                 case '3':
    33.                     niveau[j][i] = 3;
    34.                     break;
    35.                 case '4':
    36.                     niveau[j][i] = 4;
    37.                     break;
    38.             }
    39.         }
    40.     }
    41.     fclose(fichier);
    42.     return 1;
    43. }
    44. int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    45. {
    46.     FILE* fichier = NULL;
    47.     int i = 0, j = 0;
    48.     fichier = fopen("niveaux.lvl", "w");
    49.     if (fichier == NULL)
    50.         return 0;
    51.     for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
    52.     {
    53.         for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
    54.         {
    55.             fprintf(fichier, "%d", niveau[j][i]);
    56.         }
    57.     }
    58.     fclose(fichier);
    59.     return 1;
    60. }


    constantes.h
    1. #ifndef DEF_CONSTANTES
    2. #define DEF_CONSTANTES
    3.     #define TAILLE_BLOC         34
    4.     #define NB_BLOCS_LARGEUR    12
    5.     #define NB_BLOCS_HAUTEUR    12
    6.     #define LARGEUR_FENETRE     TAILLE_BLOC * NB_BLOCS_LARGEUR
    7.     #define HAUTEUR_FENETRE     TAILLE_BLOC * NB_BLOCS_HAUTEUR
    8.     enum {HAUT, BAS, GAUCHE, DROITE};
    9.     enum {VIDE, MUR, CAISSE, OBJECTIF, MARIO, CAISSE_OK};
    10. #endif


    fichier.c:
    1. int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR]);
    2. int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR]);


    jeu.c
    1. void jouer (SDL_Surface *ecran);
    2. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction);
    3. void deplacerCaisse(int *premiereCase, int *secondeCase);



    Je n'ai pas de message d'erreur non plus a la compilation.
    • Partager sur Facebook
    • Partager sur Twitter
      14 décembre 2007 à 15:11:04

      Les images sont dans le répertoire courant ? Y a aucun problème de ce coté ?
      • Partager sur Facebook
      • Partager sur Twitter
        14 décembre 2007 à 16:59:04

        Oui j'ai mis toute les images utilisée dans le meme dossier que mon programme.
        • Partager sur Facebook
        • Partager sur Twitter
          14 décembre 2007 à 18:11:37

          Si tu es sous un ordi portable, cela ne marchera pas.
          dans le code, il est dit " a l'appuie de la touche "1" du clavier numerique "
          donc : si tu utilise les numeros au dessus des lettres, ça ne marchera pas !
          • Partager sur Facebook
          • Partager sur Twitter
            14 décembre 2007 à 18:44:41

            Je sais bien, j'ai effectivement un portable, c'est pour cela que j'ai remplacer "SDLK_KP1" et "SDLK_KP2" par SDLK_1 et SDLK_2. Mais ca ne marche quand meme pas. Meme si je met des lettres a la place.
            • Partager sur Facebook
            • Partager sur Twitter
              14 décembre 2007 à 19:38:58

              Je pense que je sais ce qui ne va pas ^^ :
              tu nous a dit précedement avoir crée un fichier niveaux.txt. Or dans ton programme, dans la fonction chargerNiveau tu lui demande de charger niveaux.lvl et dans ta fonction Jouer tu lui demande un exit(EXIT_FAILURE) s'il n'arrive pas à charger ce fichier... tu as juste a remplacer le nom de ton fichier niveaux.txt par niveaux.lvl
              voilà :)
              • Partager sur Facebook
              • Partager sur Twitter
                14 décembre 2007 à 22:40:11

                Non, desolé mais ce n'est pas ca. Mon fichier s'appelle bien niveaux.lvl. c'est dans juste le message que j'ai mis .txt par erreur. Je vais corriger en editant.

                Suite a ton message j'ai essayer en supprimant le if qui quitte si le fichier ne charge pas correctement pour voir si il bug et m'en dit plus sur le probleme mais et le resultat est le meme.
                • Partager sur Facebook
                • Partager sur Twitter
                  15 décembre 2007 à 9:31:05

                  Ok, je viens de passer une demi-heure sur ton programme pour me rendre compte qu'il fonctionne...

                  Le seul truc c'est qu'il faut appuyer sur la bonne touche 1...
                  essaye les toutes, que se soit ton clavier numérique ou autre chose, essaye en majuscules et en minuscule...

                  J'ai fait beaucoup de modifications au niveau de l'indentation... tu dois faire beaucoup plus attention respecter une bonne indentation. Cela rendra ton code plus lisible et évitera des erreurs (ex: une indentation de 4 espaces)

                  1. while(continuer)
                  2.     {
                  3.         SDL_WaitEvent(&event);
                  4.         switch(event.type)
                  5.         {
                  6.             case SDL_QUIT :
                  7.             continuer = 0;
                  8.             break;
                  9. //plutôt que :
                  10. while(continuer)
                  11.     {
                  12.                 SDL_WaitEvent(&event);
                  13.                 switch(event.type)
                  14.                 {
                  15.                     case SDL_QUIT :
                  16.                                 continuer = 0;
                  17.                             break;


                  Même si, je suppose, la difficulté vient du fait que le SITE DU ZERO considère les tabulations comme 8 espaces...

                  Si tu as toujours un problème, je te repasserai tes fichiers sur lesquels j'ai travaillé...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 décembre 2007 à 11:36:32

                    @Layus :
                    il ne peut pas utiliser le du clavier numerique : il n'y en a pas sur les portables !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 décembre 2007 à 7:49:29

                      A la limite, le fait que j'appuye sur la mauvaise touche 1 peut expliquer le fait que le TP telecharger de m@teo ne fonctionne pas Mais mon sokoban lui se ferme quand j'appuye sur un, donc c'est bien la bonne touche.

                      Citation : Layus

                      Ok, je viens de passer une demi-heure sur ton programme pour me rendre compte qu'il fonctionne...


                      Si pour toi ill fonctionne, sur mon pc je peut te jurer que ca ne marche pas o_O .

                      Citation : Layus

                      Si tu as toujours un problème, je te repasserai tes fichiers sur lesquels j'ai travaillé...


                      Je crois que c'est preferable si je ne veux pas avoir de la bouillie de circuit imprimer tellement je m'enerve sur mon ordi. :colere2:
                      En plus je risque d'avoir la SPO (societe protectrice des ordinateur) sur le dos ^^

                      Citation : Xhtml_boys

                      il ne peut pas utiliser le du clavier numerique : il n'y en a pas sur les portables !


                      J' ai effectivement un portable mais meme sur le pavé numerique de mon clavier sans fil (que je n'utilise presque jamais) ca ne marche pas.Et je precise qu'un portable possede une sorte de clavier numerique qui utilise les touche j,k,l,u,i,o,è,!,ç comme numérique quand j'active cette option. ^^

                      ...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 mars 2008 à 17:39:23

                        J'ai le meme probleme et apparement en lisant ce topic, aucune solution à été trouvée...J'ai aussi posé un topic et aucune solution...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Sokoban qui se ferme tout seul

                        × 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