/**
  * La classe Navale represente le jeu d'un joueur de bataille navale ...
  * Pour cela on represente une grille de 8x8 cases contenant des bateaux.
  * Pour simplifier les algorithmiques (principalement supprimer des tests),
  * les bateaux ne pourront etre situes sur les bords de la grille et ne 
  * devront pas non plus se toucher.
*/
class Navale
{
	// Constantes facilitant le remplissage de la grille
	final boolean _ = false;
	final boolean o = true;
	/** Definition et initialisation du plateau de jeu */
	boolean[][] grille = {
		{_, _, _, _, _, _, _, _},
		{_, o, _, _, _, _, _, _},
		{_, o, _, _, _, o, _, _},
		{_, o, _, _, _, _, _, _},
		{_, o, _, _, _, _, _, _},
		{_, _, _, o, o, _, _, _},
		{_, _, _, _, _, _, _, _},
		{_, _, _, _, _, _, _, _}};

	public String toString()
	{
		String s = "  1 2 3 4 5 6 7 8\n";
		for (int i=0; i<grille.length; i++) {
			s+= (char) ('A'+i);
			for (int j=0; j<grille.length; j++) {
				if (grille[i][j])
					s+=" *";
				else
					s+=" o";
			}
			s+="\n";
		}
		return s;
	}
	
	/** Cette methode verifie la presence d'un bateau 
	  * dans la case de coordonnee (x,y).
	  * @param x coordonnee de la ligne.
	  * @param y coordonnee de la colonne.
	  * @return vrai si un bateau est present, faux sinon.
	*/
	public boolean tirerEn(int x, int y)
	{
		return grille[x][y];
	}
	
	/** Cette methode effectue la convertion d'une position sous forme de
	  * chaine de caracteres ("A3","C6" ...) en coordonnees entieres.
	  * @param position la position sous la forme "LettreChiffre"
	  * @return un tableau de deux cases contenant les deux coordonnees entieres.
	*/
	public int[] convertion(String position)
	{
		int[] coordonnees = new int[2];
		coordonnees[0] = (int) (position.charAt(0)-'A');
		coordonnees[1] = (int) (position.charAt(1)-'1');
		return coordonnees;
	}
	/** Cette methode verifie la presence d'un bateau 
	  * dans la case identifiee par une position donnee
	  * sous forme de chaine de caracteres : "A1", "D4" ...
	  * @param position la position sous la forme "LettreChiffre"
	  * @return vrai si un bateau est present, faux sinon.
	*/
	public boolean tirerEn(String position)
	{
		int[] coordonnees = convertion(position);
		return tirerEn(coordonnees[0], coordonnees[1]);
	}
	
	/** Retourne la taille du bateau situe aux coordonnees (x,y), si il y
	  * en a un ! Pour cela, on explore successivement les quatres directions
	  * possibles dans lesquelles le bateau pourrait etre oriente.
	  * @param x coordonnee de la ligne.
	  * @param y coordonnee de la colonne.
	  * @return la taille du bateau ou 0 si il n'y a pas de bateau dans cette case.
	*/
	public int tailleBateauEn(int x, int y)
	{
		if (!grille[x][y]) return 0;
		final int[] xoffset={ 0, 0, 1,-1};
		final int[] yoffset={ 1,-1, 0, 0};
		int xi, yi, taille = 1;
		for (int k=0; k<xoffset.length; k++) {
			xi = x + xoffset[k];
			yi = y + yoffset[k];
			while(grille[xi][yi]) {
				xi+=xoffset[k];
				yi+=yoffset[k];
				taille++;
			}
		}
		return taille;
	}
	
	public int tailleBateauEn(String position)
	{
		int[] coordonnees = convertion(position);
		return tailleBateauEn(coordonnees[0], coordonnees[1]);
	}
}
