Algorithme "main gauche" pour labyrinthe

Algorithme "main gauche" pour labyrinthe - C - Programmation

Marsh Posté le 11-05-2009 à 21:29:02    

Voila.
On a pour projet de dévellopper un programme simple générant un labyrinthe, l'affichant(SDL) et le résolvant, sans critère d'optimisation.
Notre labyrinthe est dit "à ilots", c'est à dire qu'il n'a pas de chemin unique.

 

J'ai utilisé une structure de 4 integers de valeur 0 ou 1 :
laby.nord laby.sud etc...
puis créé une matrice de ceux ci.
Dans la génération je me suis débrouilé pour avoir les bords pleins à tout les coups et à éviter d'avoir des "doubles" murs.
probleme : au niveau du codage de l'algorithme, y'a un pépin : il ne passe pas dans certaines portes, et fini souvent bloqué...
EN particulier :
-S'il viens de gauche, il refuse d'aller au nord
-S'il viens de droite, il refuse d'aller autre part qu'à l'ouest

 

Je suis assez préssé par le temps et je n'ai plus vraiment le temps de revoir complètement ma structure du problème et j'aimerai juste faire fonctionner mon algo...

 

le code complet :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <SDL/SDL.h>
  5. typedef struct
  6. {
  7. int nord,sud,est,ouest;
  8. } bloc ;
  9. typedef struct
  10. {
  11. int x , y ;
  12. }pos;
  13. void pause();
  14. int main(int argc,char *argv[])
  15. {
  16.   // Initialisation des nombres aléatoires
  17.   srand(time(NULL));
  18.   //Définition des variables
  19.   int lo;                   //largeur du labyrinthe (verticale)
  20.   int la;                            //Longeur du labyrinthe (horizontale)
  21.   int lop;                  //Creation de "lop" pour les lignes ajoutées
  22.   int lot,lat;
  23.   int t,i,j;                //Compteurs
  24. /*
  25.   printf("Longueur du labyrinthe ? " );
  26.   scanf("%d",&lo);
  27.   printf("Largeur du labyrinthe ? " );
  28.   scanf("%d",&la);
  29. */
  30.   lo=8;                  //DEFINITION
  31.   la=8;                  //ARBITRAIRE
  32.   lop=lo+2;
  33.   lot=lo-1;
  34.   lat=la-1;
  35.  
  36.   //Création du labyrinthe : matrice de cases
  37.   bloc laby[la][lop];
  38.   //Initialisation de toutes les portes à 0
  39.   for(j=0;j<lop;j++)
  40.   {
  41.       for(i=0;i<la;i++)
  42.       {
  43.         laby[i][j].nord=0;
  44.         laby[i][j].ouest=0;
  45.         laby[i][j].est=0;
  46.         laby[i][j].sud=0;
  47.       }
  48.   }
  49.  
  50.   //Génération des portes
  51.   for(j=0;j<lop;j++)
  52.   {
  53.       for(i=0;i<la;i++)
  54.       {             
  55.        if ( i==0 && j<=lot && j!=0) // cases latérales ouest
  56.           {
  57.            laby[i][j].nord=0;
  58.            laby[i][j].ouest=1;
  59.            laby[i][j].est=rand()%2*rand()%2;
  60.            laby[i][j].sud=rand()%2*rand()%2;
  61.           }
  62.        else if ( i==lat && j>1 && j<=lot ) // cases latérales est
  63.           {
  64.            laby[i][j].nord=0;
  65.            laby[i][j].ouest=0;
  66.            laby[i][j].est=1;
  67.            laby[i][j].sud=rand()%2*rand()%2;
  68.           }
  69.        else if ( i!=0 && j==1 && i!=lat) // cases latérales nord
  70.           {
  71.            laby[i][j].nord=1;
  72.            laby[i][j].ouest=0;
  73.            laby[i][j].est=rand()%2*rand()%2;
  74.            laby[i][j].sud=rand()%2*rand()%2;
  75.           }
  76.        else if ( i!=0 && j==lo && i!=lat)// cases latérales sud
  77.           {
  78.            laby[i][j].nord=0;
  79.            laby[i][j].ouest=0;
  80.            laby[i][j].est=rand()%2*rand()%2;
  81.            laby[i][j].sud=1;
  82.           }
  83.        else if ( i==0 && j==lo)// case coin sud-ouest
  84.           {
  85.            laby[i][j].nord=0;
  86.            laby[i][j].ouest=1;
  87.            laby[i][j].est=rand()%2*rand()%2;
  88.            laby[i][j].sud=1;
  89.           }
  90.        else if ( i==lat && j==1)// case coin nord-est
  91.           {
  92.            laby[i][j].nord=1;
  93.            laby[i][j].ouest=0;
  94.            laby[i][j].est=1;
  95.            laby[i][j].sud=rand()%2*rand()%2;
  96.           }
  97.         else if ( i!=0 && i!=lat && j>1 && j<=lot) // Cases centrales
  98.           {
  99.            laby[i][j].nord=0;
  100.            laby[i][j].ouest=0;
  101.            laby[i][j].est=rand()%2*rand()%2;
  102.            laby[i][j].sud=rand()%2*rand()%2;
  103.           }
  104.         else if ( i==lat && j==lo )// case "finale" sud-est
  105.          {
  106.            laby[i][j].nord=0;
  107.            laby[i][j].ouest=0;
  108.            laby[i][j].est=1;
  109.            laby[i][j].sud=0;
  110.          }
  111.       }
  112. }
  113.     //===================Dessinage=======================
  114.     SDL_Surface * ecran = NULL;
  115.     SDL_Init(SDL_INIT_VIDEO);
  116.     SDL_Surface *bhorizontale = NULL;
  117.     SDL_Surface *bverticale = NULL;
  118.     SDL_Surface *point = NULL;
  119.     ecran = SDL_SetVideoMode(80*la+10,80*lop+10,32,SDL_HWSURFACE);
  120.     SDL_WM_SetCaption("Labyrinthe",NULL);
  121.    
  122.     //++++++++++++++Coloriage du fond++++++++++++++++++++
  123.     Uint32 rouge = SDL_MapRGB(ecran->format,255,0,0);
  124.     SDL_FillRect(ecran, NULL, rouge);
  125.    
  126.     //++++++++++++++Mise en place des barreaux+++++++++++
  127.     Uint32 vert = SDL_MapRGB(ecran->format,0,255,0);
  128.     bhorizontale = SDL_CreateRGBSurface(SDL_SWSURFACE,70,10,32,0,0,0,0);
  129.     SDL_FillRect(bhorizontale, NULL, vert);
  130.     bverticale = SDL_CreateRGBSurface(SDL_SWSURFACE,10,70,32,0,0,0,0);
  131.     SDL_FillRect(bverticale, NULL, vert);
  132.    
  133.     //++++++++++++++création du dégradé de bleu++++++++++
  134.     Uint32 bleu[255];
  135.     for(i=0;i<256;i++)
  136.      {
  137.        bleu[i] = SDL_MapRGB(ecran->format,0,0,i);
  138.      }
  139.    
  140.     //==================Affichage du labyrinthe=================
  141.     point = SDL_CreateRGBSurface(SDL_SWSURFACE,10,10,32,0,0,0,0);
  142.     SDL_FillRect(point, NULL, vert);
  143.     for(j=0;j<lop;j++)
  144.     {
  145.       for(i=0;i<la;i++)
  146.       {     
  147.        if (j!=0) // Placement de points aux angles des murs pour avoir un dessin continu
  148.        {
  149.        SDL_Rect positionijs;
  150.        positionijs.x =80*i;
  151.        positionijs.y=80*j;
  152.        SDL_BlitSurface(point,NULL,ecran,&positionijs);
  153.        positionijs.x =80*(i+1);
  154.        positionijs.y=80*j;
  155.        SDL_BlitSurface(point,NULL,ecran,&positionijs);
  156.        SDL_Flip(ecran);                     
  157.        }
  158.        if (laby[i][j].nord==1)
  159.        {
  160.         SDL_Rect positionijs;
  161.         positionijs.x =80*i+10;
  162.         positionijs.y=80*j;
  163.         SDL_BlitSurface(bhorizontale,NULL,ecran,&positionijs);
  164.         SDL_Flip(ecran);
  165.        }
  166.        if (laby[i][j].sud==1)
  167.        {
  168.         SDL_Rect positionijs;
  169.         positionijs.x =80*i+10;
  170.         positionijs.y=80*j+80;
  171.         SDL_BlitSurface(bhorizontale,NULL,ecran,&positionijs);
  172.         SDL_Flip(ecran);
  173.        }
  174.        if (laby[i][j].ouest==1)
  175.        {
  176.         SDL_Rect positionijs;
  177.         positionijs.x =80*i;
  178.         positionijs.y=80*j+10;
  179.         SDL_BlitSurface(bverticale,NULL,ecran,&positionijs);
  180.         SDL_Flip(ecran);
  181.        }
  182.        if (laby[i][j].est==1)
  183.        {
  184.         SDL_Rect positionijs;
  185.         positionijs.x =80*i+80;
  186.         positionijs.y=80*j+10;
  187.         SDL_BlitSurface(bverticale,NULL,ecran,&positionijs);
  188.         SDL_Flip(ecran);
  189.        }
  190.       }
  191.     }
  192.  
  193.   //=====================Fin du dessin==============================
  194.   pos caseij;
  195.   int deplact_h=0,deplact_v=1;
  196.   caseij.x=0;
  197.   caseij.y=1;
  198.   t=0;
  199.   //==================Algorithme=====================================
  200.    do
  201.   {       
  202.        SDL_Rect positionijs;
  203.        positionijs.x =80*caseij.x+40;
  204.        positionijs.y=80*caseij.y+40;
  205.        SDL_FillRect(point, NULL, bleu[12*t]);
  206.        SDL_BlitSurface(point,NULL,ecran,&positionijs);
  207.        SDL_Flip(ecran); 
  208.      
  209.        i=caseij.x;
  210.        j=caseij.y;
  211.      
  212.        if(deplact_v=1)
  213.          {
  214.           if(laby[i][j].est==0)
  215.             {
  216.               caseij.x++;
  217.               deplact_h=1;
  218.               deplact_v=0;                           
  219.             }
  220.            else if(laby[i][j].sud==0)
  221.             {
  222.               caseij.y++;
  223.               deplact_h=0;
  224.               deplact_v=1;
  225.             }
  226.            else if((laby[i][j].ouest==0) && (laby[i-1][j].est==0))
  227.             {
  228.               caseij.x--;
  229.               deplact_h=-1;
  230.               deplact_v=0;
  231.             }
  232.            else
  233.             {
  234.               caseij.y--;
  235.               deplact_h=0;
  236.               deplact_v=-1;
  237.             }
  238.          }
  239.        else if(deplact_v=-1)
  240.          {
  241.           if((laby[i][j].ouest==0) && (laby[i-1][j].est==0))
  242.             {
  243.               caseij.x--;
  244.               deplact_h=-1;
  245.               deplact_v=0;
  246.             }
  247.            else if((laby[i][j].nord==0) && (laby[i][j-1].sud==0))
  248.             {
  249.               caseij.y--;
  250.               deplact_h=0;
  251.               deplact_v=-1;
  252.             }
  253.           else if(laby[i][j].est==0)
  254.             {
  255.               caseij.x++;
  256.               deplact_h=1;
  257.               deplact_v=0;
  258.             }
  259.            else
  260.             {
  261.               caseij.y++;
  262.               deplact_h=0;
  263.               deplact_v=1;
  264.             }                     
  265.           }
  266.        else if(deplact_h=-1)
  267.          {
  268.           if(laby[i][j].sud==0)
  269.             {
  270.               caseij.y++;
  271.               deplact_h=0;
  272.               deplact_v=1;
  273.             }
  274.           else if(laby[i][j].ouest==0 && laby[i-1][j].est==0)
  275.             {
  276.               caseij.x--;
  277.               deplact_h=-1;
  278.               deplact_v=0;
  279.             }
  280.           else if(laby[i][j].nord==0 && laby[i][j-1].sud==0)
  281.             {
  282.               caseij.y--;
  283.               deplact_h=0;
  284.               deplact_v=-1;
  285.             }
  286.           else
  287.             {
  288.               caseij.x++;
  289.               deplact_h=1;
  290.               deplact_v=0;
  291.             }
  292.          }
  293.        else if(deplact_h=1)
  294.          {
  295.           if(laby[i][j].nord==0 && laby[i][j-1].sud==0)
  296.             {
  297.               caseij.y--;
  298.               deplact_h=0;
  299.               deplact_v=-1;
  300.             }
  301.           else if(laby[i][j].est==0)
  302.             {
  303.               caseij.x++;
  304.               deplact_h=1;
  305.               deplact_v=0;
  306.             }
  307.           else if(laby[i][j].sud==0)
  308.             {
  309.               caseij.y++;
  310.               deplact_h=0;
  311.               deplact_v=1;
  312.             }                   
  313.           else
  314.             {
  315.               caseij.x--;
  316.               deplact_h=-1;
  317.               deplact_v=0;
  318.             }
  319.                                          
  320.           } 
  321.           t++;   
  322.   }while(t<=20);//((caseij.x!=la && caseij.y!=lop)||(caseij.x!=0 && caseij.y!=0));
  323.  
  324.  
  325.   //====================Fin du programme============================           
  326.   pause();   
  327.   SDL_FreeSurface(bhorizontale);
  328.   SDL_FreeSurface(bverticale);
  329.   SDL_FreeSurface(ecran);
  330.   SDL_Quit();
  331.   return 0;
  332. }
  333. void pause()
  334. {
  335.      int continuer=1;
  336.      SDL_Event event;
  337.    
  338.      while(continuer)
  339.         {
  340.  SDL_WaitEvent(&event);
  341.          switch(event.type)
  342.             {
  343.               case SDL_QUIT : continuer = 0;
  344.             }
  345.         }
  346. }


Suis conscient que la programmation n'est pas très catholique mais prenez ça comme l'oeuvre d'un débutant qu'a essayer d'imaginer le truc de A à Z seul... jusqu'à maintenant...

 

AU niveau de mon do-while je changerai la condition plus tard à un "tant que tu n'est ni arrivé ni revenu à la case 0,0"

 

J'vous en supplie, trouvez mon erreur...

 


Message édité par kwaio le 11-05-2009 à 22:13:01
Reply

Marsh Posté le 11-05-2009 à 21:29:02   

Reply

Marsh Posté le 11-05-2009 à 22:32:05    

Mouais, erreur que tous les débutants sur cette planète et ailleurs ont fait : l'affectation en C est ==, pas =.
 
Edit: ouais et sinon ton algo pour créer le labyrinthe n'est pas terrible. À une époque, qui commence à être lointaine, j'avais fait un économiseur d'écran de ce type. L'algo de génération était un peu mieux foutu, du style :

  • Choisi un point d'entrée et un point de sortie.
  • Trace un chemin récusivement et aléatoirement jusqu'à ce que toutes les cases soient visitées une et une seule fois.
  • Quand tu tombes sur une impasse, dépile jusqu'à pouvoir avancer.


Ça donne des résultats bien plus réalistes et scotchant à regarder.


Message édité par tpierron le 11-05-2009 à 22:37:12
Reply

Marsh Posté le 11-05-2009 à 22:40:42    

Oui j'ai trouvé ce genre de trucs après mais comme j'ai dit, j'ai plus trop le temps...
je vérifie mes affectations/tests

 

SUPER ça marche
Merde c'était tout bête et je me suis cassé la tête tout le week end.
Merci beaucoup


Message édité par kwaio le 11-05-2009 à 22:42:30
Reply

Marsh Posté le 11-05-2009 à 22:46:08    

on a le droit de faire un "while( (condition) || (autre condition) )" ?
ça ne semble pas marcher...

 

J'aimerai qu'il s'arrete quand il a fini maintenant ^^

Message cité 1 fois
Message édité par kwaio le 11-05-2009 à 22:51:02
Reply

Marsh Posté le 11-05-2009 à 22:48:37    

Oui on a le droit. Le while() continuera tant qu'au moins l'une des deux conditions est vraie.

Reply

Marsh Posté le 11-05-2009 à 22:53:09    

kwaio a écrit :

on a le droit de faire un "while( (condition) || (autre condition) )" ?
ça ne semble pas marcher...


 
Effectivement, il ne termine pas non plus chez moi. Qui plus est pour éviter un segfault, il faut aussi changer la ligne 216 :

Code :
  1. SDL_FillRect(point, NULL, bleu[12*t]);


en

Code :
  1. SDL_FillRect(point, NULL, bleu[(12*t)%256]);


Reply

Marsh Posté le 11-05-2009 à 23:17:56    

AH, oui, ça évite les points blancs ou verts, pas bête, merci.
J'ai essayé de bidouiller mon "tant que" y'a un probleme.
Je continue de potasser.

Reply

Marsh Posté le 12-05-2009 à 01:00:55    

PAS moyen d'empécher la boucle d'etre infinie.
J'me suis planté où, cette fois ?

Reply

Marsh Posté le 12-05-2009 à 05:54:02    

Arf, je vois que dans ton code tu ne gardes pas la trace des cases visitées. C'est clair que tu vas boucler dans des cas comme celui-ci :

────┐
─ ▪ │
────┘


 
Bon, j'ai vraiment que ça à faire en ce moment. Je viens de dépoussiérer mon code qui devait dater de 1998. L'algo utilise une méthode de backtracking récursive pour la construction et la recherche. C'est ce qu'il y a de plus simple.

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <SDL/SDL.h>
  5. typedef uint8_t **     maze_t;
  6. typedef uint8_t *      mrow_t;
  7. #define    MAKE_POS(x, y)   ((y << 16) | (x))
  8. #define    BLOC_W           10
  9. #define    BLOC_H           10
  10. enum
  11. {
  12.     MZF_NORD  = 0x01,
  13.     MZF_EST   = 0x02,
  14.     MZF_SUD   = 0x04,
  15.     MZF_OUEST = 0x08,
  16.     MZF_NSOE  = 0x0f,
  17.     MZF_VISIT = 0x10
  18. };
  19. void pause();
  20. static int opposite[] = {0, MZF_SUD, MZF_OUEST, 0, MZF_NORD, 0, 0, 0, MZF_EST};
  21. maze_t alloc_maze(int w, int h)
  22. {
  23.     maze_t maze = calloc(w * h + h * sizeof *maze, 1);
  24.     mrow_t mem  = (mrow_t) (maze + h);
  25.     int    i;
  26.     memset(mem, MZF_NSOE, w * h);
  27.     for (i = 0; i < h; maze[i] = mem, mem += w, i ++);
  28.     return maze;
  29. }
  30. void SDL_DrawLine(SDL_Surface * ecran, uint32_t color, int x, int y, int x2, int y2)
  31. {
  32.     SDL_Rect r = {x, y, x2 - x + 1, y2 - y + 1};
  33.     SDL_FillRect(ecran, &r, color);
  34. }
  35. Uint32 SDL_PushTicks(Uint32 interval, void * unused)
  36. {
  37.     SDL_Event tick;
  38.     memset(&tick, 0, sizeof tick);
  39.     tick.type = SDL_USEREVENT;
  40.     SDL_PushEvent(&tick);
  41.     return interval;
  42. }
  43. int main(int argc,char *argv[])
  44. {
  45.     // Initialisation des nombres aléatoires
  46.     srand(time(NULL));
  47.     //Définition des variables
  48.     int w;                    // largeur du labyrinthe (verticale)
  49.     int h;                    // Longeur du labyrinthe (horizontale)
  50.     int t,i,j;                // Compteurs
  51.     int xs, ys;               // Position de départ
  52.     int xe, ye;               // Position de fin
  53.     w = argc > 1 ? atoi(argv[1]) : 40;
  54.     h = argc > 2 ? atoi(argv[2]) : 40;
  55.     fprintf(stderr, "Generating maze %dx%d...\n", w, h);
  56.     // Sélection d'un point d'entrée et de sortie
  57.     switch (rand() % 2) {
  58.     case 0: ys = 0; xs = rand() % w; ye = h - 1; xe = rand() % w; i = MZF_NORD;  break;
  59.     case 1: xs = 0; ys = rand() % h; xe = w - 1; ye = rand() % h; i = MZF_OUEST; break;
  60.     }
  61.     //Création du labyrinthe : matrice de cases
  62.     maze_t laby  = alloc_maze(w, h);
  63.     int *  stack = calloc(sizeof *stack, w * h);
  64.     laby[ys][xs] &= ~i;
  65.     laby[ye][xe] &= ~opposite[i];
  66.     stack[0] = MAKE_POS(xs, ys);
  67.     //Génération des portes via algo de backtracking récursif.
  68.     for (i = 0, j = 1; j > 0; i ++)
  69.     {
  70.         int x = stack[j - 1] & 0xffff;
  71.         int y = stack[j - 1] >> 16;
  72.         int f = 0;
  73.         laby[y][x] |= MZF_VISIT;
  74.         //On visite toutes les cellules avoisinantes de manière alélatoire
  75.         while (f != MZF_NSOE)
  76.         {
  77.             int dir = 1 << (rand() % 4); //Choisi une direction parmi les 4 possibles
  78.             int nx, ny;
  79.             //Ajuste si on est déjà passé par là
  80.             if (f & dir)
  81.             {
  82.                 if ((f & (dir-1)) < dir-1) while (f & dir) dir >>= 1;
  83.                 else                       while (f & dir) dir <<= 1;
  84.             }
  85.             switch (dir) {
  86.             case MZF_NORD:  nx = x; ny = y - 1; break;
  87.             case MZF_EST:   ny = y; nx = x + 1; break;
  88.             case MZF_SUD:   nx = x; ny = y + 1; break;
  89.             case MZF_OUEST: ny = y; nx = x - 1; break;
  90.             }
  91.             //Dèjà visité ou visitable ?
  92.             if (0 <= nx && nx < w && 0 <= ny && ny < h && ! (laby[ny][nx] & MZF_VISIT))
  93.             {
  94.                 //Visite cette cellule, en créant un chemin de (x, y) à (nx, ny)
  95.                 laby[y][x] &= ~dir;
  96.                 laby[ny][nx] &= ~opposite[dir];
  97.                 stack[j++] = MAKE_POS(nx, ny);
  98.                 break;
  99.             }
  100.             else f |= dir;
  101.         }
  102.         //On a visité toutes les cellules avoisinante: backtrack
  103.         if (f == MZF_NSOE) j --;
  104.     }
  105.     //===================Dessin=======================
  106.     SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
  107.     SDL_Surface * ecran = SDL_SetVideoMode(BLOC_W * w + 20, BLOC_H * h + 20, 32, SDL_HWSURFACE);
  108.     SDL_TimerID   timer;
  109.     SDL_WM_SetCaption("Labyrinthe", NULL);
  110.     //++++++++++++++Coloriage du fond++++++++++++++++++++
  111.     uint32_t back = SDL_MapRGB(ecran->format, 0,   0, 0);
  112.     uint32_t vert = SDL_MapRGB(ecran->format, 0, 255, 0);
  113.     uint32_t dead = SDL_MapRGB(ecran->format, 0, 128, 0);
  114.     SDL_FillRect(ecran, NULL, back);
  115.     //==================Affichage du labyrinthe=================
  116.     for (j = 0; j < h; j++)
  117.     {
  118.         for (i = 0; i < w; i++)
  119.         {
  120.             int f  = laby[j][i];
  121.             int x  = 10 + i * BLOC_W;
  122.             int y  = 10 + j * BLOC_H;
  123.             int x2 = x + BLOC_W - 1;
  124.             int y2 = y + BLOC_H - 1;
  125.             if (j > 0) f &= ~MZF_NORD;
  126.             if (i > 0) f &= ~MZF_OUEST;
  127.             laby[j][i] &= ~MZF_VISIT;
  128.             // Placement de points aux angles des murs pour avoir un dessin continu
  129.             if (f & MZF_NORD)  SDL_DrawLine(ecran, vert, x,  y,  x2, y);
  130.             if (f & MZF_EST)   SDL_DrawLine(ecran, vert, x2, y,  x2, y2);
  131.             if (f & MZF_SUD)   SDL_DrawLine(ecran, vert, x,  y2, x2, y2);
  132.             if (f & MZF_OUEST) SDL_DrawLine(ecran, vert, x,  y,  x,  y2);
  133.         }
  134.     }
  135.     SDL_UpdateRect(ecran, 0, 0, 0, 0);
  136.     timer = SDL_AddTimer(100, SDL_PushTicks, NULL);
  137.     //=====================Fin du dessin==============================
  138.     //===================Parcours=====================================
  139.     stack[0] = MAKE_POS(xs, ys);
  140.     j = 1;
  141.     while (! (xs == xe && ys == ye) && j > 0)
  142.     {
  143.         SDL_Event event;
  144.         SDL_WaitEvent(&event);
  145.         switch (event.type) {
  146.         case SDL_KEYDOWN:
  147.             if (event.key.state != SDL_PRESSED || event.key.keysym.sym != SDLK_ESCAPE)
  148.                 continue;
  149.         case SDL_QUIT:
  150.             j = -1; continue;
  151.         case SDL_USEREVENT:
  152.             break;
  153.         default:
  154.             continue;
  155.         }
  156.         int x = stack[j - 1] & 0xffff;
  157.         int y = stack[j - 1] >> 16;
  158.         int f = laby[y][x] & ~MZF_VISIT;
  159.         SDL_Rect path = {10 + x * BLOC_W, 10 + y * BLOC_H, BLOC_W, BLOC_H};
  160.         if (f & MZF_NORD)  path.y += 2, path.h -= 2;
  161.         if (f & MZF_OUEST) path.x += 2, path.w -= 2;
  162.         if (f & MZF_SUD)   path.h -= 2;
  163.         if (f & MZF_EST)   path.w -= 2;
  164.         SDL_FillRect(ecran, &path, vert);
  165.         SDL_UpdateRect(ecran, 0, 0, 0, 0);
  166.         laby[y][x] |= MZF_VISIT;
  167.         xs = x; ys = y;
  168.         //Avance dans le labyrinthe
  169.         while (f != MZF_NSOE)
  170.         {
  171.             int dir = 1 << (rand() % 4); //Choisi une direction parmi les 4 possibles
  172.             int nx, ny;
  173.             //Ajuste si on est déjà passé par là
  174.             if (f & dir)
  175.             {
  176.                 if ((f & (dir-1)) < dir-1) while (f & dir) dir >>= 1;
  177.                 else                       while (f & dir) dir <<= 1;
  178.             }
  179.             switch (dir) {
  180.             case MZF_NORD:  nx = x; ny = y - 1; break;
  181.             case MZF_EST:   ny = y; nx = x + 1; break;
  182.             case MZF_SUD:   nx = x; ny = y + 1; break;
  183.             case MZF_OUEST: ny = y; nx = x - 1; break;
  184.             }
  185.             //Dèjà visité ou visitable ?
  186.             if (0 <= nx && nx < w && 0 <= ny && ny < h && ! (laby[ny][nx] & MZF_VISIT))
  187.             {
  188.                 stack[j++] = MAKE_POS(nx, ny);
  189.                 break;
  190.             }
  191.             else f |= dir; t ++;
  192.         }
  193.         if (f == MZF_NSOE)
  194.         {
  195.             SDL_FillRect(ecran, &path, dead);
  196.             j --;
  197.         }
  198.     }
  199.     SDL_RemoveTimer(timer);
  200.     //====================Fin du programme============================
  201.     if (j == 0)
  202.     {
  203.         fprintf(stderr, "Parcours terminé...\n" );
  204.         pause();
  205.     }
  206.     SDL_FreeSurface(ecran);
  207.     SDL_Quit();
  208.     return 0;
  209. }
  210. void pause()
  211. {
  212.     int continuer = 1;
  213.     SDL_Event event;
  214.     while(continuer)
  215.     {
  216.         SDL_WaitEvent(&event);
  217.         switch(event.type) {
  218.         case SDL_KEYDOWN:
  219.         case SDL_QUIT: continuer = 0;
  220.         }
  221.     }
  222. }
  223. #ifdef    WIN32
  224. #include <windows.h>
  225. int WINAPI WinMain(
  226.     HINSTANCE hInstance,
  227.     HINSTANCE hPrevInstance,
  228.     LPSTR lpCmdLine,
  229.     int nCmdShow)
  230. {
  231.     return main(0, NULL);
  232. }
  233. #endif


Reply

Marsh Posté le 12-05-2009 à 19:45:07    

C'est bien joli, et sympa, même mais je n'ai aucune envie de faire un copier/collé du travail d'un autre, ni même de m'inspirer de sa technique.
J'assume la médiocrité de la méthode, les irrégularités de synthaxe, je souhaite juste que ça fonctionne.
 
Ceci dit, j'ai rendu mon travail aujourd'hui =)

Reply

Marsh Posté le 12-05-2009 à 19:45:07   

Reply

Marsh Posté le 12-05-2009 à 20:19:12    

Arf, c'était pour un TP, je pensais que c'était pour le fun.
 
Sinon, par curiosité, comment as-tu résolu le problème de bouclage (si tu as eu le temps de le résoudre [:dawa] ) ?

Reply

Marsh Posté le 13-05-2009 à 15:00:27    

J'ai aps eu le temps.
J'avais genre 3 devoirs à rendre pour le lendemain.
càd mon projet d'info plus deux autres travaux de groupes.
Donc j'ai encore le temps de réparer ça pour la soutenance, mais sinon j'ai rendu un programme qui se ferme tout seul une fois fini.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed