366 lines
8.0 KiB
C
366 lines
8.0 KiB
C
|
#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);
|
||
|
}
|
||
|
}
|
||
|
}
|