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