|
Un programme de bataille navale (ne gère pas le positionnement côte à côte des bateaux) #include <stdio.h>
#include <conio.h>
#define DEBUG 0
// forward declarations
void afficher_grille(char grille[11][11]);
/* fonction initialisant toutes les cases de la grille de jeu par "."*/
void iniplateau(char grille[11][11]) {
int l, c;
for (l = 1 ; l < 11 ; l++)
for (c = 1 ; c < 11 ; c++)
grille[l][c] = '.';
for (l = 1 ; l < 11 ; l++)
grille[l][0] = '0' + l;
grille[10][0] = '0';
for (c = 1 ; c < 11 ; c++)
grille[0][c] = 'A' + c - 1;
grille[0][0] = ' ';
}
/* vérifie qu'une ordonnée est bien un chiffre et retourne sa valeur entière
sauf pour zéro pour lequel on retourne 10. Si la vérification échoue, retourne -1 */
int valide_ordonnee(char ord) {
if ((ord >= '0') && (ord <= '9'))
if (ord == '0')
return 10;
else
return ord - '0';
return -1;
}
/* vérifie qu'une abscisse est bien une lettre dans l'intervalle 'a' - 'j' ou 'A' - 'J' et retourne
la valeur entière correspondante ('a' vaut 1). Si la vérification échoue, retourne -1 */
int valide_abscisse(char abs) {
if ((abs >= 'a') && (abs <= 'z'))
abs = abs + 'A' - 'a';
if ((abs >= 'A') && (abs <= 'Z'))
return abs - 'A' + 1;
return -1;
}
int calculer_coord_possibles(int colonne, int ligne, int taille_bateau,
char grille[11][11], char coordonnees_possibles[4][2]) {
int nb_possibilites = 0;
int ok = 1;
int cpt;
#if DEBUG
printf("%s:%d calculer_coord_possibles(%i, %i, %i)\n", __FILE__, __LINE__, colonne, ligne, taille_bateau);
printf("ligne - (taille_bateau - 1) = %i\n", ligne - (taille_bateau - 1));
printf("ligne + (taille_bateau - 1) = %i\n", ligne + (taille_bateau - 1));
printf("colonne - (taille_bateau - 1) = %i\n", colonne - (taille_bateau - 1));
printf("colonne + (taille_bateau - 1) = %i\n", colonne + (taille_bateau - 1));
#endif
if (grille[ligne][colonne] != '.')
return 0;
#if DEBUG
printf("%s:%d grille[ligne][colonne] = %c\n", __FILE__, __LINE__, grille[ligne][colonne]);
#endif
/* vers le haut de la grille */
if (ligne - (taille_bateau - 1) < 1)
ok = 0;
for (cpt = 0 ; (cpt < taille_bateau) && ok ; cpt++)
if (grille[ligne - cpt][colonne] != '.')
ok = 0;
if (ok) {
coordonnees_possibles[nb_possibilites][0] = colonne + 'A' - 1;
coordonnees_possibles[nb_possibilites][1] = ligne - (taille_bateau - 1) + '0';
nb_possibilites++;
}
/* vers le bas de la grille */
ok = 1;
if (ligne + (taille_bateau - 1) > 11)
ok = 0;
for (cpt = 0 ; (cpt < taille_bateau) && ok ; cpt++)
if (grille[ligne + cpt][colonne] != '.')
ok = 0;
if (ok) {
coordonnees_possibles[nb_possibilites][0] = colonne + 'A' - 1;
coordonnees_possibles[nb_possibilites][1] = ligne + (taille_bateau - 1) + '0';
if (coordonnees_possibles[nb_possibilites][1] == ('0' + 10))
coordonnees_possibles[nb_possibilites][1] = '0';
nb_possibilites++;
}
/* vers la droite de la grille */
ok = 1;
if (colonne + (taille_bateau - 1) > 11)
ok = 0;
for (cpt = 0 ; (cpt < taille_bateau) && ok ; cpt++)
if (grille[ligne][colonne + cpt] != '.')
ok = 0;
if (ok) {
coordonnees_possibles[nb_possibilites][0] = colonne + (taille_bateau - 1) + 'A' - 1;
coordonnees_possibles[nb_possibilites][1] = ligne + '0';
if (coordonnees_possibles[nb_possibilites][1] == ('0' + 10))
coordonnees_possibles[nb_possibilites][1] = '0';
nb_possibilites++;
}
/* vers la gauche de la grille */
ok = 1;
if (colonne - (taille_bateau - 1) < 1)
ok = 0;
for (cpt = 0 ; (cpt < taille_bateau) && ok ; cpt++)
if (grille[ligne][colonne - cpt] != '.')
ok = 0;
if (ok) {
coordonnees_possibles[nb_possibilites][0] = colonne - (taille_bateau - 1) + 'A' - 1;
coordonnees_possibles[nb_possibilites][1] = ligne + '0';
if (coordonnees_possibles[nb_possibilites][1] == ('0' + 10))
coordonnees_possibles[nb_possibilites][1] = '0';
nb_possibilites++;
}
return nb_possibilites;
}
void placefinale(int colonne, int ligne, char colc, char ligc, char grille[11][11], int taille_bateau, char lettre_bateau) {
#if DEBUG
printf("%s:%d place_finale(%i, %i, %c, %c, %i, %c)\n", __FILE__, __LINE__, colonne, ligne, colc, ligc, taille_bateau, lettre_bateau);
#endif
int lignefin = ligc - '0';
int colonnefin = colc - 'A' + 1;
if (lignefin == 0)
lignefin = 10;
int debut, fin, cpt;
if (colonne == colonnefin) {
if (ligne < lignefin) {
debut = ligne;
fin = lignefin;
}
else {
debut = lignefin;
fin = ligne;
}
for (cpt = 0 ; cpt < (fin - debut + 1) ; cpt++)
grille[debut + cpt][colonne] = lettre_bateau;
}
else {
if (colonne < colonnefin) {
debut = colonne;
fin = colonnefin;
}
else {
debut = colonnefin;
fin = colonne;
}
for (cpt = 0 ; cpt < (fin - debut + 1) ; cpt++)
grille[ligne][debut + cpt] = lettre_bateau;
}
}
/* fonction qui place les bateaux du joueur. Retourne le nombre de places occupées par les
bateaux sur la grille */
int placebateau(char grille[11][11], char* joueur) {
/* 1 porte-avion 5 cases
1 croiseur 4 cases
2 destroyers 3 cases
2 sous-marins 2 cases */
int ligne, colonne, cpt1, cpt2, cpt3, nb_places = 0, nb_coord_possibles;
char abscisse, ordonnee, choix;
int nb_bateau_par_type[] = {1, 1, 2, 2};
int nb_cases_par_bateau[] = {5, 4, 3, 2};
char lettre_bateau[] = {'P', 'C', 'D', 'S'};
char coordonnees_possibles[4][2];
char* message[] = {"%s : saisissez la premiere coordonnee du porte-avion numero %i ",
"%s : saisissez la premiere coordonnee du croiseur numero %i ",
"%s : saisissez la premiere coordonnee du destroyer numero %i ",
"%s : saisissez la premiere coordonnee du sous-marin numero %i "};
printf("sizeof(nb_bateau_par_type) / sizeof(int) = %d\n", sizeof(nb_bateau_par_type) / sizeof(int));
for (cpt1 = 0 ; cpt1 < (sizeof(nb_bateau_par_type) / sizeof(int)) ; cpt1++) {
for (cpt2 = 0 ; cpt2 < nb_bateau_par_type[cpt1] ; cpt2++) {
do {
printf(message[cpt1], joueur, cpt2 + 1);
abscisse = getch();
printf("%c", abscisse);
ordonnee = getch();
printf("%c\n", ordonnee);
colonne = valide_abscisse(abscisse);
ligne = valide_ordonnee(ordonnee);
#if DEBUG
printf("colonne=%i, ligne=%i\n", colonne, ligne);
#endif
if ((colonne != -1) && (ligne != -1))
nb_coord_possibles = calculer_coord_possibles(colonne, ligne, nb_cases_par_bateau[cpt1], grille, coordonnees_possibles);
else
nb_coord_possibles = 0;
}
while (nb_coord_possibles == 0);
for (cpt3 = 0 ; cpt3 < nb_coord_possibles ; cpt3++) {
printf("%i - coordonnees %c%c\n", cpt3 + 1, coordonnees_possibles[cpt3][0], coordonnees_possibles[cpt3][1]);
}
do {
printf("Saisissez votre choix ");
choix = getch();
printf("%c\n", choix);
}
while (((choix - '0') < 1) || ((choix - '0') > nb_coord_possibles));
placefinale(colonne, ligne, coordonnees_possibles[choix - '0' - 1][0], coordonnees_possibles[choix - '0' - 1][1],
grille, nb_cases_par_bateau[cpt1], lettre_bateau[cpt1]);
nb_places += nb_cases_par_bateau[cpt1];
#if DEBUG
afficher_grille(grille);
#endif
}
}
return nb_places;
}
int coup(char* joueur, char grille_joueur[11][11], char grille_adversaire[11][11]) {
char abscisse, ordonnee;
int colonne, ligne, valeur_retour, continue_saisie;
do {
printf("%s : saisissez votre coup ", joueur);
abscisse = getch();
printf("%c", abscisse);
ordonnee = getch();
printf("%c\n", ordonnee);
colonne = valide_abscisse(abscisse);
ligne = valide_ordonnee(ordonnee);
#if DEBUG
printf("colonne=%i, ligne=%i\n", colonne, ligne);
#endif
continue_saisie = 1;
if ((colonne != -1) && (ligne != -1))
if (grille_joueur[ligne][colonne] == '.')
continue_saisie = 0;
else
printf("Coup d\x82ja jou\x82\n");
}
while (continue_saisie);
if (grille_adversaire[ligne][colonne] == '.') {
grille_joueur[ligne][colonne] = 'o';
printf("a l'eau !\n");
valeur_retour = 0;
}
else {
grille_joueur[ligne][colonne] = 'x';
printf("touche !\n");
valeur_retour = 1;
}
return valeur_retour;
}
void afficher_grille(char grille[11][11]) {
int cpt1, cpt2;
for (cpt1 = 0 ; cpt1 < 11 ; cpt1++) {
for (cpt2 = 0 ; cpt2 < 11 ; cpt2++)
printf("%c ", grille[cpt1][cpt2]);
printf("\n");
}
}
int main(void) {
char grilleBJ1[11][11], grilleBJ2[11][11]; /* grilles des bateaux */
char grilleJJ1[11][11], grilleJJ2[11][11]; /* grilles de jeu */
char joueur1[20+1], joueur2[20+1];
char* joueur_en_jeu;
int nb_places_bateaux_j1, nb_places_bateaux_j2;
int resultat_coup;
printf("Joueur 1, saisissez votre nom : ");
scanf("%s", joueur1);
joueur1[20] = '\0';
printf("Joueur 2, saisissez votre nom : ");
scanf("%s", joueur2);
joueur2[20] = '\0';
printf("Partie : %s contre %s\n", joueur1, joueur2);
iniplateau(grilleBJ1);
iniplateau(grilleBJ2);
iniplateau(grilleJJ1);
iniplateau(grilleJJ2);
nb_places_bateaux_j1 = placebateau(grilleBJ1, joueur1);
nb_places_bateaux_j2 = placebateau(grilleBJ2, joueur2);
do {
joueur_en_jeu = joueur1;
afficher_grille(grilleJJ1);
resultat_coup = coup(joueur_en_jeu, grilleJJ1, grilleBJ2);
nb_places_bateaux_j2 -= resultat_coup;
if (nb_places_bateaux_j2 > 0) {
joueur_en_jeu = joueur2;
afficher_grille(grilleJJ2);
resultat_coup = coup(joueur_en_jeu, grilleJJ2, grilleBJ2);
nb_places_bateaux_j1 -= resultat_coup;
}
}
while ((nb_places_bateaux_j1 > 0) && (nb_places_bateaux_j2 > 0));
printf("%s gagne !\n", joueur_en_jeu);
if (joueur_en_jeu == joueur1)
afficher_grille(grilleJJ1);
else
afficher_grille(grilleJJ2);
printf("Appuyez sur une touche pour continuer...");
getch();
return 0;
}
-------
Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.
Gustave Parking
|