Programmation Java 1A - TP10
Tableaux à deux dimensions

Bataille navale

On souhaite réaliser un jeu de bataille navale. 

On choisit d'utiliser un plateau de jeu carré (par exemple 9 cases par 9). Ce plateau sera représenté en Java sous la forme d'un tableau de caractères à deux dimensions dans lequel les positions des bateaux seront stockées selon le codage suivant : v pour une case vide, a pour un bateau appartenant au joueur A, b pour un bateau appartenant au joueur B, et 2 lorsque les deux joueurs ont un bateau sur la même case (on utilise un seul tableau pour stocker les deux plateaux de jeu et donc les bateaux peuvent se superposer).

On limite la taille des bateaux à une seule case.

1. Dans la classe BatailleNavale, déclarer quatre constantes : VIDE, JOUEURA, JOUEURB, LES2JOUEURS qui valent respectivement 'v', 'a', 'b' et '2'.
    Ecrire la méthode main() :
        - déclarer un tableau de char à deux dimensions
        - demander à l'utilisateur quelle taille il veut pour le plateau de jeu (entre 2 et 9)
        - réserver la mémoire nécessaire
        - remplir toutes les cases du tableau avec le caractère VIDE

2. Ecrire une méthode afficher qui prend en argument un tableau à deux dimensions représentant un plateau de jeu et affiche à l'écran son contenu sous la forme suivante (utiliser l'instruction switch) : une case vide est représentée à l'écran par un espace, un bateau du joueur A par la lettre A, un bateau du joueur B par la lettre B, et lorsque les deux joueurs ont un bateau sur une case on affiche le chiffre 2.
    De plus, on numérote les colonnes par des chiffres et les lignes par des lettres.

    On obtiendra par exemple :


1
2
3
4
5
6
7
8 9
A
A








B




2




C
B

A


B

A

D









E
B








F






B


G

2






A
H









I

B



A




    Indications :
        En Java, char est un type de base (comme int, double, boolean...). On peut donc par exemple écrire :

            char lettre; // déclaration
            lettre='a'; // affectation
            if (lettre=='b') { ... } // comparaison avec ==

            switch (lettre) { // bifurcation suivant dfférentes valeurs
                case 'a': ...; // cas du caractère 'a'
            ... }

        Pour écrire les lettres de la première colonne, vous pouvez vous inspirer du code suivant (et vous souvenir des TP d'Archi sur les codes ASCII) qui affiche ABCDE à l'écran :

            char lettre='A'; // la première lettre est 'A'
            for (int i=0;i<5;i++) { // on veut afficher 5 lettres en tout
                System.out.print(lettre); // on affiche une lettre
                lettre=(char)(lettre+1); // on passe à la lettre suivante (le code ASCII augmente de 1)
            }

3. Ecrire une méthode placerBateauxAleatoirement() qui prend en argument un caractère indiquant le joueur pour lequel on place les bateaux, et un tableau représentant un plateau de jeu, et qui place aléatoirement N bateaux pour le joueur indiqué (où N est taille du plateau de jeu).
    Attention à ne pas placer deux bateaux du même joueur sur une même case !
    Indication : le code suivant fournit un nombre entier aléatoire entre 0 et 4 :
        int aleatoire=(int)(Math.random()*5);

4. Ecrire une méthode placerBateaux() qui a les mêmes arguments que placerBateauxAleatoirement() mais qui permet au joueur indiqué de placer lui-même ses bateaux. Pour l'instant, on se contentera de saisir deux chiffres entre 1 et N pour représenter le numéro de ligne et le numéro de colonne (et non pas une lettre et un chiffre)...

5. Maintenant que vous disposez de méthodes permettant de placer les bateaux, il reste à écrire la méthode qui permet à un joueur de lancer une torpille et de voir si un bateau ennemi est touché   
Ecrire une méthode jouer() qui prend en argument le nom d'un joueur et un tableau représentant le plateau de jeu et qui renvoie un booléen indiquant si le joueur qui vient de jouer a gagné.
    Cette méthode permet de lire des coordonnées au clavier, et de mettre à jour le plateau de jeu en fonction de la case qui a été torpillée : si un bateau ennemi est touché, il disparait (attention au cas où les deux joueurs avaient un bateau sur la case torpillée) ; si un bateau du joueur se trouve seul sur la case ou s'il n'y a aucun bateau, on considère que le coup est dans l'eau (un joueur ne peut pas couler ses propres bateaux !).
    Un message est affiché à l'écran indiquant le résultat du coup ("Coulé" ou "Dans l'eau").
    On compte ensuite combien il reste de bateaux ennemis et s'il n'en reste plus on renvoie true (le joueur qui vient de jouer a gagné !).

6. Il ne reste maintenant plus qu'à compléter  la méthode main() pour  jouer à la bataille navale à deux joueurs.
La  méthode main devra : 
7. (facultatif)
On peut bien sûr progammer une bataille navale à un joueur (joueur contre ordinateur)...