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 :

Soucis Bataille Navale en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Par défaut Soucis Bataille Navale en C
    Bonsoir,

    Merci à ceux et celles qui liront mon message et qui, je l'espere, pourront m'aider.

    Je suis etudiant en informatique, c'est ma premiere année.
    Je dois rendre un projet en langage C (sous dev cpp) et j'ai choisi de faire une bataille navale.

    J'ai commencé ce projet et reussis le debut, j'ai programmé en prennant appuie sur ce que mes professeurs m'ont enseignés. Je n'ai donc rien pris d'internet. (alors qu'il y a des codes qui sont deja tout fait)
    Mais voilà, j'ai rencontré un probleme, assez coriace et je vous assure que je n'arrive pas à comprendre comment le résoudre. Pourtant j'y ai passé plus d'une semaine à regarder ligne par ligne mais rien à faire, je n'y arrive pas.
    Je me demandais donc si des gens beaucoup plus avancé que moi pourraient m'aider ?

    Je poste le code ainsi (fait par moi, donc peu clair je crois, j'ai essayé de bien commenté mais bon..)

    Si il y en a qui peuvent m'aider, merci de poster un commentaire et je repondrais en privé pour bien expliquer clairement et en detail !

    Merci à tous et bonne nuit !

    Code :

    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
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    // IL Y A UN PROBLEME AU NIVEAU Des ordi_x1, ordi_y1, ordi_x2, ordi_y2, vaisseau_x1, vaisseau_x2, vaisseau_y1, vaisseau_y2
     
    // Les verif_J et forme_J sont ok !
     
    // Faisons les fonctions. 
     
    // 1. La fonctions cadre de l'ordinateur. Avec les abscisses et ordonnées.
    // 1.BIS La fonction affiche le petit ecran du joueur où il verra ses vaisseaux
    // 2. LA fonction qui va actualiser l'interieur du cadre et donc mettre avec l'aide du tableau forme, ce qu'il y a dedans.
    // 3. La fonction va demander les coordonnees et les enregistrer dans le vecteur avec les positions. 
    // 4. Trouver donne la valeur du compteur pour pouvoir donner une valeur à une coordonnée (Ex : "X", "O", "-", ".").
    // 5. Une fonction d'attaque. Pour les attaques du joueur et directement afficher le resultat à l'ecran
    // 6. Une fonction aléatoire qui va generer les coordonnees de debut et de fin de vaisseau pour l'ordinateur ainsi que les attaques
    // 7. Une fonction qui choisira si le bateau sera horizontal ou vertical
     
    #include<stdio.h>
    #include<conio-bis.h>
    #include <time.h>
     
    int Random (int _iMin, int _iMax) 
    { 
     return (_iMin + (rand () % (_iMax-_iMin+1))); 
    }
     
    void ecran_IA();
    void ecran_J();
    void affiche_forme(char*,int,int,int,int,int); // Forme, debut lig, fin lign, debu col, fin col, avancement
    int coordonnees(char*, char*,int, int); // Y, texte, pointeur de placement du texte (x), pointeur de placement du texte (y)
    int trouver(int, char*, int, int*, int*); // x, y, i, x1 ou x2, y1 ou y2
    void remplir(int, int, int*, int*, int*, int*, int, char*,int, int*); // cpt1, cpt2, y1, y2, x1, x2, i, forme, 46 (point) ou 88 (croix), verif
    void verifier(int,char*,int*); // Cpt, from, verif
    int aleatoire (char*); // y
    int choix_aleatoire();
     
    int main ()
    {
        srand ( time(NULL) );
        int i,x,cpt1,cpt2,temp,colonne=0,ok;
        char y[2],ligne[2];
        int verif_J[100]={0}, verif_IA[100]={0};
        char forme_J[100],forme_IA[100],texte[200];
        char nom_vaisseau[6][4]={"P-A","D","F","F","S-M","S-M"};
        int place_vaisseau[6]={5,4,3,3,2,2};
        int vaisseau_y1[6]={0}, vaisseau_x1[6]={0}, vaisseau_x2[6]={0}, vaisseau_y2[6]={0}; // Juste pour remplir le vaisseau de X à l'affichage
        int ordi_y1[6]={0}, ordi_x1[6]={0}, ordi_x2[6]={0}, ordi_y2[6]={0}; // Juste pour remplir le vaisseau de X à l'affichage
     
        // Initialisons le tableaux pour garder les points..
        for(i=0;i<100;i++)
        {    
                          forme_J[i]=46;
                          forme_IA[i]=46; // De cette facon les 100 positions possede des '.' ainsi après on placera des 'X' pour les vaisseaux.
        }
     
        // Initialisations des vaisseaux de l'IA 
       for(i=0;i<6;i++)
       {       
        // Il faut a present qu'il choisise entre le chiffre ou la lettre pour savoir dans quel sens nous irons pour le vaisseau
        temp=choix_aleatoire();
     
        if(temp==1) // On reste sur la meme colonne
        {
                    // Premiere position X1, Y1
                   do
                   {
                       x=aleatoire(&y[0]);
                   }while(x==9||y[0]=='J'); // PROVISOIRE, juste pour le debut apres on fera en fonction du nombre de place des differents vaisseaux..
     
                   printf("Y1 : %c X1 : %d",y[0],x);
     
                   // Ainsi on a les premieres coordonnees du vaisseau[i] de l'ordi
                   cpt1=trouver(x,&y[0],i,&ordi_x1[i],&ordi_y1[i]);
                   printf("\n%d cpt 1 = %d ordi x1 : %d ordi y1 = %d\n",i,cpt1,ordi_x1[i],ordi_y1[i]); // Les cpt sont bons
                   verif_IA[cpt1]=1;
     
                 //do
                 //{
                   colonne=ordi_x1[i];
                   ordi_x2[i]=colonne; // Il ne manque plus que le y2 qui sera sur la meme ligne
                   temp = Random (0,9);
                   y[0] = (char)(temp+65); // Pour transformer le chiffre en lettre..
                   y[1]='\0';
                   printf("\nY2 = %c",y[0]);
                   printf(" X2 = %d",x);
                   cpt2=trouver(x,&y[0],i,&ordi_x2[i],&ordi_y2[i]);
                   printf("\n%d Cpt 2 = %d Ordi X2 : %d Ordi Y2 : %d\n\n",i,cpt2,ordi_x2[i],ordi_y2[i]); // Cpt sont bons
                 // if(ordi_y1[i]==ordi_y2[i])
                 // {
                 //               ok=1;
                 // }
     
                // }while(ordi_x2[i]<ordi_x1[i] && ok==1); 
     
                   verif_IA[cpt2]=1;         
        }
     
        else  // On reste sur la meme ligne
        {
              // Premiere position X1, Y1
                   do
                   {
                       x=aleatoire(&y[0]);
                   }while(x==9||y[0]=='J'); // PROVISOIRE, juste pour le debut apres on fera en fonction du nombre de place des differents vaisseaux..
     
                   printf("Y1 : %c X1 : %d",y[0],x);
     
                   // Ainsi on a les premieres coordonnees du vaisseau[i] de l'ordi
                   cpt1=trouver(x,&y[0],i,&ordi_x1[i],&ordi_y1[i]);
                   printf("\n%d cpt 1 = %d ordi x1 : %d ordi y1 = %d\n",i,cpt1,ordi_x1[i],ordi_y1[i]); // Les cpt sont bons
                   verif_IA[cpt1]=1;
           //  do
           //  {
                // ok=0;
             strcpy(ligne,y);
             x = Random(0,9);
             printf("\nY2 = %c",y[0]);
             printf(" X2 = %d", x); // Il ne manque plus que le x2 qui se trouvera sur la meme ligne ainsi  
             cpt2=trouver(x,&y[0],i,&ordi_x2[i],&ordi_y2[i]);
             printf("\n%d Cpt 2 : %d Ordi X2 : %d Ordi Y2 : %d\n\n",i,cpt2,ordi_x2[i],ordi_y2[i]); // Cpt sont bons
     
            // if(ordi_x1[i]==ordi_x2[i])
            // {
            //                     ok=1;
            // }
     
           //  }while(ordi_x2[i]<ordi_x1[i] && ok==1); 
     
     
             verif_IA[cpt2]=1;  
        }
     
     
        // Remplissons les vides
        remplir(cpt1,cpt2,&ordi_y1[i],&ordi_y2[i],&ordi_x1[i],&ordi_x2[i],i,forme_IA,46,verif_IA);
        printf("\n\n");
     
        }
        getchar();getchar();
        system("CLS");
     
        // Demande des positions des vaisseaux du joueur..
        for(i=0;i<6;i++)
        {
                        ecran_IA();
                        affiche_forme(forme_J,4,24,6,44,2); // GRAND ECRAN MAIS COORDONNEES DE JOUEUR
                        gotoxy(47,20);
                        printf("Vaisseau %s : %d places ",nom_vaisseau[i],place_vaisseau[i]);
                        strcpy(texte,"Premiere position : ");
                        x=coordonnees(&y[0],texte,47,22); 
                        cpt1=trouver(x,&y[0],i,&vaisseau_x1[i],&vaisseau_y1[i]);
                        gotoxy(47,18);
                        printf("x1 %d y1 %d ",vaisseau_x1[i], vaisseau_y1[i]);
                        forme_J[cpt1]=88;
                        verif_J[cpt1]=1;
                        ecran_IA();
                        affiche_forme(forme_J,4,24,6,44,2);
                        strcpy(texte,"Derniere position : ");
                        x=coordonnees(&y[0],texte,47,24); 
                        cpt2=trouver(x,&y[0],i,&vaisseau_x2[i],&vaisseau_y2[i]);
                        gotoxy(47,18);
                        printf("x2 %d y2 %d ",vaisseau_x2[i], vaisseau_y2[i]);
                        forme_J[cpt2]=88;
                        verif_J[cpt2]=1;
                        ecran_IA();
                        remplir(cpt1,cpt2,&vaisseau_y1[i],&vaisseau_y2[i],&vaisseau_x1[i],&vaisseau_x2[i],i,forme_J,88, verif_J);
                        affiche_forme(forme_J,4,24,6,44,2);
                        system("CLS");
                        ecran_IA();
                        affiche_forme(forme_J,4,24,6,44,2);               
        }
     
        system("CLS");
     
        // POUR LES ATTAQUES DU JOUEUR 
        i=0;
        do
        {
        // Affichons maintenant les vaisseaux dans le petit ecran du joueur.
        ecran_J();
        affiche_forme(forme_J,2,22,49,79,1); 
     
        // Affichons le grand ecran où l'on veut attaquer l'ordinateur
        ecran_IA();
        affiche_forme(forme_IA,4,24,6,44,2);
     
        // Demande où le joueur veut attaquer
        strcpy(texte,"Coordonnee d'attaque : ");
        x=coordonnees(&y[0],texte,47,24);
     
        // Cherchons la position de l'attaque dans le vecteur de l'ordinateur pour voir ce qui se trouve dans la position : un bateau ou rien.
        cpt1=trouver(x,&y[0],i,&vaisseau_x1[i],&vaisseau_y1[i]);
     
        // Verifions ce qu'il se cache sous la position du cpt1.
        verifier(cpt1, forme_IA, verif_IA);
     
        // Actualisons.
        ecran_IA();
        affiche_forme(forme_IA,4,24,6,44,2);
        i++;
        system("CLS");
     
    }while(i<7);
     
    }
     
    void ecran_IA()
    {
         int debutcol, debutlig,j,i,chiffre;
         char lettre;
     
         // Ecran principal pour le joueur attaquer l'ordinateur !
        debutcol=4; debutlig=3;
        gotoxy(debutcol++,debutlig);
        printf("%c",201);
     
        do
        {
                         gotoxy(debutcol++,debutlig);
                         printf("%c",205);
        } while(debutcol<44);
     
        gotoxy(debutcol,debutlig++);
        printf("%c",187);
     
        do
        {
                         gotoxy(debutcol,debutlig++);
                         printf("%c",186);
        }while(debutlig<24);
     
        gotoxy(debutcol--,debutlig);
        printf("%c",188);
     
        do
        {
                         gotoxy(debutcol--,debutlig);
                         printf("%c",205);
        }while(debutcol>4);
     
        gotoxy(debutcol,debutlig--);
        printf("%c",200);
     
        do
        {
                         gotoxy(debutcol,debutlig--);
                         printf("%c",186);
        }while(debutlig>3);
     
        // Mettons les abcisses et les ordonnées !
     
        // ABCISSE
        j=2; i=6; chiffre=0;
        do
        {
             gotoxy(i,j);
             printf("%d",chiffre++);
             i=i+4;
        }while(chiffre<10);
     
        //ORDONNEE
        j=4; i=2; lettre=65;
        do
        {
             gotoxy(i,j);
             printf("%c",lettre++);
             j=j+2;
        }while(lettre<75); 
    }
     
    void ecran_J()
    {
         int debutcol, debutlig,j,i,chiffre;
         char lettre;
     
        debutcol=47; debutlig=1;
     
        gotoxy(debutcol++,debutlig);
        printf("%c",201);
     
        do
        {
                         gotoxy(debutcol++,debutlig);
                         printf("%c",205);
        } while(debutcol<78);
     
        gotoxy(debutcol,debutlig++);
        printf("%c",187);
     
        do
        {
                         gotoxy(debutcol,debutlig++);
                         printf("%c",186);
        }while(debutlig<21);
     
        gotoxy(debutcol--,debutlig);
        printf("%c",188);
     
        do
        {
                         gotoxy(debutcol--,debutlig);
                         printf("%c",205);
        }while(debutcol>47);
     
        gotoxy(debutcol,debutlig--);
        printf("%c",200);
     
        do
        {
                         gotoxy(debutcol,debutlig--);
                         printf("%c",186);
        }while(debutlig>1);
    }
     
    void affiche_forme(char* forme, int debut_i, int fin_i, int debut_j, int fin_j,int avancement)
    {
        int cpt=0;
        for(int i=debut_i;i<fin_i;i++) // Vertical
        {
                        for(int j=debut_j;j<fin_j;j++) // horizontal
                        {
                                         gotoxy(j++,i);
                                         j=j+avancement;
                                         printf("%c",forme[cpt]);
                                         cpt++;
                        }
                        i++;
        }
    }
     
    int coordonnees(char* a, char* texte, int placement_x, int placement_y)
    {
        int b;
     
        gotoxy(placement_x, placement_y);
        printf("%s",texte);
        scanf("%c%d",&a[0],&b);
        fflush(stdin);
        return b;
    }
     
    int trouver(int x, char* y, int i, int* point_x, int* point_y)
    {   
        int j, pos_x,pos_y;
        int coordonnee_x[10]={6,10,14,18,22,26,30,34,38,42}; // POUR DETERMINER LES COORDOONNEES EN INT DES POINT ENTRER PAR LE JOUEUR => X
        int coordonnee_y[10]={4,6,8,10,12,14,16,18,20,22}; // POUR DETERMINER LES COORDOONNEES EN INT DES POINT ENTRER PAR LE JOUEUR => Y
        int choix_x[10]={0,1,2,3,4,5,6,7,8,9}; // Les differents choix en x que le joueur pourrait choisir
        char choix_y[10][2]={"A","B","C","D","E","F","G","H","I","J"}; // Les differents choix en Y que le joueur pourrait choisir
     
        y[1]='\0';      
        for(j=0;j<10;j++) // Grace à cette boucle on trouve la coordonnee du point sur l'ecran de jeu
        {
                         if(strcmp(y,choix_y[j])==0)
                         {
                                                    pos_y=j;
                                                    point_y[i]=coordonnee_y[pos_y];
                         }
                         if(x==choix_x[j])
                         {
                                          pos_x=j;
                                          point_x[i]=coordonnee_x[pos_x];
                         }              
        } 
        return pos_y*10 + pos_x;
    }
     
    void remplir(int cpt1, int cpt2, int* y1, int* y2, int* x1, int* x2, int i, char* forme, int val, int* verif)
    {
        int j,k;
     
        j=cpt1;
        k=cpt2;
        do
        {
                    if(y1[i]==y2[i])
                    {              
                                              j=j+1; // On se promene horizontalement sur la grille.. 0, 1, 2, 3
                                              forme[j]=val;
                                              verif[j]=1;  
                    }
                    if(x1[i]==x2[i])
                    {
                         j=j+10; // On se promene verticalement sur la grille.. 0, 10, 20, 30
                         forme[j]=val;
                         verif[j]=1;
                    }
        }while(j<k);
    }
     
    void verifier(int cpt, char* forme, int* verif) // Lorsque attaque, on appelle cette fonction pour voir ce qu'il y a dans la case attaquée.
    {
        if(verif[cpt]==1)
        {
                             forme[cpt]=79;
        }
        else if(verif[cpt]==0)
        {
             forme[cpt]=45;
        }
    }
     
    int aleatoire (char* y)
    {
        int temp;
     
        temp = Random (0,9);
        y[0] = (char)(temp+65); // Transformations de la lettre en char !
        return Random(0,9);
     
    } 
     
    int choix_aleatoire()
    {
        int temp;
     
        temp=Random(0,1);
        if (temp != 0)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonsoir,

    Il est souvent utile de décrire le problème rencontré (en quoi c'est un problème, les symptomes, les effets, ce à quoi tu t'attendais ce que tu obtiens) ...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Par défaut
    D'accord.

    Alors, si vous lancez le programme avec votre compilateur, vous pourrez voir tout d'abord

    Y1 : ... X1 : ... // Cela correspond à la premiere coordonnée que l'ordinateur a choisi de maniere aléatoire pour faire son vaisseau
    ... (La valeur de i allant de 0 à 5) cpt 1 = ... (valeur calculé en fonction de la coordonnée pour mettre dans un vecteur de 100 positions. 100 car 100 coordonnées possibles sur la grille) ordi x1 : ... Ordi y1 : ... (Ces deux variables, calculé dans la focntion "trouver", varie en fonction de la coordonnée choisi par l'ordinateur)

    Y2 : ... X2 : ... // Cela correspond à la deuxieme coordonnée que l'ordinateur a choisi de maniere aléatoire pour faire son vaisseau
    ... (La valeur de i allant de 0 à 5 vu qu'il y a 6 vaisseaux) cpt 2 = ... (valeur calculé en fonction de la coordonnée pour mettre dans un vecteur de 100 positions. 100 car 100 coordonnées possibles sur la grille) ordi x2 : ... Ordi y2 : ... (Ces deux variables, calculé dans la focntion "trouver", varie en fonction de la coordonnée choisi par l'ordinateur)


    ==> Le probleme : Lors de la construction du premier vaisseau, le programme fonctionne très bien. Ordi x1, ordi y1, ordi x2, ordi y2 possede des bonnes valeurs.

    Mais lors des tours suivants, soit les variables là, sont egales à 0 ou les valeurs sont mauvaises.
    Je n'arrive pas à comprendre pourquoi, ca ne fonctionne pas lors des autres tours.

    ps : Pour bien comprendre comment calculer le ordi x1, ordi y1, ordi x2, ordi y2

    les ordonnées allant de A à J
    les abcisses allant de 0 à 9

    Dans la fonction "trouver", le programme cherche la valeur equivalente à la coordonnée entrée (ex : A1 => A = la position 0 du vecteur et 1 la position 1 du vecteur)
    J'ai donc dans un vecteur coordonnée x et y des valeurs et en fonction de la position trouvé, ordi x1, ordi y1 possedera une valeur (ici : ordi x1 = 10 et ordi y1 = 4)

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Je travaille sous linux, je n'ai pas de conio d'installé (vous développez en tuirbo c ???). Je ne peux donc pas compiler ton programme.
    Néanmoins je vais me permettre de faire deux trois remarques générales sur ton code.
    Les bons points sont : ton code est commenté et c'est une vraie production personnelle.

    Maintenant les mauvais points, bon ce ne sont pas de «vrais» mauvais points mais très clairement des erreurs dans lesquelles tout apprenant se prend les pieds

    Sans doute le plus important : découpe ton main.
    Si tu as du mal à déboguer c'est en premier lieu dû à la longueur de ton code mais pas uniquement. Plus tu construis une usine à gaz plus ça explose à la moindre étincelle.

    Deuxième point : ne jamais faire un copier coller de code sans avoir au minimum 7 fois 7 bonnes raisons de le faire car chaque utilisation du copier/coller va doubler le nombre potentiel d'erreurs, ça c'est pour la super grosse ressemblance entre «on reste sur la même ligne»/«on reste sur la même colonne» par exemple.

    Troisième point : le choix des structures de données, on ne se limite jamais aux types de bases. C'est en général toujours une bonne idée de modéliser les objets du monde réel par des objet dans ton code. Comment définis-tu rapidement un jeu de bataille navale ?
    Il y a deux joueurs, chacun possédant un plateau sur lequel il place ses bateaux. Ensuite chaque joueur énonce des positions et note sur un autre plateau les résultats des coups joués etc ...
    On devrait pouvoir repérer facilement dans ton code ce que j'ai souligné, je m'attends à voir apparaître un «type» joueur avec les fonctions d'accès qui vont bien, un autre «type» plateau etc ...

    Quatrième point : séparer l'implémentation du jeu à proprement parler (comment joue l'IA, la représentation des plateaux, etc ...) de l'implémentation de l'affichage (afficher un plateau par exemple).

    Mes remarques impliquent évidemment qu'il va falloir modulariser tout ça.
    Par exemple, mais ce n'est qu'un exemple de début de piste de réflexion pour une analyse, je verrais bien un plateau de jeu comme au moins un tableau de cases, les cases prenant différentes valeurs (et pas forcément ce qui doit-être affiché à l'écran ensuite) suivant leur contenu et un plateau pouvant décrire soit les positions des bateaux soit les positions des coups joués, un plateau possédant MAX_LIGNES lignes et MAX_COLONNES colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define MAX_LIGNES 10
    #define MAX_COLONNES 10
    typedef enum {C_VIDE, C_OCCUPE, C_TOUCHE, C_DANSLEAU, C_INTERDITE} etat_case_t;
    typedef enum {P_BATEAUX, P_COUPS} type_plateau_t;
    typedef struct {
      type_plateau_t type_plateau;
      etat_case_t plateau[MAX_LIGNES][MAX_COLONNES];
      // rajoute tout ce dont tu as besoin pour représenter l'objet plateau ...
    } plateau_t;
    Évidemment je vois bien comme fonctions d'accès (ce ne sont que des premiers jets comme ça ...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    plateau_t* plateau_new(type_plateau_t type_plateau); // crée un nouveau plateau de type type_plateau
    void plateau_del(plateau_t* plateau); // libère la mémoire allouée pour un plateau
     
    type_plateau_t plateau_get_type_plateau(plateau_t* plateau);
    type_case_t plateau_get_type_case(plateau_t* plateau, int ligne, int colonne);
    void plateau_set_type_case(plateau_t* plateau, int ligne, int colonne, type_case_t type_case);
    et tout ce dont tu auras besoin pour ton développement.
    En n'utilisant que cette représentation il sera difficile (mais pas impossible) de retrouver l'information «où se trouve le porte-avion» ou «le porte-avion du joueur J a-t-il été coulé» ...

    Une petite remarque sur le premier enum, j'espère que l'on comprend rapidement que C_VIDE représente une case vide sur un plateau, C_OCCUPE une case occupée sur un plateau de bateaux, C_TOUCHE une case sur un plateau de coups quand on a touché un bateau adverse, C_DANSLEAU une case sur un plateau de coups qui représente un coup dans l'eau. C_INTERDITE peut te paraître étrange. Je l'ai notée pour deux raisons :
    -> suivant les règles parfois les bateaux ne peuvent pas se toucher, si tu ajoute un bateau entoure le directement de C_INTERDITE ... ça simplifie la gestion du «est-ce que ça se touche»
    -> dans de nombreux jeux de plateau il est souvent préférable d'entourer le plateau de jeu réel par des cases interdites. Je te donne un exemple pour être plus clair dans le cas d'un plateau de jeu 3x3. L'approche naïve est d'avoir un tableau de 3x3 :
    le problème est que tu sera amené à certains moment de vérifier que tu ne sors pas du tableau et si tu ne sors pas du tableau si la case est valide. Si tu utilises des cases «interdites» (que je vais noter *) tu obtiens un tableau de 5x5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    * * * * *
    * . . . *
    * . . . *
    * . . . *
    * * * * *
    Le plateau réel commence en 1 au lieu de 0. Du coup tu ne sors «jamais» de ton plateau : tu tombes sur un case interdite (cas que tu traites souvent dans la plupart des tests de toute façon).
    Comme tu auras écris des fonctions d'accès, celles-ci vont en plus vérifier que tu ne donnes que des coordonnées valides et que ces cases interdites ne seront jamais écrasées par des valeurs différentes (elles vérifieront aussi, sans doute par un ou plusieurs assert, que le programmeur ne tente pas de placer une case de coup sur un plateau de bateaux ...).

    Mais comme je te l'ai dit, ce n'est qu'un exemple de début de réflexion pour l'analyse du jeu.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Par défaut
    Bonjour à toi,

    Tout d'abord merci pour ta reponse !

    J'ai lu, je relirais quand je serais chez moi et je verrais ce que je peux prendre de ce que tu me dis.
    Mais j'ai deja plus ou moins compris ce que tu me disais puisque dans mon programme, j'ai déjà differentes parties mais dans des fonctions.

    Decouper mon int main ? C'est genre, decomposer avec les differentes parties ?
    - Initialisations des bateaux de l'IA
    - Initialisations des bateaux de J
    - Affichage plateau IA
    - Affichage plateau J

    C'est de ca que tu parles ?

    Car si c'est ce que tu me dis, c'est plus ou moins cela que je fais mais en moins bien..

    Pour ce qui est de C_Occupé, C_vide ,...

    J'ai un vecteur verif[100] (100 qui correspond à chaque case du plateau de jeu) si verif[i] = 0 alors C_vide, si = 1 alors C_occupé, si = 2 alors C_touché, si = 3 alors C_dansl'eau

    Fin c'est moins compliqué pour moi comme cela, n'ayant pas beaucoup de pratiques.. Moins d'une année que je viens de commencer.

    Je te remercie donc, et je prendrais bonnes notes de ce que tu viens de me dire !

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    l'idée est d'écrire des fonctions simples, au but explicite, qui travaille sur des données de son domaine.

    suppose avoir des structures joueur, grille, bateau, coup.

    Alors il te faut probablement les fonctions suivantes:
    • coup demanderCoup(joueur, grille)
    • void effectuerCoup(coup, grille)
    • grille IA_placerTousBateaux(bateau[] bateaux, int nombreBateaux);
    • grille joueur_demanderTousBateaux(bateau[] bateaux, int nombreBateaux);
    • int partieFinie(joueur, grille, joueur, grille);

    et des utilitaires pour ces fonctions
    • void afficher(grille)
    • coup IA_calculerCoup(grille)
    • void placerbateau(joueur, grille)
    • int estVivant(bateau, grille)
    • int estVivant(joueur, grille)

    ton programme s'écrirait surement de manière très simple:
    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
     
    #define NB_BATEAUX 7;
     
    #define JOUEUR 0;
    #define IA 1;
     
    int main(){
    	//quelques initialisations et définitions
    	joueur joueur = ...
    	joueur ia = ...
    	bateau bateaux_partie[NB_BATEAUX] = ...;
    	grille bateauxJoueur = demanderTousBateaux(bateaux_partie, NB_BATEAUX);
    	grille bateauxIA = IA_placerTousBateaux(bateaux_partie, NB_BATEAUX);
     
    	int joueurCourant = JOUEUR;
    	while( !partieFinie(joueur, bateauxJoueur, ia, bateauxIA) ) {
    		if (joueurCourant ==JOUEUR) {
    			coup coup = demanderCoup(joueur, bateauxIA);
    			effectuerCoup(coup, bateauxIA);
    			joueurCourant = IA;
    		} else {
    			coup coup = demanderCoup(ia, bateauxJoueur);
    			effectuerCoup(coup, bateauxJoueur);
    			joueurCourant = JOUEUR;
    		}
    	}
    	if(joueurCourant==IA) {
    		printf("gagnant: IA\n");
    	} else {
    		printf("gagnant: Joueur\n");
    	}
    	printf("grille joueur:\n");
    	afficherGrille(bateauxJoueur);
    	printf("grille IA:\n");
    	afficherGrille(bateauxIA);
    	return 0;
    }

Discussions similaires

  1. Bataille navale c
    Par idealj78 dans le forum C
    Réponses: 5
    Dernier message: 06/12/2006, 23h42
  2. aide pour jeu de la bataille navale
    Par Jeannot Alpin dans le forum Delphi
    Réponses: 17
    Dernier message: 19/11/2006, 20h33
  3. bataille navale
    Par keenurives dans le forum C
    Réponses: 7
    Dernier message: 21/11/2005, 12h15
  4. [LG]Programme Bataille Navale en Pascal
    Par RaFaL dans le forum Langage
    Réponses: 21
    Dernier message: 10/06/2003, 21h22

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