IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Aide : Erreur démineur


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Aide : Erreur démineur
    Bonjour, ma copine à un projet et souhaite faire un programme en c. Je lui ai proposé de faire un démineur (que je possédais moi même avant), mais celui ci n'avait jamais été fonctionnel. Je demande alors votre aide. Le problème viens de l'affichage de la mine. Je vous laisserai juger par vous même :
    Je ne souhaite pas qu'il sois parfait mais que ce problème sois réglé, j'y suis passé toute l'aprèm sans trouver :/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    char JEU[10][10];//grille de jeu
    int i,j;//i les lignes, j les colonnes
    char MINES[10][10];//la grille avec les mines
    int N;//Nombre de mines autour
    int NbMines;//le nombre de mines choisi par le joueur
    int choix;//le choix effectué par le joueur pour découvrir ou placer un drapeau
     
     
    //////////////////////////////
    // FONCTION INITIALISATION ///
    //////////////////////////////
    void Init()
    {
        for(i=0; i<10; i++)
        {
            for(j=0; j<10; j++)
            {
                JEU[i][j]='-';//' 'implique case cachée
                MINES[i][j]='0';
            }
        }
    }
     
    ///////////////////////////////
    // FONCTION PLACER LES MINES //
    ///////////////////////////////
    void PlaceMines()
    {
        int CompteMines;//compteur de mines
        for (CompteMines=0; CompteMines<NbMines; CompteMines++)
        {
            i=rand()%10;//on choisit la ligne de manière aléatoire
            j=rand()%10;//on choisit la colonne de manière aléatoire
            if(MINES[i][j]=='0')//On vérifie que la case est libre
            {
                MINES[i][j]='M';//on place un M pour indiquer qu'il y a une mine
            }
     
            else
            {
                NbMines++;//Sinon, il y a déjà un M et il faut faire un tour de plus
            }
        }
    }
     
    ////////////////////////////////////////
    // FONCTION AFFICHER LA GRILLE DE JEU //
    ////////////////////////////////////////
    void AfficheJeu()
    {
        puts ("                         ******************************");
        puts ("                         *                            *");
        puts ("                         *     Demineur Projet ISN    *");
        puts ("                         *                            *");
        puts ("                         ******************************\n");
     
        printf("   | 1  2  3  4  5  6  7  8  9  10\n");
        printf("___|______________________________\n");
        for(i=0; i<10; i++)
        {
            if(i<9)
                printf(" %d | ",i+1);
            else
                printf("%d | ",i+1);
            for(j=0; j<10; j++)
            {
                printf("%c  ",JEU[i][j]);
            }
            printf("\n");
        }
    }
     
    /////////////////////////////////////////////
    // FONCTION CALCULER LE NB DE MINES AUTOUR //
    /////////////////////////////////////////////
    int NbMinesAutour()
    {
        N=0;
        if(MINES[i][j]=='M')
        {
            printf("Vous avez perdu !!!\n\n");
            system("PAUSE");
            printf("   | 1  2  3  4  5  6  7  8  9  10\n");
            printf("___|______________________________\n");
            for(i=0; i<10; i++)
            {
                if(i<9)
                    printf(" %d | ",i+1);
                else
                    printf("%d | ",i+1);
                for(j=0; j<10; j++)
                    printf("%c  ",MINES[i][j]);
                printf("\n");
            }
     
        }
        else
        {
            if (i==0)
            {
                if (j==0)
                {
                    if(MINES[i][j+1]=='M')
                        N++;
                    if(MINES[i+1][j]=='M')
                        N++;
                    if(MINES[i+1][j+1]=='M')
                        N++;
                }
                else
                {
                    if(j==10)
                    {
                        if(MINES[i][j-1]=='M')
                            N++;
                        if(MINES[i+1][j-1]=='M')
                            N++;
                        if(MINES[i+1][j]='M')
                            N++;
                    }
                    else
                    {
     
                        if(MINES[i][j-1]=='M')
                            N++;
                        if(MINES[i][j+1]=='M')
                            N++;
                        if(MINES[i+1][j-1]=='M')
                            N++;
                        if(MINES[i+1][j]=='M')
                            N++;
                        if(MINES[i+1][j+1]=='M')
                            N++;
                    }
                }
            }
            else
            {
                if (i==10)
                {
                    if (j==0)
                    {
                        if(MINES[i-1][j]=='M')
                            N++;
                        if(MINES[i-1][j+1]=='M')
                            N++;
                        if(MINES[i][j+1]=='M')
                            N++;
                    }
                    else
                    {
                        if(j==10)
                        {
                            if(MINES[i-1][j-1]=='M')
                                N++;
                            if(MINES[i-1][j]=='M')
                                N++;
                            if(MINES[i][j-1]=='M')
                                N++;
                        }
                        else
                        {
                            if(MINES[i-1][j-1]=='M')
                                N++;
                            if(MINES[i-1][j]=='M')
                                N++;
                            if(MINES[i-1][j+1]=='M')
                                N++;
                            if(MINES[i][j-1]=='M')
                                N++;
                            if(MINES[i][j+1]=='M')
                                N++;
                        }
                    }
                }
                else
                {
                    if(MINES[i-1][j-1]=='M')
                        N++;
                    if(MINES[i-1][j]=='M')
                        N++;
                    if(MINES[i-1][j+1]=='M')
                        N++;
                    if(MINES[i][j-1]=='M')
                        N++;
                    if(MINES[i][j+1]=='M')
                        N++;
                    if(MINES[i+1][j-1]=='M')
                        N++;
                    if(MINES[i+1][j]=='M')
                        N++;
                    if(MINES[i+1][j+1]=='M')
                        N++;
                }
            }
     
     
        }
        return (N);
    }
     
    //////////////////////////////////////////////////////////
    // FONCTION JOUER dévoiler une case ou placer un drapeau //
    //////////////////////////////////////////////////////////
    void Jouer()
    {
        char NbMinesTxt[2]; // nombre de mines aux alentours
        switch (choix)
        {
        case 1 :
            NbMinesAutour();
            if (N!=0)//Il y a des mines autour
            {
                printf("%d\n\n",N);
     
                sprintf(NbMinesTxt,"%d",N);
                JEU[i][j]=NbMinesTxt[0];
            }
            else//Il n'y a pas de mines autour
            {
                JEU[i][j]='0';
                for(i=i-1; i<i+2; i++)
                {
                    for(j=j-1; j<j+2; j++)
                        NbMinesAutour();
                }
            }
            break;
        case 2 :
            JEU[i][j]='D';
            break;
        }
    }
     
    ///////////////////////////////////////////////////////////////
    // FONCTION CHOISIR On demande au joueur de choisir une case //
    ///////////////////////////////////////////////////////////////
    void Choisir()
    {
        printf("\n\nVeuillez entrer la case choisie (numero de ligne [espace] numero de colonne) :\t");
        scanf("%d %d",&i,&j);
        printf("Vous avez choisi la case (%d,%d).\n Que voulez-vous faire ?\n\n",i,j);
        i=i-1;
        j=j-1;
        printf("\t1. Decouvrir une case\n");
        printf("\t2. Placer un drapeau");
        do
        {
            printf("\t\tVotre choix : ");
            scanf("%d",&choix);
        }
        while (choix<0 || choix>2);
    }
    ////////////////////////////////////////////////////////////////////////////////
    int main()
    {
        //Afficher le début du jeu
        system ("color F0");
        system ("mode con LINES=50 COLS=80");
     
     
        puts ("                         ******************************");
        puts ("                         *                            *");
        puts ("                         *     Demineur Projet ISN    *");
        puts ("                         *                            *");
        puts ("                         ******************************\n");
     
     
        Init();
     
        printf("Coucouuu c'est la chatoune\n"); //Inserer votre texte !!!
        printf("\nAppuyer sur Entree :  ");
        scanf("A");
        Commencer();
     
        return 0;
    }
     
    void Commencer ()
    {
        system("cls");
        puts ("                         ******************************");
        puts ("                         *                            *");
        puts ("                         *     Demineur Projet ISN    *");
        puts ("                         *                            *");
        puts ("                         ******************************\n");
        int c;//compteur
        srand(time(NULL));
     
        do
        {
            printf("\nCombien de mines voulez-vous ?\n\n");
            scanf("%d",&NbMines);
        }
        while(NbMines>=30);
        printf("\n\nD'accord, vous avez choisi de jouer avec %d mines\n\n",NbMines);
        PlaceMines();
        /*printf("Voici la grille des mines pour controle:\n");
        for(i=0; i<10; i++)
        {
            printf("\t\t\t");
            for(j=0; j<10; j++)
            {
                printf("%c  ",MINES[i][j]);
            }
            printf("\n");
        }*/
        printf("Voici votre grille : A vous de jouer !\n\n");
        system ("cls");
        AfficheJeu();
     
        for(c=0; c<(100-NbMines); c++)
        {
            Choisir();
            Jouer();
            AfficheJeu();
        }
        printf("\n\n\t\tBravo vous avez gagné !");
     
        system("pause");
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Salut

    Il faut déjà commencer par régler les warnings à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $gcc -Wall -Wextra demineur.c 
    demineur.c: In function ‘NbMinesAutour’:
    demineur.c:122: warning: suggest parentheses around assignment used as truth value
    demineur.c: In function ‘main’:
    demineur.c:278: warning: implicit declaration of function ‘Commencer’
    demineur.c: At top level:
    demineur.c:284: warning: conflicting types for ‘Commencer’
    demineur.c:278: warning: previous implicit declaration of ‘Commencer’ was here
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Coucouuu c'est la chatounen");
    Hum hum :p

    A l'exécution :
    sh: cls: command not found
    Je suis sous Mac Os X avec bash.

    Puis en souhaitant découvrir la case (1,1):
    sh: PAUSE: command not found
    et ensuite une boucle infinie avec :
       | 1  2  3  4  5  6  7  8  9  10
    ___|______________________________
     1 | 0  0  0  0  0  0  0  0  0  0  
     2 | 0  0  M  M  0  0  0  M  0  0  
     3 | M  0  0  0  0  0  0  0  0  0  
     4 | M  0  0  0  0  0  0  0  0  0  
     5 | 0  0  0  0  0  0  0  0  M  0  
     6 | M  0  0  0  0  0  0  0  0  0  
     7 | 0  0  0  0  0  M  0  0  0  0  
     8 | 0  0  0  0  M  0  0  0  0  0  
     9 | 0  0  0  0  0  0  0  0  0  0  
    10 | 0  0  0  0  0  0  0  0  M  0  
    Vous avez perdu !!!
    
    sh: PAUSE: command not found
    s'affichant à chaque itération. En regardant le code, elle n'est peut être pas infinie, elle doit faire 100 itérations...

    En regardant un peu le code, il y a des étrangetés de conception : la fonction commencer permet de terminer si on gagne, terminer si on perd est dans une autre fonction où on se demande bien ce que ça fait là, des variables globales pour i et j ( ) ce qui donne des aberrations (à mon sens) où une fonction telle que NbMinesAutour() ne prend pas de paramètres car travaillant avec un numéro de case fixée par des variables globales, des phrases comme "NbMines++;//Sinon, il y a déjà un M et il faut faire un tour de plus" (euh non : on augmente le nombre de mines d'un point de vue sémantique là....), etc.

    Je ne jugerai pas le fait de faire un projet en reprenant le code d'un autre, mais il y a là pas mal de travail pour arriver à quelque chose de nif nif qui méritera une bonne note. Le problème n'est pas juste un petit problème d'affichage de la mine, c'est une base mais elle a besoin d'être nettoyé.

    Il y a eu il y a peu une discussion sur jeu de démineur, tu pourrais le regarder : http://www.developpez.net/forums/d13...-jeu-demineur/

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    printf("Coucouuu c'est la chatoune\n");
    Mdrr oublier de le virer ^^

    Après les system ("PAUSE") et cls ne sont pas fonctionnelle sur mac mais la n'es pas la question c'est quand faite bien que il y est ses warning (dont je n'arrive pas a résoudre) c'est que après avoir choisir un position (peu importe laquelle) le programme me dit que j'ai perdu et le répette indéfiniment. Je ne trouve pas la source de cette erreur de boucle :/ ( le pause juste après le vous avez perdu était pour trouver sur quel ligne de code l'erreur se trouvait)

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    A la ligne 122, le test est fait avec = et non ==.
    La fonction Commencer() doit être avant le main() dans le fichier.
    --> ça devrait régler les warnings.

    Pour le problème de boucle, utilise un débogueur.

    Pour le français, je ne peux pas faire grand chose à part te conseiller de te relire.

    La question est pourtant là : le code ne marche pas. A savoir pourquoi, c'est une chose. A éliminer les choses qui ne vont pas pour limiter le nombre de lignes erronée est une autre chose et certainement celle à faire.

Discussions similaires

  1. aide Erreur java.lang.NullPointerException
    Par tare9 dans le forum Développement Web en Java
    Réponses: 43
    Dernier message: 31/05/2010, 17h02
  2. [AIDE] Erreur BeanUtils.populate
    Par Diablo_22 dans le forum Struts 1
    Réponses: 1
    Dernier message: 03/02/2009, 11h44
  3. Aide erreur <identifier> expected
    Par pianpif dans le forum Langage
    Réponses: 2
    Dernier message: 23/06/2006, 12h36
  4. [VBA] Aide Erreur execution !!
    Par Virgile59 dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/02/2006, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo