diff --git a/MaBatailleNavale.c b/MaBatailleNavale.c new file mode 100644 index 0000000..86acb71 --- /dev/null +++ b/MaBatailleNavale.c @@ -0,0 +1,479 @@ +#include <stdlib.h> +#include <stdio.h> +#include <time.h> +#include <string.h> + +/* biblioNavale2.h */ + +void ajoutNavireAleatoireDeux(char tab[][10], char b, int t) { + int direction = rand() % 2; // 0 pour horizontale, 1 pour verticale + int x, y; + int valid = 0; // 1 si la position est valide sinon 0 + + while (!valid) { + if (direction == 0) { + x = rand() % (10 - t + 1); + y = rand() % 10; + valid = 1; + for (int i = 0; i < t; i++) { + if (tab[y][x + i] != ' ') { + valid = 0; + break; + } + } + } else { + x = rand() % 10; + y = rand() % (10 - t + 1); + valid = 1; + for (int i = 0; i < t; i++) { + if (tab[y + i][x] != ' ') { + valid = 0; + break; + } + } + } + if (valid) { + for (int i = 0; i < t; i++) { + if (direction == 0) { + tab[y][x + i] = b; + } else { + tab[y + i][x] = b; + } + } + } + } +} + +int verifDeux(char tab[][10]) { + int nbcases = 0; + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + if (tab[i][j] != ' ') { + nbcases++; + } + } + } + return nbcases == 17 ? 1 : 0; +} + +void afficheDeux(char t[][10]) { + printf(" A B C D E F G H I J\n"); + for (int i = 0; i < 10; i++) { + printf("%2d ", i + 1); + for (int j = 0; j < 10; j++) { + if (t[i][j] == ' ' || t[i][j] == '.' || t[i][j] == 'X') { + printf("%c ", t[i][j]); + } else { + printf(" "); + } + } + printf("\n"); + } +} + +void afficheduoDeux(char t[][10], char p[][10]) { + printf(" A B C D E F G H I J A B C D E F G H I J\n"); + for (int i = 0; i < 10; i++) { + printf("%2d ", i + 1); + for (int j = 0; j < 10; j++) { + if (t[i][j] == ' ' || t[i][j] == '.' || t[i][j] == 'X') { + printf("%c ", t[i][j]); + } else { + printf(" "); + } + } + printf(" %2d ", i + 1); + for (int j = 0; j < 10; j++) { + if (p[i][j] == ' ' || p[i][j] == '.' || p[i][j] == 'X') { + printf("%c ", p[i][j]); + } else { + printf(" "); + } + } + printf("\n"); + } +} + +void initPlateauDeux(char plat[][10]) { + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + plat[i][j] = ' '; + } + } + + printf("Voulez-vous placer les navires manuellement (M) ou aléatoirement (A) ? "); + char choix; + scanf(" %c", &choix); + + if (choix == 'm' || choix == 'M') { + int tailles[] = {5, 4, 3, 3, 2}; + char symboles[] = {'A', 'C', 'S', 'M', 'T'}; + for (int n = 0; n < 5; n++) { + int valid = 0; + while (!valid) { + char direction; + int x, y; + printf("Placer le navire %c de taille %d\n", symboles[n], tailles[n]); + printf("Horizontal (h) ou Vertical (v) ? "); + scanf(" %c", &direction); + printf("Entrez les coordonnées (ex: A5): "); + char coordonnees[3]; + scanf("%2s", coordonnees); + + x = coordonnees[0] - 'A'; + y = coordonnees[1] - '1'; + + if (x < 0 || x >= 10 || y < 0 || y >= 10) { + printf("Coordonnées hors plateau, essayez à nouveau.\n"); + continue; + } + + valid = 1; + if (direction == 'h' || direction == 'H') { + if (x + tailles[n] > 10) { + printf("Le navire dépasse à droite, essayez à nouveau.\n"); + valid = 0; + continue; + } + for (int i = 0; i < tailles[n]; i++) { + if (plat[y][x + i] != ' ') { + printf("Le navire entre en collision, essayez à nouveau.\n"); + valid = 0; + break; + } + } + if (valid) { + for (int i = 0; i < tailles[n]; i++) { + plat[y][x + i] = symboles[n]; + } + } + } else if (direction == 'v' || direction == 'V') { + if (y + tailles[n] > 10) { + printf("Le navire dépasse en bas, essayez à nouveau.\n"); + valid = 0; + continue; + } + for (int i = 0; i < tailles[n]; i++) { + if (plat[y + i][x] != ' ') { + printf("Le navire entre en collision, essayez à nouveau.\n"); + valid = 0; + break; + } + } + if (valid) { + for (int i = 0; i < tailles[n]; i++) { + plat[y + i][x] = symboles[n]; + } + } + } else { + printf("Direction invalide, essayez à nouveau.\n"); + valid = 0; + } + } + } + } else { + ajoutNavireAleatoireDeux(plat, 'A', 5); // Porte-Avion + ajoutNavireAleatoireDeux(plat, 'C', 4); // Croiseur + ajoutNavireAleatoireDeux(plat, 'S', 3); // Sous-Marin + ajoutNavireAleatoireDeux(plat, 'M', 3); // Mous-Sarin + ajoutNavireAleatoireDeux(plat, 'T', 2); // Torpilleur + } +} + +int jouerJoueurDeux(char adv[][10]) { + int x, y; + printf("Entrez les coordonnées (ex: A5): "); + char coordonnees[3]; + scanf("%2s", coordonnees); + + x = coordonnees[0] - 'A'; + y = coordonnees[1] - '1'; + if (x < 0 || x >= 10 || y < 0 || y >= 10) { + return -3; // Hors plateau + } + + char cible = adv[y][x]; + switch (cible) { + case ' ': adv[y][x] = '.'; return -1; // À l'eau + case 'A': adv[y][x] = 'X'; return 0; // Porte-Avion + case 'C': adv[y][x] = 'X'; return 1; // Croiseur + case 'S': adv[y][x] = 'X'; return 2; // Sous-Marin + case 'M': adv[y][x] = 'X'; return 3; // Mous-Sarin + case 'T': adv[y][x] = 'X'; return 4; // Torpilleur + case '.': + case 'X': return -2; // Case déjà touchée + default: return -2; // Caractère non reconnu + } +} + +char* navireDeux(int i) { + switch (i) { + case 1: return "Porte-Avion"; + case 2: return "Croiseur"; + case 3: return "Sous-Marin"; + case 4: return "Mous-Sarin"; + case 5: return "Torpilleur"; + default: return "Inconnu"; + } +} + +/*commande pour compiler :"gcc BatailleNavale.c -o BatailleNavale.o biblioNavale.o + "*/ +int main(int argc, char const *argv[]){ + /*création de toutes les variables utiles au programme et rand pour le + placement aléatoire des bateaux.*/ + srand(time(NULL)); + char p1 [10][10]; + char p2 [10][10]; + int victoirep1=5; + int victoirep2=5; + int a1=5; + int a2=5; + int c1=4; + int c2=4; + int s1=3; + int s2=3; + int m1=3; + int m2=3; + int t1=2; + int t2=2; + int tour=0; + /*Tout d'abord on va initialiser les plateaux des 2 joueurs. + On fait une boucle qui permet de recommencer l'initialisation si la + verification renvoi une erreur*/ + while( verifDeux(p1)==0|| verifDeux(p2)==0){ + printf("Joueur 1 :\n"); + initPlateauDeux(p1); + printf("Joueur 2 :\n"); + initPlateauDeux(p2); + } + + /*Affichage*/ + for (int i = 0; i < 60; i++) + {printf("-");} + printf("\n"); + afficheduoDeux(p1,p2); + printf("La partie peut commencer !\n"); + /*Affichage*/ + + +/*Boucle de la partie entière*/ +while(victoirep1!=0 && victoirep2!=0){ + if(victoirep1!=0 && victoirep2!=0){ +tour=0; +} +/*Boucle du tour de joueur 1*/ + while(tour<1){ + if(victoirep2==0){break;} + printf("Au tour du joueur 1 :\n"); + int tir=jouerJoueurDeux(p1); + /*si le tir a rencontré une erreur*/ + if(tir==-2||tir==-3){printf("veuillez tirer dans le plateau :)\n");} + + /*si le tir ne touche aucun bateau*/ + if(tir==-1){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("À l'eau !\n"); + tour=tour+1; + } + + /*si le tir a touché le porte avion*/ + if(tir==0 && a1>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + a1=a1-1; + } + if (tir==0&&a1<=0){ + victoirep1=victoirep1-1; + printf("Coulé !\n"); + if(victoirep1==0){break;} + + } + /*si le tir a touché le croiseur*/ + if(tir==1 && c1>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + c1=c1-1; + } + if (tir==1 && c1<=0){ + printf("Coulé !\n"); + victoirep1=victoirep1-1; + if(victoirep1==0){break;} + + } + /*si le tir a touché le sous marin*/ + if(tir==2 && s1>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + s1=s1-1; + } + if (tir==2 && s1<=0){ + printf("Coulé !\n"); + victoirep1=victoirep1-1; + if(victoirep1==0){break;} + + } + /*si le tir a touché le mous sarin*/ + if(tir==3 && m1>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + m1=m1-1; + } + if (tir==3 && m1<=0){ + printf("Coulé !\n"); + victoirep1=victoirep1-1; + if(victoirep1==0){break;} + + } + /*si le tir a touché le torpilleur*/ + if(tir==4 && t1>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + t1=t1-1; + } + if (tir==4 && t1<=0){ + printf("Coulé !\n"); + victoirep1=victoirep1-1; + if(victoirep1==0){break;} + + } +} + if(victoirep1!=0 && victoirep2!=0){ +tour=0; +} +/*Boucle du tour de joueur 2*/ + while(tour<1){ + if(victoirep1==0){break;} + printf("Au tour du joueur 2 :\n"); + int tir=jouerJoueurDeux(p2); + /*si le tir a rencontré une erreur*/ + if(tir==-2||tir==-3){printf("veuillez tirer dans le plateau :)\n");} + + /*si le tir ne touche aucun bateau*/ + if(tir==-1){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("À l'eau !\n"); + tour=tour+1; + } + + /*si le tir a touché le porte avion*/ + if(tir==0 && a2>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + a2=a2-1; + } + if (tir==0 && a2<=0){ + printf("Coulé !\n"); + victoirep2=victoirep2-1; + if(victoirep2==0){break;} + + } + /*si le tir a touché le croiseur*/ + if(tir==1 && c2>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + c2=c2-1; + } + if (tir==1 && c2<=0){ + printf("Coulé !\n"); + victoirep2=victoirep2-1; + if(victoirep2==0){break;} + + } + /*si le tir a touché le sous marin*/ + if(tir==2 && s2>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + s2=s2-1; + } + if (tir==2 && s1<=0){ + printf("Coulé !\n"); + victoirep2=victoirep2-1; + if(victoirep2==0){break;} + + } + /*si le tir a touché le mous sarin*/ + if(tir==3 && m2>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + m2=m2-1; + } + if (tir==3 && m2<=0){ + printf("Coulé !\n"); + victoirep2=victoirep2-1; + if(victoirep2==0){break;} + + } + /*si le tir a touché le torpilleur*/ + if(tir==4 && t2>=0){ + for (int i = 0; i < 60; i++){ + printf("-"); + } + printf("\n"); + afficheduoDeux(p1,p2); + printf("Touché\n"); + t2=t2-1; + } + if (tir==4 && t2<=0){ + printf("Coulé !\n"); + victoirep2=victoirep2-1; + if(victoirep2==0){break;} + + } +} + +} +/*fin de la boucle de la partie entière donc il y a désormais un vainqueur +on affiche qui a remporté la partie avec les conditions suivantes*/ +if(victoirep1==0){ + printf("Joueur 1 a gagné la partie !\nBien joué !\n"); +} +if(victoirep2==0){ + printf("Joueur 2 a gagné la partie !\nBien joué !\n"); +} +return 0; +} \ No newline at end of file