Bonjour,
je suis entrain de reproduire un demineur. Je crée dynamiquement un tableau tridimensionnel ; tridimensionnel car ce tableau contient 2 "grilles" de demineur - de 2 dimensions chacune. L'une des grilles contient l'emplacement des bombes, et l'autre est celle que le joueur voit (le nombre de bombes entourant telle case, si cette case est une bombe, si elle est vide, si le joueur n'a pas encore cliqué dessus...).
J'en suis à l'algorithme de clique sur une case. Je vérifie d'abord si la case est une bombe, puis si le joueur a déjà cliqué sur la case, auxquels cas je retourne la fonction. Ensuite je vérifie combien de bombes sont situés autour de la case, et je change l'état de cette case en fonction du nombre trouvé.
S'il n'y a aucune bombe aux alentours, je simule des cliques sur toutes les cases aux alentours par récursivité (comme cela se passe dans le vrai demineur, enfaite). C'est là que ca coince à l'éxécution, j'obtiens un message d'erreur et le programme plante. Je ne pense pas que ce soit du à une surcharge de la pile.
Voici le code de la fonction qui simule un clique sur une case (x;y) :
bool Deminor_ClickleftGrid(int ***grid, int gx, int gy, int x, int y)
{
//Vérifie qu'on a pas cliqué en dehors de la grille
if(x>gx || y>gy || x<0 || y<0) return false;
//Verifie qu'on a pas cliqué sur une bombe
if(Deminor_IsBomb(grid, gx, gy, x, y))
{
grid[1][x][y]=DEMPLAYER_BOMBON;
return false;
}
//Vérifie qu'on a pas déjà cliqué sur cette case
if(grid[1][x][y] != DEMPLAYER_UNKNOWN) return false;
/**** Calcule le nombre de mines aux alentours ****/
int bombArround = DEMPLAYER_0;
if(Deminor_IsBomb(grid, gx, gy, x-1, y-1)) bombArround++;
if(Deminor_IsBomb(grid, gx, gy, x, y-1)) bombArround++;
if(Deminor_IsBomb(grid, gx, gy, x+1, y-1)) bombArround++;
if(Deminor_IsBomb(grid, gx, gy, x+1, y)) bombArround++;
if(Deminor_IsBomb(grid, gx, gy, x+1, y+1)) bombArround++;
if(Deminor_IsBomb(grid, gx, gy, x, y+1)) bombArround++;
if(Deminor_IsBomb(grid, gx, gy, x-1, y+1)) bombArround++;
if(Deminor_IsBomb(grid, gx, gy, x-1, y)) bombArround++;
grid[1][x][y] = bombArround;
if(bombArround == DEMPLAYER_0)
/*\ BUG LA \*/ {
Deminor_ClickleftGrid(grid, gx, gy, x-1, y-1);
Deminor_ClickleftGrid(grid, gx, gy, x, y-1);
Deminor_ClickleftGrid(grid, gx, gy, x+1, y-1);
Deminor_ClickleftGrid(grid, gx, gy, x+1, y);
Deminor_ClickleftGrid(grid, gx, gy, x+1, y+1);
Deminor_ClickleftGrid(grid, gx, gy, x, y+1);
Deminor_ClickleftGrid(grid, gx, gy, x-1, y+1);
Deminor_ClickleftGrid(grid, gx, gy, x-1, y);
}
/****************************************************/
return true;
}
Voilà, en esperant que vous y voyez plus clair que moi :)
Merci