#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#define TAILLE 5
typedef struct
{
int x, y;
} cell;
typedef struct
{
cell *pilexy;
int max_TAILLE;
int haut_pile;
} pile;
int creer();
int voisine_libre(int [TAILLE][TAILLE], int, int);
void affichage(int [TAILLE][TAILLE]);
void affichagesdl(int [TAILLE][TAILLE]);
void new_pile(pile *, int);
void kill_pile(pile *);
cell pile_pop(pile *);
void pile_push(pile *, int, int);
int creer()
{
cell labyavant,laby;
int i, j, n=0, num_labyrinthe, nb_visite;
int labyrinthe[TAILLE][TAILLE];
pile s;
new_pile(&s, (TAILLE * TAILLE));
num_labyrinthe = (TAILLE-2) * (TAILLE-2);
nb_visite = 1;
for (i = 0; i < TAILLE; i += 1)
for (j = 0; j < TAILLE; j += 1)
{
if (i == 0 || j == 0 || i == (TAILLE - 1) ||
j == (TAILLE - 1))
labyrinthe[i][j] = -1;
else
labyrinthe[i][j] = 15;
}
laby.x = 1;
laby.y = 1;
while (nb_visite != num_labyrinthe)
{
n = voisine_libre(labyrinthe, laby.x, laby.y);
while (n != -1)
{
switch (n)
{
case 0:
labyrinthe[laby.y][laby.x] -= 1;
labyrinthe[laby.y - 1][laby.x] -= 4;
labyavant.x = laby.x;
labyavant.y = laby.y;
laby.y -= 1;
break;
case 1:
labyrinthe[laby.y][laby.x] -= 2;
labyrinthe[laby.y][laby.x + 1] -= 8;
labyavant.x = laby.x;
labyavant.y = laby.y;
laby.x += 1;
break;
case 2:
labyrinthe[laby.y][laby.x] -= 4;
labyrinthe[laby.y + 1][laby.x] -= 1;
labyavant.x = laby.x;
labyavant.y = laby.y;
laby.y += 1;
break;
case 3:
labyrinthe[laby.y][laby.x] -= 8;
labyrinthe[laby.y][laby.x - 1] -= 2;
labyavant.x = laby.x;
labyavant.y = laby.y;
laby.x -= 1;
break;
}
pile_push(&s, laby.x, laby.y);
nb_visite += 1;
n = voisine_libre(labyrinthe, laby.x, laby.y);
}
laby = pile_pop(&s);
}
affichage(labyrinthe);
affichagesdl(labyrinthe);
kill_pile(&s);
return labyrinthe;
}
int voisine_libre(int labyrinthe[TAILLE][TAILLE], int x, int y)
{
int nord, est, sud, ouest;
int rdm;
nord = (labyrinthe[y - 1][x] == 15) ? 1 : 0;
est = (labyrinthe[y][x + 1] == 15) ? 1 : 0;
sud = (labyrinthe[y + 1][x] == 15) ? 1 : 0;
ouest= (labyrinthe[y][x - 1] == 15) ? 1 : 0;
if ((nord | est | sud | ouest) == 0)
return -1;
for (;;)
{
rdm = rand() % 4;
switch (rdm)
{
case 0:
if (nord == 1) return 0;
case 1:
if (est == 1) return 1;
case 2:
if (sud == 1) return 2;
case 3:
if (ouest== 1) return 3;
}
}
}
void affichage(int a[TAILLE][TAILLE])
{
int i, j;
for (i = 0; i < TAILLE; i += 1)
{
for (j = 0; j < TAILLE; j += 1)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}
void affichagesdl(int labyrinthe[TAILLE][TAILLE])
{
//SDLSDLSDL
}
void new_pile(pile *s, int max_TAILLE)
{
s->pilexy = (cell *)calloc(max_TAILLE, sizeof(cell));
s->max_TAILLE = max_TAILLE;
s->haut_pile = 0;
}
void kill_pile(pile *s)
{
free(s->pilexy);
s->max_TAILLE = -1;
s->haut_pile = -1;
}
cell pile_pop(pile *s)
{
cell c;
c = s->pilexy[s->haut_pile];
s->haut_pile -= 1;
return c;
}
void pile_push(pile *s, int x, int y)
{
s->pilexy[s->haut_pile].x = x;
s->pilexy[s->haut_pile].y = y;
s->haut_pile += 1;
}
Ceci ne comprend donc pas l'interface graphique, je ferais peut être un autre post pour cela mais pour l'instant chaque chose en son temps.