diff --git a/biblioNavale2.c b/biblioNavale2.c index e1ad54e..b3d93d9 100644 --- a/biblioNavale2.c +++ b/biblioNavale2.c @@ -2,35 +2,36 @@ #include <stdlib.h> #include <stdio.h> #include <time.h> +#include <string.h> void ajoutNavireAleatoire(char tab[][10], char b, int t) { - int direction = rand() % 2; // 0 for horizontal, 1 for vertical + int direction = rand() % 2; // 0 pour horizontale, 1 pour verticale int x, y; - int place = 0; + int valid = 0; // 1 si la position est valide sinon 0 - while (!place) { - if (direction == 0) { // Horizontal + while (!valid) { + if (direction == 0) { x = rand() % (10 - t + 1); y = rand() % 10; - place = 1; + valid = 1; for (int i = 0; i < t; i++) { if (tab[y][x + i] != ' ') { - place = 0; + valid = 0; break; } } - } else { // Vertical + } else { x = rand() % 10; y = rand() % (10 - t + 1); - place = 1; + valid = 1; for (int i = 0; i < t; i++) { if (tab[y + i][x] != ' ') { - place = 0; + valid = 0; break; } } } - if (place) { + if (valid) { for (int i = 0; i < t; i++) { if (direction == 0) { tab[y][x + i] = b; @@ -51,7 +52,7 @@ int verif(char tab[][10]) { } } } - return nbcases == 17 ; + return nbcases == 17 ? 1 : 0; } void affiche(char t[][10]) { @@ -59,7 +60,11 @@ void affiche(char t[][10]) { for (int i = 0; i < 10; i++) { printf("%2d ", i + 1); for (int j = 0; j < 10; j++) { - printf("%c ", t[i][j]); + if (t[i][j] == ' ' || t[i][j] == '.' || t[i][j] == 'X') { + printf("%c ", t[i][j]); + } else { + printf(" "); + } } printf("\n"); } @@ -70,11 +75,19 @@ void afficheduo(char t[][10], char p[][10]) { for (int i = 0; i < 10; i++) { printf("%2d ", i + 1); for (int j = 0; j < 10; j++) { - printf("%c ", t[i][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++) { - printf("%c ", p[i][j]); + if (p[i][j] == ' ' || p[i][j] == '.' || p[i][j] == 'X') { + printf("%c ", p[i][j]); + } else { + printf(" "); + } } printf("\n"); } @@ -86,27 +99,100 @@ void initPlateau(char plat[][10]) { plat[i][j] = ' '; } } - ajoutNavireAleatoire(plat, 'A', 5); // Porte-Avion - ajoutNavireAleatoire(plat, 'C', 4); // Croiseur - ajoutNavireAleatoire(plat, 'S', 3); // Sous-Marin - ajoutNavireAleatoire(plat, 'M', 3); // Mous-Sarin - ajoutNavireAleatoire(plat, 'T', 2); // Torpilleur + + 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 { + ajoutNavireAleatoire(plat, 'A', 5); // Porte-Avion + ajoutNavireAleatoire(plat, 'C', 4); // Croiseur + ajoutNavireAleatoire(plat, 'S', 3); // Sous-Marin + ajoutNavireAleatoire(plat, 'M', 3); // Mous-Sarin + ajoutNavireAleatoire(plat, 'T', 2); // Torpilleur + } } int jouerJoueur(char adv[][10]) { int x, y; printf("Entrez les coordonnées (ex: A5): "); - char input[3]; - scanf("%2s", input); + char coordonnees[3]; + scanf("%2s", coordonnees); - x = input[0] - 'A'; - y = input[1] - '1'; + x = coordonnees[0] - 'A'; + y = coordonnees[1] - '1'; if (x < 0 || x >= 10 || y < 0 || y >= 10) { return -3; // Hors plateau } - char target = adv[y][x]; - switch (target) { + 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