Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C / SDL] Démineur

pourquoi ca marche pas?

    15 juin 2006 à 10:42:15

    Bonjour à tous les zéros.
    JE vous explique mon problème : je suis actuellement en train de coder un démineur en C avec la lib SDL. Jusque là pas de souci ^^ .
    J'en suis actuellement au placement aléatoire des mines. Et c'est la que le problème arrive. Initialement, il devrait y avoir 10 mines sur la carte (c'est très mal dosé mais c'est pour voir si ca marche...). Or le soucis, c'est qu'il n'y a pas toujours 10 mines. Ce nombre varie entre 6 et o_O . Quand je me passe du placement aléatoire (i.e. quand je les place moi-même ^^ ), y'a pas de souci, j'en ai toujours 10.
    Je vous file donc mon source pour que vous puissiez m'aider.
    Etant donné que le code est relativement long (je dis bien relativement :lol: ), je préfère vous dire que le problème ce situe à partir de la balise mine (en espèce de truc qui ressemeble à ca : // ---------------- Mines ---------------- et que j'utilise pour clarifier le code), ca vous évite de chercher vous même.


    EDIT : je met la partie concernée ici pour que les flemmard aillent droit au but ^^ :

    SDL_Surface *mine; // une seule surface que l'on blittera plusieur fois
            mine = SDL_CreateRGBSurface(SDL_HWSURFACE, 3, 3, 32, 0, 0, 0, 0);
            SDL_FillRect(mine, NULL, SDL_MapRGB(ecran->format, 255, 0, 0));

            SDL_Rect positionMine[NOMBREMINE]; // un tableaa contenant la position des mines
            SDL_Rect temp[NOMBREMINE]; // le même tableau mais temporaire pour vérifier que les mines ne se trouve pas deux fois au même endroit ^^

            srand(time(NULL)); // on initialyse l'alea


            int i, j; // les variables de parcours de boucle for
            long nombreAleatoireX, nombreAleatoireY;

            for(i=0; i<NOMBREMINE; i++)
            {
                    for(j=0; j<=i; j++) // cette boucle sert à comparer les valeurs pour zapper les redondance dans les positions des mines
                    {
                            do
                            {
                                    nombreAleatoireX = (rand() % (MAX - MIN + 1)) + MIN;
                            }while(nombreAleatoireX == temp[j].x);
           
                            do
                            {
                                    nombreAleatoireY = (rand() % (MAX - MIN + 1)) + MIN;

                            }while(nombreAleatoireY == temp[j].y);

                    }

                            temp[i].x = nombreAleatoireX;
                            temp[i].y = nombreAleatoireY;
            }
           

            for(i=0; i<NOMBREMINE; i++)
            {
                    positionMine[i].x = ((23 * temp[i].x) + (TAILLECASE / 2));
                    positionMine[i].y = ((23 * temp[i].y) + (TAILLECASE / 2));
                    SDL_BlitSurface(mine, NULL, ecran, &positionMine[i]); // a la fin on ne les blittera qu'en certain cas mais la c'est pour vérifier ...
            }
                   

           
           
           
            SDL_Flip(ecran);


    et ca c'est le code en entier :


    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>


    // ----------------- Settings --------------- //
    #define NOMBRECASE 10
    #define TAILLECASE 21 // les cases feront 25x25 px
    #define HAUTEUR (NOMBRECASE * (TAILLECASE + 2) + 2)
    #define LARGEUR (NOMBRECASE * (TAILLECASE + 2) + 2)
    #define NOMBREMINE 10
    #define MIN 1
    #define MAX 10
    // ---------------- **Settings** -------------- //




    int main(int argc, char *argv[])
    {
            // ------------------------- Init SDL ------------------------ //
            SDL_Init(SDL_INIT_VIDEO);
            SDL_WM_SetCaption("Démineur", NULL);

                    // --------------- écran --------------- //
                    SDL_Surface *ecran;
                    ecran = SDL_SetVideoMode(LARGEUR, HAUTEUR, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                    // -------------- **ecran** -------------- //
                    //
                    // -------------- Les cases ------------ //
                    SDL_Surface *cases;
                    cases = SDL_CreateRGBSurface(SDL_HWSURFACE, TAILLECASE, TAILLECASE, 32, 0, 0, 0, 0);
                    SDL_FillRect(cases, NULL, SDL_MapRGB(ecran->format, 150, 150, 150));
                   
                    SDL_Rect positionCase;
                    int x, y;
                    for(x=0; x<NOMBRECASE; x++)
                    {
                            for(y=0; y<NOMBRECASE; y++)
                            {
                                    positionCase.x = (x * (TAILLECASE + 2)) + 2;
                                    positionCase.y = (y * (TAILLECASE + 2)) + 2;
                                    SDL_BlitSurface(cases, NULL, ecran, &positionCase);
                                   
                            }
                    }
                    SDL_Flip(ecran);
                    // -------------- **les cases** ----------- //

            // ------------------------- **Init SDL** ------------------------- //
           

            // ---------------------------- Les mines -------------------------- //
            SDL_Surface *mine; // une seule surface que l'on blittera plusieur fois
            mine = SDL_CreateRGBSurface(SDL_HWSURFACE, 3, 3, 32, 0, 0, 0, 0);
            SDL_FillRect(mine, NULL, SDL_MapRGB(ecran->format, 255, 0, 0));

            SDL_Rect positionMine[NOMBREMINE]; // un tableaa contenant la position des mines
            SDL_Rect temp[NOMBREMINE]; // le même tableau mais temporaire pour vérifier que les mines ne se trouve pas deux fois au même endroit ^^

            srand(time(NULL)); // on initialyse l'alea


            int i, j; // les variables de parcours de boucle for
            long nombreAleatoireX, nombreAleatoireY;

            for(i=0; i<NOMBREMINE; i++)
            {
                    for(j=0; j<=i; j++) // cette boucle sert à comparer les valeurs pour zapper les redondance dans les positions des mines
                    {
                            do
                            {
                                    nombreAleatoireX = (rand() % (MAX - MIN + 1)) + MIN;
                            }while(nombreAleatoireX == temp[j].x);
           
                            do
                            {
                                    nombreAleatoireY = (rand() % (MAX - MIN + 1)) + MIN;

                            }while(nombreAleatoireY == temp[j].y);

                    }

                            temp[i].x = nombreAleatoireX;
                            temp[i].y = nombreAleatoireY;
            }
           

            for(i=0; i<NOMBREMINE; i++)
            {
                    positionMine[i].x = ((23 * temp[i].x) + (TAILLECASE / 2));
                    positionMine[i].y = ((23 * temp[i].y) + (TAILLECASE / 2));
                    SDL_BlitSurface(mine, NULL, ecran, &positionMine[i]); // a la fin on ne les blittera qu'en certain cas mais la c'est pour vérifier ...
            }
                   

           
           
           
            SDL_Flip(ecran);
                   
            // ------------------------ **Les mines** ------------------------//
           
           
           

            // --------------------- boucle ppale --------------------- //

            SDL_Event event;
            int bouclePrincipale = 1;
            while(bouclePrincipale)
            {
                    SDL_WaitEvent(&event);
                    switch(event.type)
                    {
                            case SDL_QUIT:
                                    bouclePrincipale = 0;
                                    break;
                            case SDL_KEYDOWN:
                                    switch(event.key.keysym.sym)
                                    {
                                            case SDLK_ESCAPE:
                                                    bouclePrincipale = 0;
                                                    break;
                                            default:
                                                    break;
                                    }
                            default:
                                    break;
                    }
            }

            // ------------------- **Boucle ppale**----------------------- //
           
            // ------------------- Phase de Nettoyage ---------------------- //
            SDL_FreeSurface(cases);
                                           
            SDL_Quit();
            return EXIT_SUCCESS;
            // ------------------------- **phase de nettoyage** ----------------- //
    }


    Merci d'avance pour vos réponse...
    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2006 à 16:49:07

      ça met longtemps à donner les position de tes mines ??
      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2006 à 16:55:07

        Nan, c'est quasi immédiat pourquoi?
        • Partager sur Facebook
        • Partager sur Twitter
          15 juin 2006 à 17:13:17

          Tu pourrais faire un truc du style:

             

          /* Énumération */
             enum{VIDE = 0, FLAG = 1, BOMB = 2, CLICKER = 3, ONCLICK = 4};

               srand(time(NULL));
               int nbBomb = 0;
               int i = 0, j = 0;
               nbBomb = ((NB_BLOC_HAUTEUR * NB_BLOC_LARGEUR) / 10);
               int NbBomb = 0;
               
               int placeBombX = 0;
               int placeBombY = 0;

           do{
               placeBombX = rand() % NB_BLOC_LARGEUR;
               placeBombY = rand() % NB_BLOC_HAUTEUR;
               
               if(carte[placeBombX][placeBombY].case == BOMB)//si il y a déja une bombe
                   continue;
               else
                carte[placeBombX][placeBombY].case = BOMB;
               
               NbBomb++;       
               }while(NbBomb != nbBomb);//tant que le nombre de bomb n'Est pas égale au nombre de bomb voulu


          • Partager sur Facebook
          • Partager sur Twitter
            15 juin 2006 à 17:38:17

            C'est cool comme solution mais le problème, c'est qu'il faut que je recommence de zéro pasque j'ai pas vraiment de tableau carte, j'ai qu'un tableau pour la position des mines... Donc je l'appliquerai que si personne comprend pourquoi mon code merdouille...
            Merci de ta solution...
            • Partager sur Facebook
            • Partager sur Twitter

            [C / SDL] Démineur

            × 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