SAE1.1_DEV/biblioNavale2.c

366 lines
8.0 KiB
C
Raw Normal View History

2023-01-05 20:10:03 +01:00
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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);
}
}
}