UNE PETITE BATAILLE NAVALE EN C

mastave Messages postés 53 Date d'inscription samedi 24 novembre 2001 Statut Membre Dernière intervention 25 janvier 2003 - 4 mai 2002 à 13:04
raffikos Messages postés 3 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 30 mai 2012 - 30 mai 2012 à 09:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/9728-une-petite-bataille-navale-en-c

raffikos Messages postés 3 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 30 mai 2012
30 mai 2012 à 09:49
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define N 15
#define R 6


/******************************************************************************/
// LE CHOISISSEMENT DE POSITION //
/******************************************************************************/

//Dans cette partie on écrit des fonctions pour bien montrer au joueur ce qu'il choisit. Lors de saisissement de valeur, joueur saura pour lequel sera son choix. €Le procedure pour les fonctions "saisirL" et "saisirC" est la nécessité de saisir un nombre entre 0 et N-1. €Le procedure pour la fonction "saisirOrien" est nécessité de saisir un nombre soit 1 soit 0.


//Choisir ligne
int saisirL(){
int i;
do{
printf("\nChoisissez la ligne: ");
scanf("%d", &i);
}while(i<0 || i>=N);
return i;
}

//Choisir colonne
int saisirC(){
int i;
do{
printf("\nChoisissez la colonne: ");
scanf("%d", &i);
printf("\n");
}while(i<0 || i>=N);
return i;
}

//Choisir l'orientation
int saisirOrien(){
int i;
do{
printf("\nChoisissez une orientation\n\n 0-> pour horizontale\n 1-> pour verticale' : ");
scanf("%d", &i);
} while(i>0 || i<0);
return i;
}

/*****************************************************************************/
// L'INITIALISATION DE TABLEAU ET L'AFFICHAGE //
/******************************************************************************/

//Initialisation de l'espace de jeu(grille)
void init(char bahce[N][N]){
int i, j;
for(i=0; i<N; i++){
for(j=0; j<N; j++){
bahce[i][j]='_';
}
}
}

//Affichage du grille avec le bombardement qu'on a fait. En effet, on ne verra pas les positions des bateaux des joueurs sauf que leurs bombardements.Si les coordonées faites par joueur corresponde à une partie des bateau on affiche 'X' sinon on affiche 'O'.
void affiche(char bahce[N][N]){
int i, j;
char x='A';
printf("\n");
for(i = 0 ; i < N ; i++){
for(j = 0 ; j < N ; j++){
if((bahce[i][j] == 'O') || (bahce[i][j] == 'X'))
printf("%c ", bahce[i][j]);
else printf(" ");
}
printf("\n");
}
}

/******************************************************************************/
/*******************Structure du bateau****************************************/
/******************************************************************************/

//On crée une liste chînée qui contient la position du bateau tels que sa ligne, colonne, orientation, longuer et si le bateau est detruit(coulé) ou pas. Ce structure qui contient un pointeur permettra que le premier bateau pointe sur le deuxiÚme bateau, le deuxiÚme sur le troisiÚme etc...Grâce à cette fonction memorisera tous les informations qui appartient au bateau.

typedef struct position position;
struct position{
int l; //ligne
int c; //colonne
int o; //orien
int lon; //longuer
int det; //detruit
struct position* suiv;
};
typedef struct position* tbateau;

//Cette fonction permettra au joueur de créer son propre bateau en choisissant sa position. On prend un entier en argument et en renvoie une celule qui compose un bateau avec ses coordonées et ses informations.A la fin de fonction , on met l'adresse de l'élement suivant a NULL. En effet, au moment où tout est réalisé, il signale qu'il n'y a pas d'élément suivant. Grâce à cela, dans la suite du projet, on fait pointer la premier construction sur la deuxiÚme.

tbateau creerJoueur(int y){
tbateau x;
x = malloc(sizeof(*x)); //on alloue une espace memoire pour x

x->l = saisirL(); //on pointe sur un valeur grâce à la fonction saisirL qui sera la ligne
x->c = saisirC(); //on pointe sur un valeur grâce à la fonction "saisir C" qui sera la colonne
x->o = saisirOrien(); //on pointe sur l'orientation
x->det = 0; //on pointe sur la présence(coulé ou pas)Au début le bateau n'est pas coulé
x->lon = y; //on pointe sur la longeur qu'on prend en paramétre
x->suiv = NULL; //on pointe à NULL pour terminer l'action.
return x;
}

//La fonction "creerOrdi" est la même fonction que l'on vient de faire. Ici, le but est de faire choisir la position du bateau aleatoirement si l'on veut jouer contre l'ordinateur.

tbateau creerOrdi( int y){
tbateau x;
x = malloc(sizeof(*x)); //on alloue une espace memoire pour x
srand(time(NULL)); //initialisation de random pour utiliser dans la suite
x->l = (rand() % N) ; // on choisit un nombre parhasar entre 0 et N(N n'es t pas inclus mais 0.
x->c = (rand() % N) ;
x->o = rand()%2; //on choisit un nombre ente 0 et 2 (soit 1 soit 0).
x->det = 0;
x->lon = y;
x->suiv = NULL;
return x;
}

/******************************************************************************/
/*****************************************************************************/
/**********CREER L'ESPACE DE JEUX EN REMPLAÇANT LES BATEAUX********************/
/******************************************************************************
/******************************************************************************/

//Ces deux fonctions " parhasarOrdi " et "parhasarJoueur ", ce sont l'une des plus important pour le jeu. Ici, on créer réellement l'espace de jeu en remplaçant tous les bateaux sur la grille. €Partie 1_____________________ Dans cette partie on choisit un nombre par hasar entre 1 et R. On fait ce traitement 6 fois. On remplace les nombres qu'on obtient au fur et à mesure , dans le tableau fener afin de se servir. En effet, cette action permet de ne pas choisir les memes nombres dans le meme ordre. Donc on augmente la possibilité de la diversité. €Partie 2____________________ C'est la partie où on initialise la grille €Partie 3_____________________ On crée le bateau en faisant l'appel à la fonction qu'on avait déjà créée.Dans la suite on vérifie si la longeur du bateau dépasse le tableau et s'il y a quelque chose différent de " _ ". Si c'est le cas, avec la fonc " rand() " on fait d'autre choix jusqu'à ce que les conditions soient bonnes. Note: " 0 " sera notre orientation horizantalement " 1 " sera notre orientation verticalement €Partie 4_____________________ Dans cette partie, on prend les mesures pour ne pas risquer que le bateau, qui est remplacé horizantalement , soit décalé ou bien ne soit pas existé. €Partie 5______________________ Ici, on converti les nombres qu'on recupere dans le tableau " fener ", qui est un type d'entier, à une chaine de caractÚre et puis on les affiche. Avec cette boucle on obtiendra 6 bateaux qui sont présentés par des différents nombres. €Partie 6 et Partie 7___________ Ces deux partie, c'est la répétition des parties 4 et 5. Seul différence est le fait de vérifier les mêmes conditions pour les bateaux qui sont remplacés verticalement. €Partie 8____________________ AprÚs avoir fait la création du bateau et tous les vérification, on sait que l'on a bien remplacé notre premier bateau qui est présenté par un nombre. Dans cette derniÚre partie , on fait pointer un le premier bateau au deuxiÚme qui sera constitué dans le prachain tour de la boucle.Et à la fin, on obtient une liste chaînée formé par 6 bateaux et on renvoie cette liste chaînée. Note : Seul différence entre " parhasarOrdi " et " parhasarJoueur " est le fait de refaire les choix. Dans la fonction "parhasarOrdi" , on fait eleatoirement tandis que la fonction "parhasarJoueur" où c'est le joueur qui fait son propre choix. Donc pour "parhasarOrdi" , on n'a pas besoin de " partie 1 ".

//______________________________________________________________________________
/*1- Remplacement des bateaux de l'ordinateur */
//______________________________________________________________________________

tbateau parhasarOrdi( char bahce[N][N] ) { // l'espace de jeu
int a,b,c,d,e,f,r;
int i,j;
tbateau bat1,bat2, bat;
char fener[R]; //qui contient le nombre par hasar

char tmp[2] ;
int orien; //horizontalement, verticalement
int remp=0; //boucle, avec lequel on remplace les batiment
int rec=0;
int k, l; //choisir la case de debut
int val=1 ;

//Partie 1
srand(time(NULL));
a = (rand() % R) + 1;
r = (rand() % R) + 1;
while(a == r)
r = (rand() % R) + 1;
b = r;
r = (rand() % R) + 1; while (a r || b r)
r = (rand() % R)+1;
c = r;
r = (rand() % R) + 1; while (a r || b r || c == r)
r = (rand() % R) + 1;
d = r;
r = (rand() % R) + 1; while (a r || b r || c == r || d == r)
r = (rand() % R) + 1;
e=r; while (a r || b r || c == r || d == r || e==r)
r= (rand() % R) + 1;
f=r;

fener[0] = a;
fener[1] = b;
fener[2] = c;
fener[3] = d;
fener[4] = e;
fener[5] = f;

//Partie 2
for(i=0; i<N; i++){
for(j=0; j<N; j++){
bahce[i][j]='_';
}
printf("\n");
}
//Partie 3
bat = NULL;
for(remp = 0; remp < R; remp++) { //on remplace 7 batiment
bat1 = creerOrdi(fener[remp]);

if(bat1->o == 0){
while(bat1->c+fener[remp] > N-1 || bahce[bat1->l][bat1->c] != '_'){
bat1->l = (rand() % N) ;
bat1->c = (rand() % N) ; // remplacer les batiment
}
}

if(bat1->o == 1){
while(bat1->l+fener[remp] > N-1 || bahce[bat1->l][bat1->c] != '_'){
bat1->l = (rand() % N) ; //on choisit les cordonnes par hasar pour
bat1->c = (rand() % N) ;
}
}

//Partie 4 //verification pour qu'il ne dpasse pas le tableau, decale pas et raate pas un bateau
if(bat1->o == 0 ){ //horizontalement sinon verticalement on remplace
rec = 0;
while(rec < fener[remp]){ //jusqua le nombre par hasar, il va faire...
if(bahce[bat1->l][bat1->c+rec] != '_'){
do{
bat->c = (rand() % N) ; //on choisit les cordonnes par hasar pour
bat1->l = (rand() % N) ;
}while(bat->c + fener[remp] > N-1);
rec = -1;
}
rec++;
}
//Partie 5 //convertir l'entier à caractere
for(rec = 0; rec < fener[remp]; rec++){
sprintf(tmp,"%d",fener[remp]);
bahce[bat1->l][bat1->c+rec] = tmp[0];
}
//Partie 6

}else if(bat1->o == 1){
val = 1;
rec = 0;
while(rec < fener[remp]){ //jusqua le nombre par hasar, il va faire...
if(bahce[bat1->l+rec][bat1->c] != '_'){
do{
bat1->l = (rand() % N) ; //on choisit les cordonnes par hasar pour
bat1->c = (rand() % N) ;
}while(bat1->l+fener[remp] > N-1);
rec = -1;
}
rec++;
}
//Partie 7
for(rec = 0; rec < fener[remp]; rec++){
sprintf(tmp,"%d",fener[remp]);
bahce[bat1->l+rec][bat1->c] = tmp[0];
}
}
//Partie 8
bat2 = bat ;
if(bat == NULL){
bat = bat1;
}else{
while(bat2->suiv != NULL){
bat2 = bat2 -> suiv ;
}
bat2->suiv = bat1 ;
}
}

return bat ;
}

//______________________________________________________________________________
//2- Remplacement des bateaux de joueur
//_____________________________________________________________________________

tbateau parhasarJoueur(char bahce2[N][N]){
int k,l,i,j;
char tmp2[2];
int rec2 = 0;
int remp2 = 0;
int orien2;
int val2 = 1;
tbateau bat1, bat2 , bat;


//Partie 2____________________________
for(i = 0; i < N; i++){
for(j = 0; j < N; j++){
bahce2[i][j] = '_';
}
printf("\n");
}

printf("\n\n");

//Partie 3_______________________________

bat = NULL;
for(remp2 = 1; remp2 <= R; remp2++) { //on remplace 7 batiment
bat1 = creerJoueur(remp2);

if(bat1->o == 0){

while(bat1->c+remp2 > N-1 || bahce2[bat1->l][bat1->c] != '_'){
bat1->c = saisirC() ; // remplacer les batiment
}
}

if(bat1->o == 1){
while(bat1->l+remp2 > N-1 || bahce2[bat1->l][bat1->c] != '_'){
bat1->l = saisirC(); //on choisit les cordonnes par hasar pour
}
}

//Partie 4________________________________

if(bat1->o == 0 ){ //horizontalement sinon verticalement on remplace
rec2 = 0;
while(rec2 < remp2){ //jusqua le nombre par hasar, il va faire...
if(bahce2[bat1->l][bat1->c+rec2] != '_'){
do{
bat1->c = saisirL() ; //on choisit les cordonnes par hasar pour
}while(bat->c + remp2 > N-1);
rec2 = -1;
}
rec2++;
}

//Partie 5_________________________________

for(rec2 = 0; rec2 < remp2; rec2++){
sprintf(tmp2,"%d",remp2);
bahce2[bat1->l][bat1->c+rec2] = tmp2[0];
}
//Partie 6____________________________________
}else if(bat1->o == 1){
val2 = 1;
rec2 = 0;
while(rec2 < remp2){ //jusqua le nombre par hasar, il va faire...
if(bahce2[bat1->l+rec2][bat1->c] != '_'){
do{
bat1->l = saisirL() ; //on choisit les cordonnes par hasar pour
}while(bat1->l+remp2 > N-1);
rec2 = -1;
}
rec2++;
}

//Partie 7____________________________________

for(rec2 = 0; rec2 < remp2; rec2++){
sprintf(tmp2,"%d",remp2);
bahce2[bat1->l+rec2][bat1->c] = tmp2[0];
}
}



//Partie 8____________________________________
bat2 = bat ;
if(bat == NULL){
bat = bat1;
}else{
while(bat2->suiv != NULL){
bat2 = bat2 -> suiv ;
}
bat2->suiv = bat1 ;
}

}

return bat ;
}

/******************************************************************************/
/******************************************************************************/
/*********************** FAIRE JOUER ******************************************/
/******************************************************************************/
/******************************************************************************/

//Ces fonctions sont faites pour utiliser lors de bombardement. En effet, d'abordles coordonnées sont choisies par le joueur afin de trouver une partie du bateau sur la grille de joueur adversaire. En suite, si les coordonnées saisies par le joueur corresponde l'un des bateaux de joueur l'adversaire on affiche " X ", sinon on affiche " O ".

//_____________________________________________________________________________
// Pour joueur
//_____________________________________________________________________________

void jouerA(char bahce[N][N]){ // met void et test avec le printf....
int ligne,colonne;

do{
ligne = saisirL();
colonne = saisirC();
printf("\n");
}while(bahce[ligne][colonne] == 'O' || bahce[ligne][colonne] == 'X' || colonne >= N || ligne >= N);

if(bahce[ligne][colonne] != '_'){
bahce[ligne][colonne] = 'X';

}else{
bahce[ligne][colonne] = 'O';

}
}

//______________________________________________________________________________
// Pour l'ordinateur
//______________________________________________________________________________

void jouerOrdi(char ch[N][N]){
int k,l, m,n;

srand(time(NULL));
do{
k = rand()%N;
l = rand()%N;
}while(ch[k][l] == 'O' || ch[k][l] == 'X' || k >= N || l >= N);

if(ch[k][l] != '_'){
ch[k][l] = 'X';
}else{
ch[k][l] = 'O';

}
}

/******************************************************************************/
/******************************************************************************/
/**************VERIFICATION****************************************************/
/******************************************************************************/

// Avant de commencer à composer tous les fonctions dans le main, il nous reste de savoir si un bateau est coulé ou pas. En effet, on doit bombarde la partie entiÚre du bateau (Donc il faut bombarder toute sa longeur ). Cela nous permettera à constituer le nombre du coup.

int verifbateau(char bh[N][N], tbateau bat){
int i, remp,val ;
tbateau Tbat ;
Tbat=NULL;
Tbat = bat ;

while(Tbat != NULL){ val 0 , i 0;
if(Tbat->det == 0){
if(Tbat->o == 0){ //Orientation horizontale
while(i < Tbat->lon){
if(bh[Tbat->l][Tbat->c + i] != 'X')
val = 1;
i++;
}
}else if(Tbat->o == 1){ //Orientation verticale
while(i < Tbat->lon){
if(bh[Tbat->l + i][Tbat->c] != 'X')
val = 1;
i++;
}
}

if(val == 0){
Tbat->det = 1 ;
return 1 ;
}

}
Tbat = Tbat->suiv ;
}

return 0;
}

int choisir(){
int choix;
do{
printf("\n\n 1-Pour jouer contre l'ordinateur tapez-> 1\n\n 2-Pour jouer contre d'autre joueur tapez-> 2\n\n ");
scanf("%d", &choix);
}while(choix<1 || choix >2);
return choix;
}

int main(){
int choix; int i ,j,compteurOrdi 0 ,compteurJoueur1 0 , compteurJoueur2 = 0;
char TabOrdi[N][N] , TabJoueur1[N][N] , TabJoueur2[N][N];
tbateau BatOrdi , BatJoueur1 , BatJoueur2 , bat2 ;

printf("\n\n********************LES REGLES DU JEU**************************\n\n-Vous avez bateaux. Il vous faut de remplacer vos bateaux dans votre grille en choisissant sa position tels que ligne, colonne, orientation.\n\n-Veuillez saisir un nombre entre [0,14]\n-Si vous voulez le remplacer verticalement veuillez saisir < 1 > si horizantallement veuillez saisir < 0 >\n\n");

// sleep(5); // on attent que le joueur lit les consigne du jeu!!!

choix=choisir(); //on commence par demander au joueur de choisir son adversare

//Le jeu entre un joueur et l'ordinateur
if(choix == 1){
//Initialisation
init(TabOrdi);
init(TabJoueur1);

//Creation des tableaux et des bateaux
BatOrdi = parhasarOrdi(TabOrdi );
BatJoueur1 = parhasarJoueur(TabJoueur1);

//Debut du jeu
while((compteurOrdi < R) && (compteurJoueur1 < R) ){
// sleep(3);
printf("\nGRILLE DU JOUEUR\n");
jouerOrdi(TabJoueur1);
affiche(TabJoueur1);

if(verifbateau(TabJoueur1 , BatJoueur1) == 1 ){
compteurOrdi++;
}
printf("\nNombre de bateau detruit par ordinateur: %d\n",compteurOrdi);
sleep(3);
printf("\nC'est votre tour...\n\n");
jouerA(TabOrdi);
printf("\nGRILLE DE L'ORDINATEUR\n");
affiche(TabOrdi);

if(verifbateau(TabOrdi , BatOrdi) == 1 ){
compteurJoueur1++;
}
printf("\n Nombre de bateau detruit par joueur: %d\n",compteurJoueur1);
}
if((compteurOrdi == R) && (compteurJoueur1 < R) ){
printf("\nL'ordinateur a gagne\n");
}else if((compteurOrdi < R) && (compteurJoueur1 == R) ){
printf("\nLe Joueur1 a gagne\n");
}else
printf("\nPersonne n'a gagne\n");




}else{





// Le jeu entre deux joueurs

//Initialisation
init(TabJoueur1);
init(TabJoueur2);

//Creation des tableaux et des bateaux
printf("\n*****LA GRILLE DU JOUEUR1*****\n");
BatJoueur1 = parhasarJoueur(TabJoueur1 );
printf("\n*****LA GRILLE DU JOUEUR2*****\n");
BatJoueur2 = parhasarJoueur(TabJoueur2);


//Debut du jeu
while((compteurJoueur1 < R) && (compteurJoueur2 < R)){
// sleep(3);
printf("\n*****C'est le tour de Joueur1*****\n");


jouerA(TabJoueur2);//joueur1 va jouer dans l'espace de joueur2
printf("\nGRILLE DU JOUEUR2\n");
affiche(TabJoueur2);
if(verifbateau(TabJoueur2 , BatJoueur2) == 1 ){
compteurJoueur1++;
}
printf("\nNombre de bateau detruit par Joueur1 : %d\n",compteurJoueur1);
sleep(3);
printf("\nGRILLE DU JOUEUR1\n");
printf("\n*****C'est le tour de Joueur2*****\n");
jouerA(TabJoueur1);
affiche(TabJoueur1);

if(verifbateau(TabJoueur1 , BatJoueur1) == 1 ){
compteurJoueur2++;
}
printf("\nNombre de bateau detruit par Joueur2 : %d\n",compteurJoueur2);
}
if((compteurJoueur1 == R) && (compteurJoueur2 < R) ){
printf("\n€€€€€€Le Joueur1 a gagne€€€€€€\n");
}else if((compteurJoueur1 < R) && (compteurJoueur2 == R) ){
printf("\n€€€€€€Le Joueur2 a gagne€€€€€€\n");
}else
printf("\nPersonne n'a gagne!.....\n");

}

return 0;
}
voila le code mais,c'est du basique,pas tres ellaborè!!
raffikos Messages postés 3 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 30 mai 2012
26 avril 2012 à 13:53
le code source svp,j'ai esseyer de le realiser mais j' y arrive pas,je doit le rendre comme projet dans 10 jours,donc svp le code source merci d'avance
raffikos Messages postés 3 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 30 mai 2012
17 avril 2012 à 16:15
le code souce svp,merci d'avance
MaximeDeLaSeymaz Messages postés 1 Date d'inscription mercredi 29 octobre 2008 Statut Membre Dernière intervention 29 décembre 2008
13 nov. 2008 à 20:19
Oui STP Moi ausi !
peggyrachel Messages postés 3 Date d'inscription vendredi 9 mars 2007 Statut Membre Dernière intervention 9 mars 2007
9 mars 2007 à 22:59
salut est ce que je peux avoir le code pour savoir comment réaliser la sauvegarde et le chargement des partoies en langage C du jeu bataille navale.
OPERATION_EST Messages postés 2 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 4 mai 2005
4 mai 2005 à 17:51
je veut le code source non pas les fichiers du jeu "bataille navale".
cs_751 Messages postés 68 Date d'inscription vendredi 3 mai 2002 Statut Membre Dernière intervention 6 juillet 2007
25 juil. 2003 à 21:21
Bien mais il faut penser à mettre des contrôles sur la saisie des réponses si qlq'un entre une lettre le prog se plante .
Mais c'est bien continuer.
jandive Messages postés 1 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 6 mars 2003
6 mars 2003 à 09:27
Le code source plz le code source
mastave Messages postés 53 Date d'inscription samedi 24 novembre 2001 Statut Membre Dernière intervention 25 janvier 2003
4 mai 2002 à 13:04
Félicitations, c'est très bien!(9/10)
Rejoignez-nous