#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>
#define VISIBLE 1
#define INVISIBLE 0
int modeAffichage; // 1 pour visible, 0 pour invisible
typedef struct { // D�finition de notre structure Navire pour les bateaux en jeu.
char* nom;
int taille;
} Navire;
void Init_grille(char grille[10][10]) { // Initialisation de la grille de jeu
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
grille[i][j] = 'O';
}
}
}
void Affiche_grille(char grille[10][10]) { // Affichage de la grille
printf(" ");
for (char lettre = 'A'; lettre < 'J'; lettre++) {
printf("%c ", lettre); // Affiche les lettres des colonnes
}
printf("\n");
for (int i = 0; i < 9; i++) {
printf("%d ", i + 1); // Commence � afficher les num�ros de ligne � partir de 1
for (int j = 0; j < 9; j++) {
char cellule = grille[i][j];
if (modeAffichage == INVISIBLE && (cellule == 'P' || cellule == 'C' || cellule == 'S' || cellule == 'T')) {
printf("O "); // Remplace les bateaux par de l'eau si en mode invisible
} else {
printf("%c ", cellule);
}
}
printf("\n");
}
}
bool estDansLaGrille(int taille, int ligne, int colonne, char orientation) {// Verification de est ce que les coordonn�es sont dans la grille
if (orientation == 'H') {
return colonne + taille <= 9;
} else if (orientation == 'V') {
return ligne + taille <= 9;
}
return false;
}
bool estChevauchement(char grille[10][10], int taille, int ligne, int colonne, char orientation) { // Verification simple de chevauchement
if (orientation == 'H') {
for (int i = 0; i < taille; i++) {
if (grille[ligne][colonne + i] != 'O') return true;
}
} else if (orientation == 'V') {
for (int i = 0; i < taille; i++) {
if (grille[ligne + i][colonne] != 'O') return true;
}
}
return false;https://www.onlinegdb.com/online_c_compiler#tab-stdin
}
int Init_bateau(char grille[10][10], Navire navire, int ligne, int colonne, char orientation) {
if (colonne >= 'A' && colonne <= 'I') {
colonne -= 'A';
} else if (colonne >= 'a' && colonne <= 'i') {
colonne -= 'a';
}
// Ajuster la ligne et la colonne pour commencer � A:1
ligne--;
colonne--;
while (!estDansLaGrille(navire.taille, ligne, colonne, orientation) || estChevauchement(grille, navire.taille, ligne, colonne, orientation)) {
// Si les conditions ne sont pas remplies, on g�n�re de nouvelles coordonn�es al�atoires
ligne = rand() % 9 + 1;
colonne = rand() % 9 + 1;
}
// Une fois que des coordonn�es valides sont trouv�es, on place le navire sur la grille
for (int i = 0; i < navire.taille; i++) {
if (orientation == 'H') {
grille[ligne][colonne + i] = navire.nom[0]; // on vient nommer les position avec la premiere lettre du navire
} else if (orientation == 'V') {
grille[ligne + i][colonne] = navire.nom[0];
}
}
return 1;
}
void placer_bateaux_aleatoirement(char grille[10][10]) {
srand(time(NULL)); // Initialiser le g�n�rateur de nombres al�atoires
Navire porte_avion = {"P", 5};
Navire croiseur = {"C", 4};
Navire sous_marin = {"S", 3};
Navire torpilleur = {"T", 2};
// Placer le porte-avions
char orientation = rand() % 2 == 0 ? 'H' : 'V'; // Choix al�atoire de l'orientation
int ligne = rand() % 9 + 1; // Ligne al�atoire entre 1 et 9
int colonne = rand() % 9 + 1; // Colonne al�atoire entre 1 et 9
Init_bateau(grille, porte_avion, ligne, colonne, orientation);
// Placer le croiseur
do {
orientation = rand() % 2 == 0 ? 'H' : 'V';
ligne = rand() % 9 + 1;
colonne = rand() % 9 + 1;
} while (!Init_bateau(grille, croiseur, ligne, colonne, orientation));
// Placer le sous-marin
do {
orientation = rand() % 2 == 0 ? 'H' : 'V';
ligne = rand() % 9 + 1;
colonne = rand() % 9 + 1;
} while (!Init_bateau(grille, sous_marin, ligne, colonne, orientation));
// Placer le torpilleur
do {
orientation = rand() % 2 == 0 ? 'H' : 'V';
ligne = rand() % 9 + 1;
colonne = rand() % 9 + 1;
} while (!Init_bateau(grille, torpilleur, ligne, colonne, orientation));
}
void Test_tirs(char grille[10][10]) {
char colonneLet;
int ligne, colonne;
// On demande les coordonn�es x et y et on les mets dans les variable colonneLet,ligne
printf("Entrez les coordonnees horizontale du tir (A,B,C,D,E,F,G,H,I) : ");
scanf(" %c", &colonneLet);
printf("Entrez les coordonnees verticale du tir (1,2,3,4,5,6,7,8,9) : ");
scanf(" %d", &ligne);
colonne = toupper(colonneLet) - 'A' + 1; // toupper et une fonction servant a mettre tout en majuscule (pratique pour ne g�rer que un cas (les minuscules))
if (ligne < 1 || ligne > 9 || colonne < 1 || colonne > 9) { // Modifier les limites pour exclure J
printf("Coordonnees invalides.\n");
return;
}
if (grille[ligne - 1][colonne - 1] == 'O') {
printf("Coup dans l'eau.\n");
grille[ligne - 1][colonne - 1] = 'E';
} else if (grille[ligne - 1][colonne - 1] != ' ' && grille[ligne - 1][colonne - 1] != 'E' && grille[ligne - 1][colonne - 1] != 'X') {
printf("Bateau %c touche!\n", grille[ligne - 1][colonne - 1]);
grille[ligne - 1][colonne - 1] = 'X';
}
}
bool Test_fin_jeu(char grille[10][10]) {
for (int i = 0; i < 9; i++) { // Modifier le nombre de lignes
for (int j = 0; j < 9; j++) { // Modifier le nombre de colonnes
if (grille[i][j] != 'O' && grille[i][j] != 'E' && grille[i][j] != 'X') {
return false; // On vient passer en revu tout notre grille si a un seul moment on constate autre chose que O (rien dans cette position) ou E (tirs �chou�) ou X (tir r�ussi) alors on peut en d�duire que tout les bateaux ne sont pas encore d�truits donc return false.
}
}
}
printf("Jeu termine!\n"); // Cas �ch�ant ici
return true;
}
int main() {
char grille[10][10];
Init_grille(grille);
printf("Voulez-vous placer les bateaux al�atoirement ? (1 pour oui, 0 pour non) : ");
int choix;
scanf("%d", &choix);
if (choix == 1) {
placer_bateaux_aleatoirement(grille);
} else {
// D�finition de nos bateaux gr�ce � notre structure.
Navire porte_avion = {"P", 5};
Navire croiseur = {"C", 4};
Navire sous_marin = {"S", 3};
Navire torpilleur = {"T", 2};
// Initialisation de nos bateaux
Init_bateau(grille, porte_avion, 1, 1, 'H');
Init_bateau(grille, croiseur, 3, 4, 'V');
Init_bateau(grille, sous_marin, 5, 5, 'H');
Init_bateau(grille, torpilleur, 8, 7, 'V');
}
printf("Voulez-vous afficher les bateaux ? (1 pour oui, 0 pour non) : ");
scanf("%d", &modeAffichage);
Affiche_grille(grille);
bool jeuTermine = false;
do {
Test_tirs(grille);
Affiche_grille(grille);
jeuTermine = Test_fin_jeu(grille); // si le jeu est termin� alors notre while (!jeuTermine) cesse.
} while (!jeuTermine);
return 0;
}