diff --git a/biblioNavale2.c b/biblioNavale2.c new file mode 100644 index 0000000..068f60c --- /dev/null +++ b/biblioNavale2.c @@ -0,0 +1,366 @@ +#include +#include +#include + + +int verifDeux(char tab[][10]) +{ + int verif = 0; /*Variable qui compte le nombre de case qui ne contiennent pas un espace*/ + for(int i = 0; i < 10; i++) + { + for(int j = 0; j < 10; j++) + { + if(tab[i][j]!=' ') + { + verif++; + } + } + } + if(verif == 17) + { + return 1; + }else + { + return 0; + } +} + +void afficheDeux(char t[][10]) +{ + /*Numerotation des colonnes du tableau*/ + printf("_|"); + for (int i = 0; i < 10; ++i) + { + printf("%d|",i ); + } + printf("\n"); + + /*interieur du tableau*/ + for (int i = 0; i < 10; ++i) + { + printf("%c|",65+i); /*Affiche la lettre de la ligne*/ + for (int j = 0; j < 10; ++j) + { + printf("%c|",t[i][j]); /*la lettre de la case*/ + } + printf("\n"); + } + printf("\n"); +} + +void afficheduoDeux(char t[][10],char p[][10]) +{ + /*Numerotation des colonnes du Tab2*/ + printf("_|"); + for (int i = 0; i < 10; ++i) + { + printf("%d|",i ); + } + printf(" "); + + /*Numerotation des colonnes du Tab2*/ + printf("_|"); + for (int i = 0; i < 10; ++i) + { + printf("%d|",i ); + } + printf("\n"); + + + for (int i = 0; i < 10; ++i) + { + /*interieur du tab 1*/ + printf("%c|",65+i); /*Affiche la lettre de la ligne*/ + for (int j = 0; j < 10; ++j) + { + if (t[i][j]!='x') /*Si la case na pas encore été attaqué ou qu'elle contient un bateau*/ + { + if (t[i][j]=='.') /*Affiche un point si la case a deja été attaqué et rien na été touché*/ + { + printf(".|"); + }else + { + printf(" |"); /*Affiche rien (un espace) si la case na pas encore été affecté*/ + } + } + else + { + printf("%c|",t[i][j]); /*Affiche les case vide*/ + } + } + + /*interieur du tab 2*/ /*IDEM*/ + printf(" %c|",65+i); + for (int j = 0; j < 10; ++j) + { + if (p[i][j]!='x') + { + if (p[i][j]=='.') + { + printf(".|"); + }else + { + printf(" |"); + } + } + else + { + printf("%c|",p[i][j]); + } + } + printf("\n"); + } + printf("\n"); +} + +int jouerJoueurDeux(char t[][10]) +{ + char lettre; + char lettre2; + scanf(" %c%c",&lettre,&lettre2); + int i = lettre; /*Conversion des valeurs lue par scanf en entier pour acceder au variables du tableau*/ + int j = lettre2; + i -= 65; + j -= 48; + if ((i>=0)&&(i<10)&&(j>=0)&&(j<10)) /*Verifie que les entier sont entre 0 et 9 (inclus)*/ + { + char result = t[i][j]; + if(result==' ') + { + t[i][j]='.'; /*La case est vide*/ + while( (lettre=getchar())!= '\n' && lettre != EOF) { } /*Ces boucles while vide le buffer pour que scanf redemande une entrée utilisateur*/ + return -1; + } + else /*Ci dessous si la case contient un bateau et le return associé*/ + { + if(result=='A') + { + t[i][j]='x'; + while( (lettre=getchar())!= '\n' && lettre != EOF) { } + return 0; + } + else + { + if(result=='C') + { + t[i][j]='x'; + while( (lettre=getchar())!= '\n' && lettre != EOF) { } + return 1; + } + else + { + if(result=='S') + { + t[i][j]='x'; + while( (lettre=getchar())!= '\n' && lettre != EOF) { } + return 2; + } + else + { + if(result=='M') + { + t[i][j]='x'; + while( (lettre=getchar())!= '\n' && lettre != EOF) { } + return 3; + } + else + { + if(result=='T') + { + t[i][j]='x'; + while( (lettre=getchar())!= '\n' && lettre != EOF) { } + return 4; + } + else + { + while( (lettre=getchar())!= '\n' && lettre != EOF) { } + return -2; /*Si le charactere n'est pas reconnue*/ + } + } + } + } + } + } + } + else + { + while( (lettre=getchar())!= '\n' && lettre != EOF) { } + return -3; /*Si les entier depassent les bornes du tableau*/ + } +} + +/* Erreur de Segmentation??? que on arrive pas a resoudre et donc on ne connait pas la cause meme apres avoir defini i de force +char nav[5][13]={"Porte-Avion","Croiseur","Sous-Marin","Mous-Marin","Torpilleur"}; +char* navireDeux(int i) +{ + return nav[i]; +} +*/ + +void ajoutNavireAleatoireDeux(char tab[][10],char b,int t) +{ + /*Declaration des variables*/ + int random = rand(); + int verif = 0; + int x; + int y; + if ((random%2)==0) /*Choix de l'orientation du bateau aléatoire*/ + { + /*horizontal*/ + do + { + random = rand(); /*Choix des coordonées du bateau de maniere aléatoire*/ + verif = 0; + x = random%(10-t); + y = random%10; + for (int i = 0; i < t; ++i) + { + if (tab[x+i][y]!=' ') /*Verifie si les cases que la bateau compte prendre sont libre*/ + { + verif++; + } + } + }while(verif!=0); /*Repete jusqua que l'on trouve des coordonées aleatorie libre sur le plateau*/ + for (int i = 0; i < t; ++i) + { + tab[x+i][y]=b; /*Place le navire*/ + } + } + else + { + /*vertical*/ /*Idem mais en vertical*/ + do + { + random = rand(); + verif = 0; + x = random%10; + y = random%(10-t); + for (int i = 0; i < t; ++i) + { + if (tab[x][y+i]!=' ') + { + verif++; + } + } + }while(verif!=0); + for (int i = 0; i < t; ++i) + { + tab[x][y+i]=b; + } + } +} + +void initPlateauDeux(char plat[][10]) +{ + srand(time(NULL)); /*Changement de la seed pour l'aleatoire*/ + char placement; + char lettre; + do + { + printf("Souhaitez placer vos navires à la (M)ain, ou (A)leatoirement ?\n"); + scanf(" %c",&placement); + while( (lettre=getchar())!= '\n' && lettre != EOF) { } /*Vide le buffer pour la prochaine iteration*/ + }while(!(placement=='A'||placement=='M')); /*Repete Jusqua que l'utilisateur rentre Un des deux mode de placement de bateau*/ + /*ALEATOIRE*/ + if (placement=='A') + { + for (int i = 0; i < 10; ++i) + { + for (int j = 0; j < 10; ++j) + { + plat[i][j]=' '; /*rempli le plateau de case vide*/ + } + } + ajoutNavireAleatoireDeux(plat,'A',5); /*Porte-Avion*/ + ajoutNavireAleatoireDeux(plat,'C',4); /*Croiseur*/ + ajoutNavireAleatoireDeux(plat,'S',3); /*Sous-marin*/ + ajoutNavireAleatoireDeux(plat,'M',3); /*Mous-marin*/ + ajoutNavireAleatoireDeux(plat,'T',2); /*Torpilleur*/ + } + else + { + /*Manuel*/ + for (int i = 0; i < 10; ++i) + { + for (int j = 0; j < 10; ++j) + { + plat[i][j]=' '; /*Rempli le plateau de case vide*/ + } + } + char lettre; + char c; /*Variable juste pour vider le buffer*/ + int y; + int x; + int verif = 0; + printf("Vous devez placer vos navires.\nPour chaque navire, indiquez horizontal (h) ou vertical (v), suivi de la case la plus au nord-ouest (ex : h,E4).\n"); + + char nomBateaux[5]={'A','C','S','M','T'}; + int tailleBateaux[5]={5,4,3,3,2}; + for (int j = 0; j < 5; ++j) /*Repete pour chaque type de bateau*/ + { + afficheDeux(plat); + do + { + y=11; + lettre='Z'; + printf("Placer votre %c (longueur %d) :\n", nomBateaux[j],tailleBateaux[j]); + scanf(" %c,%c%d",&placement,&lettre,&y); + x = lettre; + x -= 65; + verif = 1; + if ((x>=0)&&(x<10)&&(y>=0)&&(y<10)&&(y+tailleBateaux[j])<10&&(x+tailleBateaux[j])<10) /*Verifie si les coordonées proposée par l'utilisateur sont correct*/ + { + + if (placement=='v') /*Si l'utilisateur propose vertival il verifie si il y a un bateau sur une de ces cases */ + { + for (int i = 0; i < tailleBateaux[j]; ++i) + { + if (plat[x+i][y]!=' ') + { + verif++; + } + } + } + if (placement=='h') /*Si l'utilisateur propose horizontal il verifie si il y a un bateau sur une de ces cases */ + { + for (int i = 0; i < tailleBateaux[j]; ++i) + { + if (plat[x][y+i]!=' ') + { + verif++; + } + } + } + if (verif>1) + { + printf("Navire empiete sur un autre.\n"); + } + else + { + if (placement=='v') /*place les bateaux verticalement*/ + { + for (int i = 0; i < tailleBateaux[j]; ++i) + { + plat[x+i][y]=nomBateaux[j]; + verif = 0; + } + } + if (placement=='h') /*place les bateaux horizontalement*/ + { + for (int i = 0; i < tailleBateaux[j]; ++i) + { + plat[x][y+i]=nomBateaux[j]; + verif = 0; + } + } + } + } + else + { + printf("Navire sortant des limites\n"); + while( (c=getchar())!= '\n' && c != EOF) { } /*vide le buffer pour la prochaine iteration*/ + } + }while(verif>0); + } + } +} \ No newline at end of file