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;
    }
}