begin process at 2012 02 13 13:23:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Bug d'execution d'un demineur


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Bug d'execution d'un demineur

vendredi 3 août 2007 à 00:45:55 | Bug d'execution d'un demineur

julien_boss

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
vendredi 3 août 2007 à 10:54:25 | Re : Bug d'execution d'un demineur

juju12

Question stupide mais t'as bien  DEMPLAYER_UNKNOWN différent de DEMPLAYER_0 en valeur ? Sinon c'est normal que ça plante.
vendredi 3 août 2007 à 13:10:22 | Re : Bug d'execution d'un demineur

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Si tu mets :
if(bombArround == DEMPLAYER_0)     /*\ BUG LA \*/
{ ...}

En commentaire, ça plante pas ?

Tu as bien un message d'erreur, non ? Peux-tu le donner ?

Eventuellement, montre nous comment tu alloues ce que tu passe comme argument grid, mais j'imagine que tu l'initialise donc le problème se manifesterais avant...

Zarb.
vendredi 3 août 2007 à 14:05:03 | Re : Bug d'execution d'un demineur

julien_boss

juju12> oui les deux define ont des valeurs différentes

rt15> en effet si je mets tout ce passage en commentaire le programme ne plante plus. Comme erreur lors de l'exécution j'ai un message du "visual studio just-in-time debugger", qui me dit que "an unhandled win32 exception occurred in Demineur-console.exe [3608]" (c'est bien un message d'erreur qui apparait lors de l'execution hein, pas de prob à la compilation).

Voilà comment j'initialise ma grille :
    int ***grid;
    grid = new int**[2];
   
    grid[0] = new int*[x];
    grid[1] = new int*[x];
   
    for(int i=0; i<x; i++)
    {
        grid[0][i] = new int[y];
        grid[1][i] = new int[y];
    }

Je ne sais d'ailleurs pas si la méthode est la bonne, j'ai galéré pour arriver à ca ; mais visiblement ca marche puisque je peux afficher la grille (j'ai créé une fonction printGrid() qui fonctionne).
vendredi 3 août 2007 à 15:52:32 | Re : Bug d'execution d'un demineur

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
J'adore ton message d'erreur... Très instructif... normalement on peut tirer au moins quelque chose du code d'erreur, mais là, 3806...

Mais je crois que j'ai trouvé.

Remplace ça :

   if(x>gx || y>gy || x<0 || y<0) return false;

par ça :

   if(x>=gx || y>=gy || x<0 || y<0) return false;

La dernière case de ton tableau à l'indice gx - 1 s'il est de taille gx.
vendredi 3 août 2007 à 19:53:13 | Re : Bug d'execution d'un demineur

julien_boss

Oui merci pour la correction, je n'y avais pas fait attention, mais le problème reste le même
vendredi 3 août 2007 à 20:42:46 | Re : Bug d'execution d'un demineur
vendredi 3 août 2007 à 20:45:11 | Re : Bug d'execution d'un demineur

rt15

Membre Club Administrateur CodeS-SourceS
Erf... Je recommence. Ta fonction Deminor_IsBomb doit être protégée de la même manière. Ton IDE as pas de débugueur permettant de voir le contenu des variables ?
vendredi 3 août 2007 à 20:51:37 | Re : Bug d'execution d'un demineur

julien_boss

Mais vui quel con :D
Ca m'apprendra à faire plus attention, merci bcp


Cette discussion est classée dans : grid, gx, gy, deminor, bombarround


Répondre à ce message

Sujets en rapport avec ce message

Grid control [ par cinyasoumgue ] Bonjour( cela prouve que j' ai bien lu votre message qui nous concernait tous !),voila tout d'abord je doit preciser que j'ai deja posé la question qu Imprimer une flex grid [ par neogeocortex ] j'urai besoin d'imprimer sur papier une flex grid dans un programme en VC++ j'ai déja réussi a imprimer une edit box mais j ne sais pas koi faire avec Fuites de mémoire ! [ par Darksheep ] Bonjour , Je commence a programmer des jeux , mais malheureusement j'ai manifestement quelques problèmes : quand je le lance deux ou trois fois , cela VC8 et Stingray: DLL [ par OmniXXX ] Desole de l'anglais mais je ne veux pas reecrire toute ma question ------------------- Alright, this is not code oriented and so I'll make it brieft: conservation du taille du colonne du CTRL GRID [ par dorras7 ] Bonsoir ,Est ce quelqu'un savoir comment  conserver la taille du colonne d'un data grid(BCGGRID ctrl) c'est à dire lorsque le grid est affiché dans un (C++)Afficher les données de BD ds BCG Grid [ par khaliloenit ] Bonjour, Je suis en cours de développement d'une application en C++ et je voudrais afficher les données de la base de données (accès, sqlserver, oracl tri d'un tableau avec Qt [ par anouerensi ] Salut, s'il vous plait aidez moi a trouver une solution pour acceder aux éléments de ce tableau afin de le trier en utilisant la methode de tri Shell. entrer des valeur a un String Grid [ par algerianito ] bonsoir a tous , je veux savoir est ce qu'il y a un moyen pour faire entrer un tableau de 2 dimension a l'execution d'un programme c++Builder a traver


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,221 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales